@waiaas/mcp 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-client.d.ts +71 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +262 -0
- package/dist/api-client.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +111 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/skills.d.ts +11 -0
- package/dist/resources/skills.d.ts.map +1 -0
- package/dist/resources/skills.js +40 -0
- package/dist/resources/skills.js.map +1 -0
- package/dist/resources/system-status.d.ts +8 -0
- package/dist/resources/system-status.d.ts.map +1 -0
- package/dist/resources/system-status.js +16 -0
- package/dist/resources/system-status.js.map +1 -0
- package/dist/resources/wallet-address.d.ts +8 -0
- package/dist/resources/wallet-address.d.ts.map +1 -0
- package/dist/resources/wallet-address.js +16 -0
- package/dist/resources/wallet-address.js.map +1 -0
- package/dist/resources/wallet-balance.d.ts +8 -0
- package/dist/resources/wallet-balance.d.ts.map +1 -0
- package/dist/resources/wallet-balance.js +16 -0
- package/dist/resources/wallet-balance.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +75 -0
- package/dist/server.js.map +1 -0
- package/dist/session-manager.d.ts +102 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +472 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/tools/action-provider.d.ts +25 -0
- package/dist/tools/action-provider.d.ts.map +1 -0
- package/dist/tools/action-provider.js +61 -0
- package/dist/tools/action-provider.js.map +1 -0
- package/dist/tools/approve-token.d.ts +11 -0
- package/dist/tools/approve-token.d.ts.map +1 -0
- package/dist/tools/approve-token.js +33 -0
- package/dist/tools/approve-token.js.map +1 -0
- package/dist/tools/call-contract.d.ts +12 -0
- package/dist/tools/call-contract.d.ts.map +1 -0
- package/dist/tools/call-contract.js +45 -0
- package/dist/tools/call-contract.js.map +1 -0
- package/dist/tools/encode-calldata.d.ts +12 -0
- package/dist/tools/encode-calldata.d.ts.map +1 -0
- package/dist/tools/encode-calldata.js +25 -0
- package/dist/tools/encode-calldata.js.map +1 -0
- package/dist/tools/get-address.d.ts +8 -0
- package/dist/tools/get-address.d.ts.map +1 -0
- package/dist/tools/get-address.js +12 -0
- package/dist/tools/get-address.js.map +1 -0
- package/dist/tools/get-assets.d.ts +8 -0
- package/dist/tools/get-assets.d.ts.map +1 -0
- package/dist/tools/get-assets.js +22 -0
- package/dist/tools/get-assets.js.map +1 -0
- package/dist/tools/get-balance.d.ts +8 -0
- package/dist/tools/get-balance.d.ts.map +1 -0
- package/dist/tools/get-balance.js +22 -0
- package/dist/tools/get-balance.js.map +1 -0
- package/dist/tools/get-nonce.d.ts +8 -0
- package/dist/tools/get-nonce.d.ts.map +1 -0
- package/dist/tools/get-nonce.js +12 -0
- package/dist/tools/get-nonce.js.map +1 -0
- package/dist/tools/get-transaction.d.ts +8 -0
- package/dist/tools/get-transaction.d.ts.map +1 -0
- package/dist/tools/get-transaction.js +17 -0
- package/dist/tools/get-transaction.js.map +1 -0
- package/dist/tools/get-wallet-info.d.ts +12 -0
- package/dist/tools/get-wallet-info.d.ts.map +1 -0
- package/dist/tools/get-wallet-info.js +27 -0
- package/dist/tools/get-wallet-info.js.map +1 -0
- package/dist/tools/list-transactions.d.ts +8 -0
- package/dist/tools/list-transactions.d.ts.map +1 -0
- package/dist/tools/list-transactions.js +25 -0
- package/dist/tools/list-transactions.js.map +1 -0
- package/dist/tools/send-batch.d.ts +12 -0
- package/dist/tools/send-batch.d.ts.map +1 -0
- package/dist/tools/send-batch.js +27 -0
- package/dist/tools/send-batch.js.map +1 -0
- package/dist/tools/send-token.d.ts +12 -0
- package/dist/tools/send-token.d.ts.map +1 -0
- package/dist/tools/send-token.js +38 -0
- package/dist/tools/send-token.js.map +1 -0
- package/dist/tools/set-default-network.d.ts +10 -0
- package/dist/tools/set-default-network.d.ts.map +1 -0
- package/dist/tools/set-default-network.js +17 -0
- package/dist/tools/set-default-network.js.map +1 -0
- package/dist/tools/sign-transaction.d.ts +12 -0
- package/dist/tools/sign-transaction.d.ts.map +1 -0
- package/dist/tools/sign-transaction.js +24 -0
- package/dist/tools/sign-transaction.js.map +1 -0
- package/dist/tools/wc-connect.d.ts +11 -0
- package/dist/tools/wc-connect.d.ts.map +1 -0
- package/dist/tools/wc-connect.js +15 -0
- package/dist/tools/wc-connect.js.map +1 -0
- package/dist/tools/wc-disconnect.d.ts +11 -0
- package/dist/tools/wc-disconnect.d.ts.map +1 -0
- package/dist/tools/wc-disconnect.js +15 -0
- package/dist/tools/wc-disconnect.js.map +1 -0
- package/dist/tools/wc-status.d.ts +11 -0
- package/dist/tools/wc-status.d.ts.map +1 -0
- package/dist/tools/wc-status.js +15 -0
- package/dist/tools/wc-status.js.map +1 -0
- package/dist/tools/x402-fetch.d.ts +12 -0
- package/dist/tools/x402-fetch.d.ts.map +1 -0
- package/dist/tools/x402-fetch.js +32 -0
- package/dist/tools/x402-fetch.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ApiClient: wraps all daemon HTTP calls, gets token from SessionManager.
|
|
3
|
+
*
|
|
4
|
+
* Returns ApiResult discriminated union for every call:
|
|
5
|
+
* - { ok: true, data } for successful responses
|
|
6
|
+
* - { ok: false, error } for API errors
|
|
7
|
+
* - { ok: false, expired: true } for session expiry
|
|
8
|
+
* - { ok: false, networkError: true } for network failures
|
|
9
|
+
*
|
|
10
|
+
* CRITICAL: All logging via console.error (SMGI-D04).
|
|
11
|
+
*/
|
|
12
|
+
import type { CallToolResult, ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
|
|
13
|
+
import type { SessionManager } from './session-manager.js';
|
|
14
|
+
export type ApiResult<T> = {
|
|
15
|
+
ok: true;
|
|
16
|
+
data: T;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
error: {
|
|
20
|
+
code: string;
|
|
21
|
+
message: string;
|
|
22
|
+
retryable: boolean;
|
|
23
|
+
hint?: string;
|
|
24
|
+
};
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
expired: true;
|
|
28
|
+
message: string;
|
|
29
|
+
} | {
|
|
30
|
+
ok: false;
|
|
31
|
+
networkError: true;
|
|
32
|
+
message: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Convert ApiResult to MCP tool result format (CallToolResult).
|
|
36
|
+
*
|
|
37
|
+
* H-04: isError is ONLY set for actual API errors.
|
|
38
|
+
* session_expired and networkError do NOT set isError
|
|
39
|
+
* to prevent Claude Desktop from disconnecting.
|
|
40
|
+
*/
|
|
41
|
+
export declare function toToolResult<T>(result: ApiResult<T>): CallToolResult;
|
|
42
|
+
/**
|
|
43
|
+
* Convert ApiResult to MCP resource result format (ReadResourceResult).
|
|
44
|
+
*/
|
|
45
|
+
export declare function toResourceResult<T>(uri: string, result: ApiResult<T>): ReadResourceResult;
|
|
46
|
+
export declare class ApiClient {
|
|
47
|
+
private readonly sessionManager;
|
|
48
|
+
private readonly baseUrl;
|
|
49
|
+
constructor(sessionManager: SessionManager, baseUrl: string);
|
|
50
|
+
get<T>(path: string): Promise<ApiResult<T>>;
|
|
51
|
+
post<T>(path: string, body: unknown): Promise<ApiResult<T>>;
|
|
52
|
+
put<T>(path: string, body: unknown): Promise<ApiResult<T>>;
|
|
53
|
+
delete<T>(path: string): Promise<ApiResult<T>>;
|
|
54
|
+
/**
|
|
55
|
+
* 7-step request flow (SMGI-01):
|
|
56
|
+
* 1. Get token from sessionManager
|
|
57
|
+
* 2. If null, return expired
|
|
58
|
+
* 3. Call fetch with Bearer token + User-Agent
|
|
59
|
+
* 4. If 401, handle401 (50ms wait, re-check token)
|
|
60
|
+
* 5. If 503 + kill_switch, return kill switch result
|
|
61
|
+
* 6. If !ok, parse error body
|
|
62
|
+
* 7. If ok, return { ok: true, data }
|
|
63
|
+
* 8. On network error, return networkError
|
|
64
|
+
*/
|
|
65
|
+
private request;
|
|
66
|
+
/**
|
|
67
|
+
* 401 handler: wait 50ms (allow renewal to complete), re-check token.
|
|
68
|
+
*/
|
|
69
|
+
private handle401;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAO3D,MAAM,MAAM,SAAS,CAAC,CAAC,IACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GACrB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC1F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,YAAY,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,cAAc,CAqDpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,kBAAkB,CA0DzF;AAID,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM;IAKrD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAI3C,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAI3D,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAI1D,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAIpD;;;;;;;;;;OAUG;YACW,OAAO;IAkGrB;;OAEG;YACW,SAAS;CAUxB"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ApiClient: wraps all daemon HTTP calls, gets token from SessionManager.
|
|
3
|
+
*
|
|
4
|
+
* Returns ApiResult discriminated union for every call:
|
|
5
|
+
* - { ok: true, data } for successful responses
|
|
6
|
+
* - { ok: false, error } for API errors
|
|
7
|
+
* - { ok: false, expired: true } for session expiry
|
|
8
|
+
* - { ok: false, networkError: true } for network failures
|
|
9
|
+
*
|
|
10
|
+
* CRITICAL: All logging via console.error (SMGI-D04).
|
|
11
|
+
*/
|
|
12
|
+
const USER_AGENT = '@waiaas/mcp/0.0.0';
|
|
13
|
+
const LOG_PREFIX = '[waiaas-mcp:api]';
|
|
14
|
+
// --- Tool/Resource result helpers (SMGI-04, H-04) ---
|
|
15
|
+
/**
|
|
16
|
+
* Convert ApiResult to MCP tool result format (CallToolResult).
|
|
17
|
+
*
|
|
18
|
+
* H-04: isError is ONLY set for actual API errors.
|
|
19
|
+
* session_expired and networkError do NOT set isError
|
|
20
|
+
* to prevent Claude Desktop from disconnecting.
|
|
21
|
+
*/
|
|
22
|
+
export function toToolResult(result) {
|
|
23
|
+
if ('ok' in result && result.ok) {
|
|
24
|
+
return {
|
|
25
|
+
content: [{ type: 'text', text: JSON.stringify(result.data) }],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if ('expired' in result && result.expired) {
|
|
29
|
+
return {
|
|
30
|
+
content: [{
|
|
31
|
+
type: 'text',
|
|
32
|
+
text: JSON.stringify({
|
|
33
|
+
session_expired: true,
|
|
34
|
+
message: result.message,
|
|
35
|
+
action: 'Run waiaas mcp setup to get a new token',
|
|
36
|
+
}),
|
|
37
|
+
}],
|
|
38
|
+
// NO isError (H-04: prevents Claude Desktop from disconnecting)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if ('networkError' in result && result.networkError) {
|
|
42
|
+
return {
|
|
43
|
+
content: [{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: JSON.stringify({
|
|
46
|
+
network_error: true,
|
|
47
|
+
message: result.message,
|
|
48
|
+
}),
|
|
49
|
+
}],
|
|
50
|
+
// NO isError
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Actual API error -- isError: true
|
|
54
|
+
if ('error' in result) {
|
|
55
|
+
return {
|
|
56
|
+
content: [{
|
|
57
|
+
type: 'text',
|
|
58
|
+
text: JSON.stringify({
|
|
59
|
+
error: true,
|
|
60
|
+
...result.error,
|
|
61
|
+
}),
|
|
62
|
+
}],
|
|
63
|
+
isError: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Should never happen -- fallback
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: 'text', text: JSON.stringify({ error: true, message: 'Unknown error' }) }],
|
|
69
|
+
isError: true,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Convert ApiResult to MCP resource result format (ReadResourceResult).
|
|
74
|
+
*/
|
|
75
|
+
export function toResourceResult(uri, result) {
|
|
76
|
+
if ('ok' in result && result.ok) {
|
|
77
|
+
return {
|
|
78
|
+
contents: [{
|
|
79
|
+
uri,
|
|
80
|
+
text: JSON.stringify(result.data),
|
|
81
|
+
mimeType: 'application/json',
|
|
82
|
+
}],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if ('expired' in result && result.expired) {
|
|
86
|
+
return {
|
|
87
|
+
contents: [{
|
|
88
|
+
uri,
|
|
89
|
+
text: JSON.stringify({
|
|
90
|
+
session_expired: true,
|
|
91
|
+
message: result.message,
|
|
92
|
+
action: 'Run waiaas mcp setup to get a new token',
|
|
93
|
+
}),
|
|
94
|
+
mimeType: 'application/json',
|
|
95
|
+
}],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if ('networkError' in result && result.networkError) {
|
|
99
|
+
return {
|
|
100
|
+
contents: [{
|
|
101
|
+
uri,
|
|
102
|
+
text: JSON.stringify({
|
|
103
|
+
network_error: true,
|
|
104
|
+
message: result.message,
|
|
105
|
+
}),
|
|
106
|
+
mimeType: 'application/json',
|
|
107
|
+
}],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if ('error' in result) {
|
|
111
|
+
return {
|
|
112
|
+
contents: [{
|
|
113
|
+
uri,
|
|
114
|
+
text: JSON.stringify({
|
|
115
|
+
error: true,
|
|
116
|
+
...result.error,
|
|
117
|
+
}),
|
|
118
|
+
mimeType: 'application/json',
|
|
119
|
+
}],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
contents: [{
|
|
124
|
+
uri,
|
|
125
|
+
text: JSON.stringify({ error: true, message: 'Unknown error' }),
|
|
126
|
+
mimeType: 'application/json',
|
|
127
|
+
}],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// --- ApiClient ---
|
|
131
|
+
export class ApiClient {
|
|
132
|
+
sessionManager;
|
|
133
|
+
baseUrl;
|
|
134
|
+
constructor(sessionManager, baseUrl) {
|
|
135
|
+
this.sessionManager = sessionManager;
|
|
136
|
+
this.baseUrl = baseUrl.replace(/\/+$/, '');
|
|
137
|
+
}
|
|
138
|
+
async get(path) {
|
|
139
|
+
return this.request('GET', path);
|
|
140
|
+
}
|
|
141
|
+
async post(path, body) {
|
|
142
|
+
return this.request('POST', path, body);
|
|
143
|
+
}
|
|
144
|
+
async put(path, body) {
|
|
145
|
+
return this.request('PUT', path, body);
|
|
146
|
+
}
|
|
147
|
+
async delete(path) {
|
|
148
|
+
return this.request('DELETE', path);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 7-step request flow (SMGI-01):
|
|
152
|
+
* 1. Get token from sessionManager
|
|
153
|
+
* 2. If null, return expired
|
|
154
|
+
* 3. Call fetch with Bearer token + User-Agent
|
|
155
|
+
* 4. If 401, handle401 (50ms wait, re-check token)
|
|
156
|
+
* 5. If 503 + kill_switch, return kill switch result
|
|
157
|
+
* 6. If !ok, parse error body
|
|
158
|
+
* 7. If ok, return { ok: true, data }
|
|
159
|
+
* 8. On network error, return networkError
|
|
160
|
+
*/
|
|
161
|
+
async request(method, path, body) {
|
|
162
|
+
// Step 1-2: Get token
|
|
163
|
+
const token = this.sessionManager.getToken();
|
|
164
|
+
if (!token) {
|
|
165
|
+
return { ok: false, expired: true, message: 'Session token not available' };
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
const url = `${this.baseUrl}${path}`;
|
|
169
|
+
const headers = {
|
|
170
|
+
'Content-Type': 'application/json',
|
|
171
|
+
'Authorization': `Bearer ${token}`,
|
|
172
|
+
'User-Agent': USER_AGENT,
|
|
173
|
+
};
|
|
174
|
+
// Step 3: Call fetch
|
|
175
|
+
const res = await fetch(url, {
|
|
176
|
+
method,
|
|
177
|
+
headers,
|
|
178
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
179
|
+
});
|
|
180
|
+
// Step 4: Handle 401
|
|
181
|
+
if (res.status === 401) {
|
|
182
|
+
return this.handle401();
|
|
183
|
+
}
|
|
184
|
+
// Step 5: Handle 503 kill switch
|
|
185
|
+
if (res.status === 503) {
|
|
186
|
+
const errBody = await res.json().catch(() => null);
|
|
187
|
+
if (errBody?.['code'] === 'KILL_SWITCH_ACTIVE') {
|
|
188
|
+
return {
|
|
189
|
+
ok: false,
|
|
190
|
+
error: {
|
|
191
|
+
code: 'KILL_SWITCH_ACTIVE',
|
|
192
|
+
message: typeof errBody['message'] === 'string'
|
|
193
|
+
? errBody['message']
|
|
194
|
+
: 'Kill switch is active',
|
|
195
|
+
retryable: false,
|
|
196
|
+
hint: typeof errBody['hint'] === 'string' ? errBody['hint'] : undefined,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
ok: false,
|
|
202
|
+
error: {
|
|
203
|
+
code: typeof errBody?.['code'] === 'string' ? errBody['code'] : `HTTP_503`,
|
|
204
|
+
message: typeof errBody?.['message'] === 'string'
|
|
205
|
+
? errBody['message']
|
|
206
|
+
: 'Service unavailable',
|
|
207
|
+
retryable: true,
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// Step 6: Handle other errors
|
|
212
|
+
if (!res.ok) {
|
|
213
|
+
const errBody = await res.json().catch(() => null);
|
|
214
|
+
return {
|
|
215
|
+
ok: false,
|
|
216
|
+
error: {
|
|
217
|
+
code: typeof errBody?.['code'] === 'string' ? errBody['code'] : `HTTP_${res.status}`,
|
|
218
|
+
message: typeof errBody?.['message'] === 'string'
|
|
219
|
+
? errBody['message']
|
|
220
|
+
: `Request failed with status ${res.status}`,
|
|
221
|
+
retryable: res.status >= 500,
|
|
222
|
+
hint: typeof errBody?.['hint'] === 'string' ? errBody['hint'] : undefined,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
// Step 7: Success
|
|
227
|
+
const data = await res.json();
|
|
228
|
+
return { ok: true, data };
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
// Step 8: Network error
|
|
232
|
+
if (err instanceof TypeError) {
|
|
233
|
+
console.error(`${LOG_PREFIX} Network error: ${err.message}`);
|
|
234
|
+
return {
|
|
235
|
+
ok: false,
|
|
236
|
+
networkError: true,
|
|
237
|
+
message: err.message,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
console.error(`${LOG_PREFIX} Unexpected error: ${err instanceof Error ? err.message : String(err)}`);
|
|
241
|
+
return {
|
|
242
|
+
ok: false,
|
|
243
|
+
networkError: true,
|
|
244
|
+
message: err instanceof Error ? err.message : 'Unknown error',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* 401 handler: wait 50ms (allow renewal to complete), re-check token.
|
|
250
|
+
*/
|
|
251
|
+
async handle401() {
|
|
252
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
253
|
+
const newToken = this.sessionManager.getToken();
|
|
254
|
+
if (!newToken) {
|
|
255
|
+
return { ok: false, expired: true, message: 'Session expired (401)' };
|
|
256
|
+
}
|
|
257
|
+
// Token was renewed during wait -- caller should retry
|
|
258
|
+
// But since we don't retry in MCP context, return expired
|
|
259
|
+
return { ok: false, expired: true, message: 'Session expired (401)' };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @waiaas/mcp entrypoint.
|
|
4
|
+
*
|
|
5
|
+
* Starts MCP server on stdio transport.
|
|
6
|
+
* Connects to WAIaaS daemon via SessionManager + ApiClient.
|
|
7
|
+
*
|
|
8
|
+
* CRITICAL: All logging via console.error (SMGI-D04).
|
|
9
|
+
* stdout is reserved for stdio JSON-RPC transport.
|
|
10
|
+
*
|
|
11
|
+
* Degraded mode (SMGI-03): if SessionManager fails to load token,
|
|
12
|
+
* server still starts -- tools return session_expired message.
|
|
13
|
+
*
|
|
14
|
+
* Graceful shutdown (BUG-020):
|
|
15
|
+
* - stdin end/close detection for client disconnect (MCPS-01)
|
|
16
|
+
* - SIGTERM/SIGINT with 3s force-exit timeout (MCPS-02)
|
|
17
|
+
* - Idempotent shutdown -- multiple calls safe (MCPS-03)
|
|
18
|
+
*/
|
|
19
|
+
export interface ShutdownDeps {
|
|
20
|
+
sessionManager: {
|
|
21
|
+
dispose(): void;
|
|
22
|
+
};
|
|
23
|
+
server: {
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
};
|
|
26
|
+
exit?: (code: number) => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create an idempotent shutdown handler with force-exit timeout.
|
|
30
|
+
* MCPS-02: 3s timeout for graceful shutdown.
|
|
31
|
+
* MCPS-03: Multiple calls are safe (once guard).
|
|
32
|
+
*/
|
|
33
|
+
export declare function createShutdownHandler(deps: ShutdownDeps, opts?: {
|
|
34
|
+
forceTimeoutMs?: number;
|
|
35
|
+
}): () => void;
|
|
36
|
+
/**
|
|
37
|
+
* Register stdin close + signal handlers for graceful shutdown.
|
|
38
|
+
* MCPS-01: stdin end/close -> shutdown within 5s.
|
|
39
|
+
* MCPS-02: SIGTERM -> shutdown with 3s force timeout.
|
|
40
|
+
*/
|
|
41
|
+
export declare function registerShutdownListeners(shutdown: () => void): void;
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;GAgBG;AAgBH,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE;QAAE,OAAO,IAAI,IAAI,CAAA;KAAE,CAAC;IACpC,MAAM,EAAE;QAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,GAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC,MAAM,IAAI,CAiBZ;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAiBpE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @waiaas/mcp entrypoint.
|
|
4
|
+
*
|
|
5
|
+
* Starts MCP server on stdio transport.
|
|
6
|
+
* Connects to WAIaaS daemon via SessionManager + ApiClient.
|
|
7
|
+
*
|
|
8
|
+
* CRITICAL: All logging via console.error (SMGI-D04).
|
|
9
|
+
* stdout is reserved for stdio JSON-RPC transport.
|
|
10
|
+
*
|
|
11
|
+
* Degraded mode (SMGI-03): if SessionManager fails to load token,
|
|
12
|
+
* server still starts -- tools return session_expired message.
|
|
13
|
+
*
|
|
14
|
+
* Graceful shutdown (BUG-020):
|
|
15
|
+
* - stdin end/close detection for client disconnect (MCPS-01)
|
|
16
|
+
* - SIGTERM/SIGINT with 3s force-exit timeout (MCPS-02)
|
|
17
|
+
* - Idempotent shutdown -- multiple calls safe (MCPS-03)
|
|
18
|
+
*/
|
|
19
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
20
|
+
import { createMcpServer } from './server.js';
|
|
21
|
+
import { SessionManager } from './session-manager.js';
|
|
22
|
+
import { ApiClient } from './api-client.js';
|
|
23
|
+
import { registerActionProviderTools } from './tools/action-provider.js';
|
|
24
|
+
const BASE_URL = process.env['WAIAAS_BASE_URL'] ?? 'http://127.0.0.1:3100';
|
|
25
|
+
const DATA_DIR = process.env['WAIAAS_DATA_DIR'];
|
|
26
|
+
const ENV_TOKEN = process.env['WAIAAS_SESSION_TOKEN'];
|
|
27
|
+
const WALLET_ID = process.env['WAIAAS_WALLET_ID'];
|
|
28
|
+
const WALLET_NAME = process.env['WAIAAS_WALLET_NAME'];
|
|
29
|
+
/**
|
|
30
|
+
* Create an idempotent shutdown handler with force-exit timeout.
|
|
31
|
+
* MCPS-02: 3s timeout for graceful shutdown.
|
|
32
|
+
* MCPS-03: Multiple calls are safe (once guard).
|
|
33
|
+
*/
|
|
34
|
+
export function createShutdownHandler(deps, opts = {}) {
|
|
35
|
+
const forceTimeout = opts.forceTimeoutMs ?? 3_000;
|
|
36
|
+
const exitFn = deps.exit ?? process.exit;
|
|
37
|
+
let shuttingDown = false;
|
|
38
|
+
return () => {
|
|
39
|
+
if (shuttingDown)
|
|
40
|
+
return; // MCPS-03: idempotent
|
|
41
|
+
shuttingDown = true;
|
|
42
|
+
console.error('[waiaas-mcp] shutting down');
|
|
43
|
+
deps.sessionManager.dispose();
|
|
44
|
+
void deps.server.close();
|
|
45
|
+
// MCPS-02: force exit after timeout
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
console.error('[waiaas-mcp] force exit after timeout');
|
|
48
|
+
exitFn(0);
|
|
49
|
+
}, forceTimeout).unref();
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Register stdin close + signal handlers for graceful shutdown.
|
|
54
|
+
* MCPS-01: stdin end/close -> shutdown within 5s.
|
|
55
|
+
* MCPS-02: SIGTERM -> shutdown with 3s force timeout.
|
|
56
|
+
*/
|
|
57
|
+
export function registerShutdownListeners(shutdown) {
|
|
58
|
+
process.stdin.on('end', () => {
|
|
59
|
+
console.error('[waiaas-mcp] stdin closed (client disconnected), shutting down');
|
|
60
|
+
shutdown();
|
|
61
|
+
});
|
|
62
|
+
// 'close' fires after 'end' in some edge cases (e.g., pipe broken)
|
|
63
|
+
process.stdin.on('close', () => {
|
|
64
|
+
console.error('[waiaas-mcp] stdin close event, shutting down');
|
|
65
|
+
shutdown();
|
|
66
|
+
});
|
|
67
|
+
process.on('SIGTERM', () => {
|
|
68
|
+
console.error('[waiaas-mcp] SIGTERM received');
|
|
69
|
+
shutdown();
|
|
70
|
+
});
|
|
71
|
+
process.on('SIGINT', () => {
|
|
72
|
+
shutdown();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// --- Main ---
|
|
76
|
+
async function main() {
|
|
77
|
+
if (WALLET_NAME) {
|
|
78
|
+
console.error(`[waiaas-mcp] Wallet: ${WALLET_NAME} (id: ${WALLET_ID ?? 'default'})`);
|
|
79
|
+
}
|
|
80
|
+
const sessionManager = new SessionManager({
|
|
81
|
+
baseUrl: BASE_URL,
|
|
82
|
+
dataDir: DATA_DIR,
|
|
83
|
+
envToken: ENV_TOKEN,
|
|
84
|
+
walletId: WALLET_ID,
|
|
85
|
+
});
|
|
86
|
+
const apiClient = new ApiClient(sessionManager, BASE_URL);
|
|
87
|
+
const server = createMcpServer(apiClient, { walletName: WALLET_NAME });
|
|
88
|
+
const transport = new StdioServerTransport();
|
|
89
|
+
// Register shutdown handlers BEFORE server.connect.
|
|
90
|
+
// stdin may close immediately if client exits during startup.
|
|
91
|
+
const shutdown = createShutdownHandler({ sessionManager, server });
|
|
92
|
+
registerShutdownListeners(shutdown);
|
|
93
|
+
// Connect transport FIRST so stdio JSON-RPC responds to initialize immediately.
|
|
94
|
+
// sessionManager.start() involves disk I/O that can delay under load (BUG-011).
|
|
95
|
+
// If a tool call arrives before start() completes, degraded mode handles it (SMGI-03).
|
|
96
|
+
await server.connect(transport);
|
|
97
|
+
console.error('[waiaas-mcp] Server started on stdio transport');
|
|
98
|
+
await sessionManager.start();
|
|
99
|
+
// Register action provider tools (async, failure = degraded mode).
|
|
100
|
+
// Must be after sessionManager.start() so API calls have valid token.
|
|
101
|
+
// server.tool() after connect() automatically fires sendToolListChanged().
|
|
102
|
+
registerActionProviderTools(server, apiClient, { walletName: WALLET_NAME })
|
|
103
|
+
.catch((err) => {
|
|
104
|
+
console.error('[waiaas-mcp] Action provider tool registration failed:', err instanceof Error ? err.message : String(err));
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
main().catch((err) => {
|
|
108
|
+
console.error('[waiaas-mcp] Fatal error:', err);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
});
|
|
111
|
+
//# 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,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* waiaas://skills/{name} resource template: WAIaaS API skill reference files.
|
|
3
|
+
*
|
|
4
|
+
* Exposes 7 skill files (quickstart, wallet, transactions, policies, admin, actions, x402)
|
|
5
|
+
* as MCP resources that AI agents can read for in-context API reference.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { type ApiClient } from '../api-client.js';
|
|
9
|
+
import { type WalletContext } from '../server.js';
|
|
10
|
+
export declare function registerSkillResources(server: McpServer, apiClient: ApiClient, walletContext?: WalletContext): void;
|
|
11
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/resources/skills.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,KAAK,aAAa,EAAoB,MAAM,cAAc,CAAC;AAIpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAoCnH"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* waiaas://skills/{name} resource template: WAIaaS API skill reference files.
|
|
3
|
+
*
|
|
4
|
+
* Exposes 7 skill files (quickstart, wallet, transactions, policies, admin, actions, x402)
|
|
5
|
+
* as MCP resources that AI agents can read for in-context API reference.
|
|
6
|
+
*/
|
|
7
|
+
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { toResourceResult } from '../api-client.js';
|
|
9
|
+
import { withWalletPrefix } from '../server.js';
|
|
10
|
+
const SKILL_NAMES = ['quickstart', 'wallet', 'transactions', 'policies', 'admin', 'actions', 'x402'];
|
|
11
|
+
export function registerSkillResources(server, apiClient, walletContext) {
|
|
12
|
+
const skillTemplate = new ResourceTemplate('waiaas://skills/{name}', {
|
|
13
|
+
list: async () => ({
|
|
14
|
+
resources: SKILL_NAMES.map((name) => ({
|
|
15
|
+
uri: `waiaas://skills/${name}`,
|
|
16
|
+
name: `${name} skill`,
|
|
17
|
+
description: withWalletPrefix(`API reference: ${name}`, walletContext?.walletName),
|
|
18
|
+
mimeType: 'text/markdown',
|
|
19
|
+
})),
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
22
|
+
server.resource('API Skills', skillTemplate, {
|
|
23
|
+
description: withWalletPrefix('WAIaaS API skill reference files', walletContext?.walletName),
|
|
24
|
+
mimeType: 'text/markdown',
|
|
25
|
+
}, async (uri, variables) => {
|
|
26
|
+
const name = variables.name;
|
|
27
|
+
const result = await apiClient.get(`/v1/skills/${name}`);
|
|
28
|
+
if (result.ok) {
|
|
29
|
+
return {
|
|
30
|
+
contents: [{
|
|
31
|
+
uri: uri.href,
|
|
32
|
+
text: result.data.content,
|
|
33
|
+
mimeType: 'text/markdown',
|
|
34
|
+
}],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return toResourceResult(uri.href, result);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/resources/skills.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAE3E,OAAO,EAAkB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAsB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAU,CAAC;AAE9G,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,SAAoB,EAAE,aAA6B;IAC3G,MAAM,aAAa,GAAG,IAAI,gBAAgB,CAAC,wBAAwB,EAAE;QACnE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjB,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpC,GAAG,EAAE,mBAAmB,IAAI,EAAE;gBAC9B,IAAI,EAAE,GAAG,IAAI,QAAQ;gBACrB,WAAW,EAAE,gBAAgB,CAAC,kBAAkB,IAAI,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC;gBAClF,QAAQ,EAAE,eAAe;aAC1B,CAAC,CAAC;SACJ,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,CACb,YAAY,EACZ,aAAa,EACb;QACE,WAAW,EAAE,gBAAgB,CAAC,kCAAkC,EAAE,aAAa,EAAE,UAAU,CAAC;QAC5F,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAc,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAoC,cAAc,IAAI,EAAE,CAAC,CAAC;QAE5F,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;wBACzB,QAAQ,EAAE,eAAe;qBAC1B,CAAC;aACH,CAAC;QACJ,CAAC;QAED,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* waiaas://system/status resource: WAIaaS daemon system status.
|
|
3
|
+
*/
|
|
4
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { type ApiClient } from '../api-client.js';
|
|
6
|
+
import { type WalletContext } from '../server.js';
|
|
7
|
+
export declare function registerSystemStatus(server: McpServer, apiClient: ApiClient, walletContext?: WalletContext): void;
|
|
8
|
+
//# sourceMappingURL=system-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-status.d.ts","sourceRoot":"","sources":["../../src/resources/system-status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,KAAK,aAAa,EAAoB,MAAM,cAAc,CAAC;AAIpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAajH"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* waiaas://system/status resource: WAIaaS daemon system status.
|
|
3
|
+
*/
|
|
4
|
+
import { toResourceResult } from '../api-client.js';
|
|
5
|
+
import { withWalletPrefix } from '../server.js';
|
|
6
|
+
const RESOURCE_URI = 'waiaas://system/status';
|
|
7
|
+
export function registerSystemStatus(server, apiClient, walletContext) {
|
|
8
|
+
server.resource('System Status', RESOURCE_URI, {
|
|
9
|
+
description: withWalletPrefix('WAIaaS daemon system status', walletContext?.walletName),
|
|
10
|
+
mimeType: 'application/json',
|
|
11
|
+
}, async () => {
|
|
12
|
+
const result = await apiClient.get('/v1/admin/status');
|
|
13
|
+
return toResourceResult(RESOURCE_URI, result);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=system-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-status.js","sourceRoot":"","sources":["../../src/resources/system-status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAkB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAsB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAE9C,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAoB,EAAE,aAA6B;IACzG,MAAM,CAAC,QAAQ,CACb,eAAe,EACf,YAAY,EACZ;QACE,WAAW,EAAE,gBAAgB,CAAC,6BAA6B,EAAE,aAAa,EAAE,UAAU,CAAC;QACvF,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACvD,OAAO,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* waiaas://wallet/address resource: Public address of the wallet.
|
|
3
|
+
*/
|
|
4
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { type ApiClient } from '../api-client.js';
|
|
6
|
+
import { type WalletContext } from '../server.js';
|
|
7
|
+
export declare function registerWalletAddress(server: McpServer, apiClient: ApiClient, walletContext?: WalletContext): void;
|
|
8
|
+
//# sourceMappingURL=wallet-address.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-address.d.ts","sourceRoot":"","sources":["../../src/resources/wallet-address.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,KAAK,aAAa,EAAoB,MAAM,cAAc,CAAC;AAIpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAalH"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* waiaas://wallet/address resource: Public address of the wallet.
|
|
3
|
+
*/
|
|
4
|
+
import { toResourceResult } from '../api-client.js';
|
|
5
|
+
import { withWalletPrefix } from '../server.js';
|
|
6
|
+
const RESOURCE_URI = 'waiaas://wallet/address';
|
|
7
|
+
export function registerWalletAddress(server, apiClient, walletContext) {
|
|
8
|
+
server.resource('Wallet Address', RESOURCE_URI, {
|
|
9
|
+
description: withWalletPrefix('Public address of the wallet', walletContext?.walletName),
|
|
10
|
+
mimeType: 'application/json',
|
|
11
|
+
}, async () => {
|
|
12
|
+
const result = await apiClient.get('/v1/wallet/address');
|
|
13
|
+
return toResourceResult(RESOURCE_URI, result);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=wallet-address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-address.js","sourceRoot":"","sources":["../../src/resources/wallet-address.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAkB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAsB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,SAAoB,EAAE,aAA6B;IAC1G,MAAM,CAAC,QAAQ,CACb,gBAAgB,EAChB,YAAY,EACZ;QACE,WAAW,EAAE,gBAAgB,CAAC,8BAA8B,EAAE,aAAa,EAAE,UAAU,CAAC;QACxF,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACzD,OAAO,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC,CACF,CAAC;AACJ,CAAC"}
|