@almanak/mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,97 @@
1
+ /**
2
+ * HTTP client for the Almanak platform REST API.
3
+ */
4
+ export interface PlatformClientConfig {
5
+ baseUrl: string;
6
+ token: string;
7
+ secretKey?: string;
8
+ hasuraUrl?: string;
9
+ timeout?: number;
10
+ }
11
+ export declare class PlatformClient {
12
+ private baseUrl;
13
+ private token;
14
+ private secretKey;
15
+ private hasuraUrl;
16
+ private timeout;
17
+ /** Encode a user-supplied value for safe use in a URL path segment. */
18
+ private seg;
19
+ constructor(config: PlatformClientConfig);
20
+ deployAgent(body: {
21
+ agent_name: string;
22
+ github_strategy_link_id: string;
23
+ github_ref: string;
24
+ github_ref_type: 'branch' | 'tag' | 'commit';
25
+ wallet_id: string;
26
+ config_overrides?: Record<string, unknown>;
27
+ }): Promise<any>;
28
+ getAgentState(agentId: string): Promise<any>;
29
+ pauseAgent(agentId: string): Promise<any>;
30
+ resumeAgent(agentId: string): Promise<any>;
31
+ stopAgent(agentId: string): Promise<any>;
32
+ emergencyStopAgent(agentId: string): Promise<any>;
33
+ terminateAgent(agentId: string): Promise<any>;
34
+ restartAgent(agentId: string): Promise<any>;
35
+ redeployAgent(agentId: string): Promise<any>;
36
+ closeAgent(agentId: string): Promise<any>;
37
+ getAgentLogs(body: {
38
+ agentId: string;
39
+ navigationMode: string;
40
+ pageSize?: number;
41
+ targetTimestamp?: string;
42
+ }): Promise<any>;
43
+ getAgentPnl(agentId: string): Promise<any>;
44
+ getAgentTransactions(body: {
45
+ agentId: string;
46
+ page?: number;
47
+ offset?: number;
48
+ sort?: 'asc' | 'desc';
49
+ }): Promise<any>;
50
+ listWalletBalances(): Promise<any>;
51
+ getWalletPositions(address: string, chainId: string): Promise<any>;
52
+ verifyEoaRole(body: {
53
+ smart_wallet_id: string;
54
+ eoa_address: string;
55
+ role: string;
56
+ }): Promise<any>;
57
+ listStrategies(): Promise<any>;
58
+ linkStrategy(body: {
59
+ displayName: string;
60
+ repoOwner: string;
61
+ repoName: string;
62
+ }): Promise<any>;
63
+ listRepositories(): Promise<any>;
64
+ getStrategy(id: string): Promise<any>;
65
+ getStrategyRefMetadata(id: string, ref: string): Promise<any>;
66
+ validateRepository(owner: string, repo: string, ref?: string): Promise<any>;
67
+ getStrategySyncStatus(id: string): Promise<any>;
68
+ getAgentSyncStatus(id: string): Promise<any>;
69
+ listBranches(owner: string, repo: string): Promise<any>;
70
+ listTags(owner: string, repo: string): Promise<any>;
71
+ listCommits(owner: string, repo: string, sha?: string): Promise<any>;
72
+ getSignals(filters?: {
73
+ type?: string;
74
+ chain?: string;
75
+ minAlphaScore?: number;
76
+ search?: string;
77
+ sortBy?: string;
78
+ limit?: number;
79
+ offset?: number;
80
+ }): Promise<any>;
81
+ getSignalById(id: string): Promise<any>;
82
+ getSignalOutcome(signalId: string): Promise<any>;
83
+ getSignalStats(): Promise<any>;
84
+ getYields(filters?: {
85
+ chain?: string;
86
+ assetGroup?: string;
87
+ opportunityType?: string;
88
+ minApy?: number;
89
+ sortBy?: string;
90
+ limit?: number;
91
+ offset?: number;
92
+ search?: string;
93
+ }): Promise<any>;
94
+ getYieldStats(): Promise<any>;
95
+ private graphql;
96
+ private request;
97
+ }
package/dist/client.js ADDED
@@ -0,0 +1,399 @@
1
+ "use strict";
2
+ /**
3
+ * HTTP client for the Almanak platform REST API.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.PlatformClient = void 0;
40
+ const https = __importStar(require("https"));
41
+ const http = __importStar(require("http"));
42
+ const url_1 = require("url");
43
+ class PlatformClient {
44
+ /** Encode a user-supplied value for safe use in a URL path segment. */
45
+ seg(value) {
46
+ return encodeURIComponent(value);
47
+ }
48
+ constructor(config) {
49
+ var _a, _b, _c;
50
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
51
+ this.token = config.token;
52
+ this.secretKey = (_a = config.secretKey) !== null && _a !== void 0 ? _a : '';
53
+ this.hasuraUrl = (_b = config.hasuraUrl) !== null && _b !== void 0 ? _b : '';
54
+ this.timeout = (_c = config.timeout) !== null && _c !== void 0 ? _c : 30000;
55
+ }
56
+ // ─── V2 Agent endpoints ─────────────────────────────────────────
57
+ async deployAgent(body) {
58
+ return this.request({ method: 'POST', path: '/v2/agent/deploy', body });
59
+ }
60
+ async getAgentState(agentId) {
61
+ return this.request({ method: 'GET', path: `/v2/agent/${this.seg(agentId)}/state` });
62
+ }
63
+ async pauseAgent(agentId) {
64
+ return this.request({ method: 'POST', path: '/v2/agent/pause', body: { agentId } });
65
+ }
66
+ async resumeAgent(agentId) {
67
+ return this.request({ method: 'POST', path: '/v2/agent/resume', body: { agentId } });
68
+ }
69
+ async stopAgent(agentId) {
70
+ return this.request({ method: 'POST', path: '/v2/agent/stop', body: { agentId } });
71
+ }
72
+ async emergencyStopAgent(agentId) {
73
+ return this.request({ method: 'POST', path: '/v2/agent/emergency-stop', body: { agentId } });
74
+ }
75
+ async terminateAgent(agentId) {
76
+ return this.request({ method: 'POST', path: '/v2/agent/terminate', body: { agentId } });
77
+ }
78
+ async restartAgent(agentId) {
79
+ return this.request({ method: 'POST', path: '/v2/agent/restart', body: { agentId } });
80
+ }
81
+ async redeployAgent(agentId) {
82
+ return this.request({ method: 'POST', path: '/v2/agent/redeploy', body: { agentId } });
83
+ }
84
+ async closeAgent(agentId) {
85
+ return this.request({ method: 'POST', path: '/v2/agent/close', body: { agentId } });
86
+ }
87
+ // ─── Agent logs & metrics ───────────────────────────────────────
88
+ async getAgentLogs(body) {
89
+ return this.request({ method: 'POST', path: '/agent/logs', body, requiresSecret: true });
90
+ }
91
+ async getAgentPnl(agentId) {
92
+ return this.request({ method: 'POST', path: '/agent/pnl', body: { agentId }, requiresSecret: true });
93
+ }
94
+ async getAgentTransactions(body) {
95
+ return this.request({ method: 'POST', path: '/agent/transactions', body, requiresSecret: true });
96
+ }
97
+ // ─── Wallet endpoints ──────────────────────────────────────────
98
+ async listWalletBalances() {
99
+ return this.request({ method: 'GET', path: '/smart-wallet/balances', requiresSecret: true });
100
+ }
101
+ async getWalletPositions(address, chainId) {
102
+ return this.request({
103
+ method: 'GET',
104
+ path: '/smart-wallet/wallet-positions',
105
+ query: { address, chain_id: chainId },
106
+ requiresSecret: true,
107
+ });
108
+ }
109
+ async verifyEoaRole(body) {
110
+ return this.request({ method: 'POST', path: '/smart-wallet/verify-eoa-role', body, requiresSecret: true });
111
+ }
112
+ // ─── GitHub strategy endpoints ──────────────────────────────────
113
+ async listStrategies() {
114
+ return this.request({ method: 'GET', path: '/github/strategies' });
115
+ }
116
+ async linkStrategy(body) {
117
+ return this.request({ method: 'POST', path: '/github/strategies', body });
118
+ }
119
+ async listRepositories() {
120
+ return this.request({ method: 'GET', path: '/github/repositories' });
121
+ }
122
+ async getStrategy(id) {
123
+ return this.request({ method: 'GET', path: `/github/strategies/${this.seg(id)}` });
124
+ }
125
+ async getStrategyRefMetadata(id, ref) {
126
+ return this.request({
127
+ method: 'GET',
128
+ path: `/github/strategies/${this.seg(id)}/ref-metadata`,
129
+ query: { ref },
130
+ });
131
+ }
132
+ async validateRepository(owner, repo, ref) {
133
+ const query = {};
134
+ if (ref)
135
+ query.ref = ref;
136
+ return this.request({
137
+ method: 'GET',
138
+ path: `/github/repositories/${this.seg(owner)}/${this.seg(repo)}/validate`,
139
+ query,
140
+ });
141
+ }
142
+ async getStrategySyncStatus(id) {
143
+ return this.request({ method: 'GET', path: `/github/strategies/${this.seg(id)}/sync-status` });
144
+ }
145
+ async getAgentSyncStatus(id) {
146
+ return this.request({ method: 'GET', path: `/github/agents/${this.seg(id)}/sync-status` });
147
+ }
148
+ async listBranches(owner, repo) {
149
+ return this.request({ method: 'GET', path: `/github/repositories/${this.seg(owner)}/${this.seg(repo)}/branches` });
150
+ }
151
+ async listTags(owner, repo) {
152
+ return this.request({ method: 'GET', path: `/github/repositories/${this.seg(owner)}/${this.seg(repo)}/tags` });
153
+ }
154
+ async listCommits(owner, repo, sha) {
155
+ const query = {};
156
+ if (sha)
157
+ query.sha = sha;
158
+ return this.request({
159
+ method: 'GET',
160
+ path: `/github/repositories/${this.seg(owner)}/${this.seg(repo)}/commits`,
161
+ query,
162
+ });
163
+ }
164
+ // ─── Edge / Signal endpoints (via Hasura GraphQL) ───────────────
165
+ async getSignals(filters) {
166
+ var _a, _b, _c, _d;
167
+ if (!this.hasuraUrl) {
168
+ return { valid: false, error: 'ALMANAK_HASURA_URL is required for signal tools', statusCode: 400 };
169
+ }
170
+ const where = {};
171
+ if (filters === null || filters === void 0 ? void 0 : filters.type)
172
+ where.type = { _eq: filters.type };
173
+ if (filters === null || filters === void 0 ? void 0 : filters.chain)
174
+ where.chain = { _eq: filters.chain };
175
+ if (filters === null || filters === void 0 ? void 0 : filters.minAlphaScore)
176
+ where.alphaScore = { _gte: filters.minAlphaScore };
177
+ if (filters === null || filters === void 0 ? void 0 : filters.search) {
178
+ where._or = [
179
+ { title: { _ilike: `%${filters.search}%` } },
180
+ { summary: { _ilike: `%${filters.search}%` } },
181
+ ];
182
+ }
183
+ const sortMap = { alphaScore: 'alphaScore', createdAt: 'createdAt', confidence: 'confidence', detectedAt: 'detectedAt' };
184
+ const sortCol = (_b = sortMap[(_a = filters === null || filters === void 0 ? void 0 : filters.sortBy) !== null && _a !== void 0 ? _a : 'alphaScore']) !== null && _b !== void 0 ? _b : 'alphaScore';
185
+ return this.graphql('GetSignals', `
186
+ query GetSignals($where: Signal_bool_exp, $orderBy: [Signal_order_by!], $limit: Int, $offset: Int) {
187
+ Signal(where: $where, order_by: $orderBy, limit: $limit, offset: $offset) {
188
+ id type chain title summary alphaScore potentialReturn confidence
189
+ riskScore relatedTokens relatedProtocols strategy
190
+ detectedAt expiresAt createdAt
191
+ }
192
+ Signal_aggregate(where: $where) { aggregate { count } }
193
+ }
194
+ `, {
195
+ where: Object.keys(where).length > 0 ? where : undefined,
196
+ orderBy: [{ [sortCol]: 'desc' }],
197
+ limit: (_c = filters === null || filters === void 0 ? void 0 : filters.limit) !== null && _c !== void 0 ? _c : 20,
198
+ offset: (_d = filters === null || filters === void 0 ? void 0 : filters.offset) !== null && _d !== void 0 ? _d : 0,
199
+ });
200
+ }
201
+ async getSignalById(id) {
202
+ if (!this.hasuraUrl) {
203
+ return { valid: false, error: 'ALMANAK_HASURA_URL is required for signal tools', statusCode: 400 };
204
+ }
205
+ return this.graphql('GetSignalById', `
206
+ query GetSignalById($id: String!) {
207
+ Signal_by_pk(id: $id) {
208
+ id type chain title summary fullAnalysis alphaScore potentialReturn
209
+ confidence timeliness riskScore dataProvenance sources
210
+ relatedTokens relatedProtocols strategy riskBreakdown
211
+ dataSourcesUsed detectedAt expiresAt marketRegime createdAt updatedAt
212
+ }
213
+ }
214
+ `, { id });
215
+ }
216
+ async getSignalOutcome(signalId) {
217
+ if (!this.hasuraUrl) {
218
+ return { valid: false, error: 'ALMANAK_HASURA_URL is required for signal tools', statusCode: 400 };
219
+ }
220
+ return this.graphql('GetSignalOutcome', `
221
+ query GetSignalOutcome($signalId: String!) {
222
+ SignalOutcome(where: {signalId: {_eq: $signalId}}, limit: 1) {
223
+ id signalId signalType chain
224
+ priceAtSignal currentPrice peakPrice troughPrice
225
+ returnPct return7d wasCorrect status
226
+ createdAt updatedAt
227
+ }
228
+ }
229
+ `, { signalId });
230
+ }
231
+ async getSignalStats() {
232
+ if (!this.hasuraUrl) {
233
+ return { valid: false, error: 'ALMANAK_HASURA_URL is required for signal tools', statusCode: 400 };
234
+ }
235
+ return this.graphql('GetSignalStats', `
236
+ query GetSignalStats {
237
+ Signal_aggregate {
238
+ aggregate { count avg { alphaScore } }
239
+ }
240
+ }
241
+ `);
242
+ }
243
+ async getYields(filters) {
244
+ var _a, _b, _c, _d;
245
+ if (!this.hasuraUrl) {
246
+ return { valid: false, error: 'ALMANAK_HASURA_URL is required for yield tools', statusCode: 400 };
247
+ }
248
+ const where = {};
249
+ if (filters === null || filters === void 0 ? void 0 : filters.chain)
250
+ where.chain = { _eq: filters.chain };
251
+ if (filters === null || filters === void 0 ? void 0 : filters.assetGroup)
252
+ where.assetGroup = { _eq: filters.assetGroup };
253
+ if (filters === null || filters === void 0 ? void 0 : filters.opportunityType)
254
+ where.opportunityType = { _eq: filters.opportunityType };
255
+ if (filters === null || filters === void 0 ? void 0 : filters.minApy)
256
+ where.currentApy = { _gte: filters.minApy };
257
+ if (filters === null || filters === void 0 ? void 0 : filters.search) {
258
+ where._or = [
259
+ { name: { _ilike: `%${filters.search}%` } },
260
+ { protocol: { _ilike: `%${filters.search}%` } },
261
+ { asset: { _ilike: `%${filters.search}%` } },
262
+ ];
263
+ }
264
+ const sortMap = { apy: 'currentApy', tvl: 'tvlUsd', risk: 'riskScore', updated: 'lastUpdatedAt' };
265
+ const sortCol = (_b = sortMap[(_a = filters === null || filters === void 0 ? void 0 : filters.sortBy) !== null && _a !== void 0 ? _a : 'apy']) !== null && _b !== void 0 ? _b : 'currentApy';
266
+ return this.graphql('GetYields', `
267
+ query GetYields($where: YieldOpportunity_bool_exp, $orderBy: [YieldOpportunity_order_by!], $limit: Int, $offset: Int) {
268
+ YieldOpportunity(where: $where, order_by: $orderBy, limit: $limit, offset: $offset) {
269
+ id canonicalKey chain protocol asset assetGroup name opportunityType
270
+ currentApy currentApyBase currentApyReward riskScore tvlUsd
271
+ depositUrl curator tags lastUpdatedAt
272
+ }
273
+ YieldOpportunity_aggregate(where: $where) { aggregate { count } }
274
+ }
275
+ `, {
276
+ where: Object.keys(where).length > 0 ? where : undefined,
277
+ orderBy: [{ [sortCol]: 'desc' }],
278
+ limit: (_c = filters === null || filters === void 0 ? void 0 : filters.limit) !== null && _c !== void 0 ? _c : 20,
279
+ offset: (_d = filters === null || filters === void 0 ? void 0 : filters.offset) !== null && _d !== void 0 ? _d : 0,
280
+ });
281
+ }
282
+ async getYieldStats() {
283
+ if (!this.hasuraUrl) {
284
+ return { valid: false, error: 'ALMANAK_HASURA_URL is required for yield tools', statusCode: 400 };
285
+ }
286
+ return this.graphql('GetYieldStats', `
287
+ query GetYieldStats {
288
+ YieldOpportunity_aggregate {
289
+ aggregate { count avg { currentApy } }
290
+ }
291
+ }
292
+ `);
293
+ }
294
+ // ─── HTTP transport ─────────────────────────────────────────────
295
+ graphql(operationName, query, variables) {
296
+ return new Promise((resolve, reject) => {
297
+ const url = new url_1.URL(this.hasuraUrl);
298
+ const isHttps = url.protocol === 'https:';
299
+ const transport = isHttps ? https : http;
300
+ const bodyStr = JSON.stringify({ operationName, query, variables });
301
+ const headers = {
302
+ 'Authorization': `Bearer ${this.token}`,
303
+ 'Content-Type': 'application/json',
304
+ 'Content-Length': Buffer.byteLength(bodyStr).toString(),
305
+ };
306
+ const req = transport.request(url, { method: 'POST', headers, timeout: this.timeout }, (res) => {
307
+ const chunks = [];
308
+ res.on('data', (chunk) => chunks.push(chunk));
309
+ res.on('end', () => {
310
+ var _a, _b, _c;
311
+ const raw = Buffer.concat(chunks).toString('utf-8');
312
+ try {
313
+ const data = JSON.parse(raw);
314
+ if (data.errors) {
315
+ resolve({ valid: false, error: (_b = (_a = data.errors[0]) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : 'GraphQL error', statusCode: 400 });
316
+ }
317
+ else {
318
+ resolve({ valid: true, data: data.data });
319
+ }
320
+ }
321
+ catch {
322
+ resolve({ valid: false, error: `Non-JSON response: ${raw.slice(0, 200)}`, statusCode: (_c = res.statusCode) !== null && _c !== void 0 ? _c : 500 });
323
+ }
324
+ });
325
+ });
326
+ req.on('error', (err) => reject(err));
327
+ req.on('timeout', () => { req.destroy(); reject(new Error(`GraphQL request timed out`)); });
328
+ req.write(bodyStr);
329
+ req.end();
330
+ });
331
+ }
332
+ request(opts) {
333
+ return new Promise((resolve, reject) => {
334
+ const url = new url_1.URL(this.baseUrl + opts.path);
335
+ if (opts.query) {
336
+ for (const [k, v] of Object.entries(opts.query)) {
337
+ url.searchParams.set(k, v);
338
+ }
339
+ }
340
+ const isHttps = url.protocol === 'https:';
341
+ const transport = isHttps ? https : http;
342
+ const headers = {
343
+ 'Authorization': `Bearer ${this.token}`,
344
+ 'Accept': 'application/json',
345
+ };
346
+ if (opts.requiresSecret) {
347
+ if (!this.secretKey) {
348
+ resolve({ valid: false, error: 'ALMANAK_SECRET_KEY is required for this endpoint', statusCode: 403 });
349
+ return;
350
+ }
351
+ headers['x-almanak-secret-key'] = this.secretKey;
352
+ }
353
+ let bodyStr;
354
+ if (opts.body) {
355
+ bodyStr = JSON.stringify(opts.body);
356
+ headers['Content-Type'] = 'application/json';
357
+ headers['Content-Length'] = Buffer.byteLength(bodyStr).toString();
358
+ }
359
+ const req = transport.request(url, {
360
+ method: opts.method,
361
+ headers,
362
+ timeout: this.timeout,
363
+ }, (res) => {
364
+ const chunks = [];
365
+ res.on('data', (chunk) => chunks.push(chunk));
366
+ res.on('end', () => {
367
+ var _a, _b, _c;
368
+ const raw = Buffer.concat(chunks).toString('utf-8');
369
+ try {
370
+ const data = JSON.parse(raw);
371
+ if (res.statusCode && res.statusCode >= 400) {
372
+ resolve({
373
+ valid: false,
374
+ error: (_b = (_a = data.message) !== null && _a !== void 0 ? _a : data.error) !== null && _b !== void 0 ? _b : `HTTP ${res.statusCode}`,
375
+ statusCode: res.statusCode,
376
+ });
377
+ }
378
+ else {
379
+ resolve(data);
380
+ }
381
+ }
382
+ catch {
383
+ resolve({ valid: false, error: `Non-JSON response: ${raw.slice(0, 200)}`, statusCode: (_c = res.statusCode) !== null && _c !== void 0 ? _c : 500 });
384
+ }
385
+ });
386
+ });
387
+ req.on('error', (err) => reject(err));
388
+ req.on('timeout', () => {
389
+ req.destroy();
390
+ reject(new Error(`Request timed out after ${this.timeout}ms`));
391
+ });
392
+ if (bodyStr)
393
+ req.write(bodyStr);
394
+ req.end();
395
+ });
396
+ }
397
+ }
398
+ exports.PlatformClient = PlatformClient;
399
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Almanak MCP Server
4
+ *
5
+ * Exposes Almanak platform and edge APIs as MCP tools over stdio.
6
+ *
7
+ * Usage:
8
+ * almanak-platform-mcp [--mode <modes>]
9
+ *
10
+ * Modes (comma-separated):
11
+ * agents - Agent lifecycle (deploy, state, pause, stop, logs, pnl, etc.)
12
+ * wallets - Wallet listing, positions, role verification
13
+ * strategies - Strategy linking, validation, metadata
14
+ * github - Repository browsing (branches, tags, commits)
15
+ * edge - Edge signals and opportunities (planned)
16
+ * all - All available tools (default)
17
+ *
18
+ * Configuration via environment variables:
19
+ * ALMANAK_PLATFORM_URL - Platform backend URL (default: https://api.almanak.co/v1/api)
20
+ * ALMANAK_PLATFORM_TOKEN - Bearer token for authentication (required)
21
+ * ALMANAK_SECRET_KEY - x-almanak-secret-key header value (optional, enables wallet/logs tools)
22
+ * ALMANAK_HASURA_URL - Hasura GraphQL endpoint (optional, required for edge/signal tools)
23
+ * ALMANAK_REQUEST_TIMEOUT - Request timeout in ms (default: 30000)
24
+ *
25
+ * Examples:
26
+ * almanak-platform-mcp # all tools
27
+ * almanak-platform-mcp --mode agents,wallets # deploy/manage agents
28
+ * almanak-platform-mcp --mode strategies,github # browse and link repos
29
+ */
30
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Almanak MCP Server
5
+ *
6
+ * Exposes Almanak platform and edge APIs as MCP tools over stdio.
7
+ *
8
+ * Usage:
9
+ * almanak-platform-mcp [--mode <modes>]
10
+ *
11
+ * Modes (comma-separated):
12
+ * agents - Agent lifecycle (deploy, state, pause, stop, logs, pnl, etc.)
13
+ * wallets - Wallet listing, positions, role verification
14
+ * strategies - Strategy linking, validation, metadata
15
+ * github - Repository browsing (branches, tags, commits)
16
+ * edge - Edge signals and opportunities (planned)
17
+ * all - All available tools (default)
18
+ *
19
+ * Configuration via environment variables:
20
+ * ALMANAK_PLATFORM_URL - Platform backend URL (default: https://api.almanak.co/v1/api)
21
+ * ALMANAK_PLATFORM_TOKEN - Bearer token for authentication (required)
22
+ * ALMANAK_SECRET_KEY - x-almanak-secret-key header value (optional, enables wallet/logs tools)
23
+ * ALMANAK_HASURA_URL - Hasura GraphQL endpoint (optional, required for edge/signal tools)
24
+ * ALMANAK_REQUEST_TIMEOUT - Request timeout in ms (default: 30000)
25
+ *
26
+ * Examples:
27
+ * almanak-platform-mcp # all tools
28
+ * almanak-platform-mcp --mode agents,wallets # deploy/manage agents
29
+ * almanak-platform-mcp --mode strategies,github # browse and link repos
30
+ */
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ const server_1 = require("./server");
33
+ const client_1 = require("./client");
34
+ const tools_1 = require("./tools");
35
+ const VALID_MODES = new Set(['agents', 'wallets', 'strategies', 'github', 'edge', 'all']);
36
+ function log(msg) {
37
+ process.stderr.write(`[almanak-mcp] ${msg}\n`);
38
+ }
39
+ function parseModes(args) {
40
+ const modeIdx = args.indexOf('--mode');
41
+ if (modeIdx === -1 || modeIdx + 1 >= args.length)
42
+ return ['all'];
43
+ const raw = args[modeIdx + 1].split(',').map((s) => s.trim().toLowerCase());
44
+ const modes = [];
45
+ for (const m of raw) {
46
+ if (VALID_MODES.has(m)) {
47
+ modes.push(m);
48
+ }
49
+ else {
50
+ log(`WARNING: Unknown mode "${m}" (valid: ${Array.from(VALID_MODES).join(', ')})`);
51
+ }
52
+ }
53
+ return modes.length > 0 ? modes : ['all'];
54
+ }
55
+ function main() {
56
+ var _a, _b, _c;
57
+ const modes = parseModes(process.argv.slice(2));
58
+ const baseUrl = (_a = process.env.ALMANAK_PLATFORM_URL) !== null && _a !== void 0 ? _a : 'https://api.almanak.co/v1/api';
59
+ const token = process.env.ALMANAK_PLATFORM_TOKEN;
60
+ const secretKey = process.env.ALMANAK_SECRET_KEY;
61
+ const hasuraUrl = (_b = process.env.ALMANAK_HASURA_URL) !== null && _b !== void 0 ? _b : 'https://api.almanak.co/v1/graphql';
62
+ const timeout = parseInt((_c = process.env.ALMANAK_REQUEST_TIMEOUT) !== null && _c !== void 0 ? _c : '30000', 10);
63
+ if (!token) {
64
+ log('ERROR: ALMANAK_PLATFORM_TOKEN is required');
65
+ process.exit(1);
66
+ }
67
+ const hasSecret = Boolean(secretKey);
68
+ const client = new client_1.PlatformClient({ baseUrl, token, secretKey, hasuraUrl, timeout });
69
+ const handler = new tools_1.PlatformToolHandler(client, { includeSecretTools: hasSecret, modes });
70
+ const server = new server_1.McpStdioServer(handler);
71
+ const modeLabel = modes.includes('all') ? 'all' : modes.join(',');
72
+ log(`Starting MCP server (${handler.listTools().length} tools, mode: ${modeLabel}${hasSecret ? '' : ', secret-key tools hidden'})`);
73
+ log(`Platform URL: ${baseUrl}`);
74
+ server.run().then(() => {
75
+ log('Server stopped');
76
+ process.exit(0);
77
+ }, (err) => {
78
+ log(`Server error: ${err.message}`);
79
+ process.exit(1);
80
+ });
81
+ }
82
+ main();
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;AAEH,qCAA0C;AAC1C,qCAA0C;AAC1C,mCAAwD;AAExD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAEpG,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAa,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,CAAa,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,0BAA0B,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,IAAI;;IACX,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,mCAAI,+BAA+B,CAAC;IACpF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACjD,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,mCAAI,mCAAmC,CAAC;IACxF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,mCAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IAE7E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,uBAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,IAAI,2BAAmB,CAAC,MAAM,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,uBAAc,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,GAAG,CAAC,wBAAwB,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,iBAAiB,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,GAAG,CAAC,CAAC;IACpI,GAAG,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;IAEhC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CACf,GAAG,EAAE;QACH,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;QACN,GAAG,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CACF,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC"}