@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.
Files changed (109) hide show
  1. package/dist/api-client.d.ts +71 -0
  2. package/dist/api-client.d.ts.map +1 -0
  3. package/dist/api-client.js +262 -0
  4. package/dist/api-client.js.map +1 -0
  5. package/dist/index.d.ts +42 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +111 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/resources/skills.d.ts +11 -0
  10. package/dist/resources/skills.d.ts.map +1 -0
  11. package/dist/resources/skills.js +40 -0
  12. package/dist/resources/skills.js.map +1 -0
  13. package/dist/resources/system-status.d.ts +8 -0
  14. package/dist/resources/system-status.d.ts.map +1 -0
  15. package/dist/resources/system-status.js +16 -0
  16. package/dist/resources/system-status.js.map +1 -0
  17. package/dist/resources/wallet-address.d.ts +8 -0
  18. package/dist/resources/wallet-address.d.ts.map +1 -0
  19. package/dist/resources/wallet-address.js +16 -0
  20. package/dist/resources/wallet-address.js.map +1 -0
  21. package/dist/resources/wallet-balance.d.ts +8 -0
  22. package/dist/resources/wallet-balance.d.ts.map +1 -0
  23. package/dist/resources/wallet-balance.js +16 -0
  24. package/dist/resources/wallet-balance.js.map +1 -0
  25. package/dist/server.d.ts +20 -0
  26. package/dist/server.d.ts.map +1 -0
  27. package/dist/server.js +75 -0
  28. package/dist/server.js.map +1 -0
  29. package/dist/session-manager.d.ts +102 -0
  30. package/dist/session-manager.d.ts.map +1 -0
  31. package/dist/session-manager.js +472 -0
  32. package/dist/session-manager.js.map +1 -0
  33. package/dist/tools/action-provider.d.ts +25 -0
  34. package/dist/tools/action-provider.d.ts.map +1 -0
  35. package/dist/tools/action-provider.js +61 -0
  36. package/dist/tools/action-provider.js.map +1 -0
  37. package/dist/tools/approve-token.d.ts +11 -0
  38. package/dist/tools/approve-token.d.ts.map +1 -0
  39. package/dist/tools/approve-token.js +33 -0
  40. package/dist/tools/approve-token.js.map +1 -0
  41. package/dist/tools/call-contract.d.ts +12 -0
  42. package/dist/tools/call-contract.d.ts.map +1 -0
  43. package/dist/tools/call-contract.js +45 -0
  44. package/dist/tools/call-contract.js.map +1 -0
  45. package/dist/tools/encode-calldata.d.ts +12 -0
  46. package/dist/tools/encode-calldata.d.ts.map +1 -0
  47. package/dist/tools/encode-calldata.js +25 -0
  48. package/dist/tools/encode-calldata.js.map +1 -0
  49. package/dist/tools/get-address.d.ts +8 -0
  50. package/dist/tools/get-address.d.ts.map +1 -0
  51. package/dist/tools/get-address.js +12 -0
  52. package/dist/tools/get-address.js.map +1 -0
  53. package/dist/tools/get-assets.d.ts +8 -0
  54. package/dist/tools/get-assets.d.ts.map +1 -0
  55. package/dist/tools/get-assets.js +22 -0
  56. package/dist/tools/get-assets.js.map +1 -0
  57. package/dist/tools/get-balance.d.ts +8 -0
  58. package/dist/tools/get-balance.d.ts.map +1 -0
  59. package/dist/tools/get-balance.js +22 -0
  60. package/dist/tools/get-balance.js.map +1 -0
  61. package/dist/tools/get-nonce.d.ts +8 -0
  62. package/dist/tools/get-nonce.d.ts.map +1 -0
  63. package/dist/tools/get-nonce.js +12 -0
  64. package/dist/tools/get-nonce.js.map +1 -0
  65. package/dist/tools/get-transaction.d.ts +8 -0
  66. package/dist/tools/get-transaction.d.ts.map +1 -0
  67. package/dist/tools/get-transaction.js +17 -0
  68. package/dist/tools/get-transaction.js.map +1 -0
  69. package/dist/tools/get-wallet-info.d.ts +12 -0
  70. package/dist/tools/get-wallet-info.d.ts.map +1 -0
  71. package/dist/tools/get-wallet-info.js +27 -0
  72. package/dist/tools/get-wallet-info.js.map +1 -0
  73. package/dist/tools/list-transactions.d.ts +8 -0
  74. package/dist/tools/list-transactions.d.ts.map +1 -0
  75. package/dist/tools/list-transactions.js +25 -0
  76. package/dist/tools/list-transactions.js.map +1 -0
  77. package/dist/tools/send-batch.d.ts +12 -0
  78. package/dist/tools/send-batch.d.ts.map +1 -0
  79. package/dist/tools/send-batch.js +27 -0
  80. package/dist/tools/send-batch.js.map +1 -0
  81. package/dist/tools/send-token.d.ts +12 -0
  82. package/dist/tools/send-token.d.ts.map +1 -0
  83. package/dist/tools/send-token.js +38 -0
  84. package/dist/tools/send-token.js.map +1 -0
  85. package/dist/tools/set-default-network.d.ts +10 -0
  86. package/dist/tools/set-default-network.d.ts.map +1 -0
  87. package/dist/tools/set-default-network.js +17 -0
  88. package/dist/tools/set-default-network.js.map +1 -0
  89. package/dist/tools/sign-transaction.d.ts +12 -0
  90. package/dist/tools/sign-transaction.d.ts.map +1 -0
  91. package/dist/tools/sign-transaction.js +24 -0
  92. package/dist/tools/sign-transaction.js.map +1 -0
  93. package/dist/tools/wc-connect.d.ts +11 -0
  94. package/dist/tools/wc-connect.d.ts.map +1 -0
  95. package/dist/tools/wc-connect.js +15 -0
  96. package/dist/tools/wc-connect.js.map +1 -0
  97. package/dist/tools/wc-disconnect.d.ts +11 -0
  98. package/dist/tools/wc-disconnect.d.ts.map +1 -0
  99. package/dist/tools/wc-disconnect.js +15 -0
  100. package/dist/tools/wc-disconnect.js.map +1 -0
  101. package/dist/tools/wc-status.d.ts +11 -0
  102. package/dist/tools/wc-status.d.ts.map +1 -0
  103. package/dist/tools/wc-status.js +15 -0
  104. package/dist/tools/wc-status.js.map +1 -0
  105. package/dist/tools/x402-fetch.d.ts +12 -0
  106. package/dist/tools/x402-fetch.d.ts.map +1 -0
  107. package/dist/tools/x402-fetch.js +32 -0
  108. package/dist/tools/x402-fetch.js.map +1 -0
  109. 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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"}
@@ -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"}