@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.
- package/dist/client.d.ts +97 -0
- package/dist/client.js +399 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +35 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +31 -0
- package/dist/tools.js +500 -0
- package/dist/tools.js.map +1 -0
- package/package.json +26 -0
package/dist/client.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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":"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"}
|