@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,35 @@
1
+ /**
2
+ * MCP stdio transport server.
3
+ * JSON-RPC 2.0 over stdin/stdout with newline-delimited JSON (MCP SDK convention).
4
+ */
5
+ import { Readable, Writable } from 'stream';
6
+ export interface ToolDefinition {
7
+ name: string;
8
+ description: string;
9
+ inputSchema: Record<string, unknown>;
10
+ }
11
+ export interface ToolCallResult {
12
+ content: Array<{
13
+ type: 'text';
14
+ text: string;
15
+ }>;
16
+ isError?: boolean;
17
+ }
18
+ export interface McpServerHandler {
19
+ listTools(): ToolDefinition[];
20
+ callTool(name: string, args: Record<string, unknown>): Promise<ToolCallResult>;
21
+ }
22
+ export declare class McpStdioServer {
23
+ private reader;
24
+ private writer;
25
+ private handler;
26
+ private lineBuf;
27
+ constructor(handler: McpServerHandler, reader?: Readable, writer?: Writable);
28
+ run(): Promise<void>;
29
+ private processLines;
30
+ private handleRawMessage;
31
+ private dispatch;
32
+ private sendResult;
33
+ private sendError;
34
+ private writeMessage;
35
+ }
package/dist/server.js ADDED
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * MCP stdio transport server.
4
+ * JSON-RPC 2.0 over stdin/stdout with newline-delimited JSON (MCP SDK convention).
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.McpStdioServer = void 0;
8
+ const MCP_PROTOCOL_VERSION = '2024-11-05';
9
+ const SERVER_NAME = 'almanak-platform';
10
+ const SERVER_VERSION = '1.0.0';
11
+ const ErrorCode = {
12
+ PARSE_ERROR: -32700,
13
+ INVALID_REQUEST: -32600,
14
+ METHOD_NOT_FOUND: -32601,
15
+ INTERNAL_ERROR: -32603,
16
+ };
17
+ class McpStdioServer {
18
+ constructor(handler, reader, writer) {
19
+ this.lineBuf = '';
20
+ this.handler = handler;
21
+ this.reader = reader !== null && reader !== void 0 ? reader : process.stdin;
22
+ this.writer = writer !== null && writer !== void 0 ? writer : process.stdout;
23
+ }
24
+ async run() {
25
+ return new Promise((resolve) => {
26
+ this.reader.setEncoding('utf-8');
27
+ this.reader.on('data', (chunk) => {
28
+ this.lineBuf += chunk;
29
+ this.processLines();
30
+ });
31
+ this.reader.on('end', () => resolve());
32
+ this.reader.on('close', () => resolve());
33
+ });
34
+ }
35
+ processLines() {
36
+ while (true) {
37
+ const newlineIdx = this.lineBuf.indexOf('\n');
38
+ if (newlineIdx === -1)
39
+ break;
40
+ const line = this.lineBuf.slice(0, newlineIdx).replace(/\r$/, '');
41
+ this.lineBuf = this.lineBuf.slice(newlineIdx + 1);
42
+ if (line.length === 0)
43
+ continue;
44
+ this.handleRawMessage(line);
45
+ }
46
+ }
47
+ async handleRawMessage(body) {
48
+ var _a, _b;
49
+ let message;
50
+ try {
51
+ message = JSON.parse(body);
52
+ }
53
+ catch {
54
+ this.sendError(null, ErrorCode.PARSE_ERROR, 'Invalid JSON');
55
+ return;
56
+ }
57
+ if (typeof message !== 'object' || message === null) {
58
+ this.sendError(null, ErrorCode.INVALID_REQUEST, 'Message must be an object');
59
+ return;
60
+ }
61
+ const { id, method } = message;
62
+ if (message.jsonrpc !== '2.0') {
63
+ if (id !== undefined) {
64
+ this.sendError(id, ErrorCode.INVALID_REQUEST, 'Invalid or missing jsonrpc version');
65
+ }
66
+ return;
67
+ }
68
+ if (!method || typeof method !== 'string') {
69
+ if (id !== undefined) {
70
+ this.sendError(id, ErrorCode.INVALID_REQUEST, 'Missing method');
71
+ }
72
+ return;
73
+ }
74
+ try {
75
+ const result = await this.dispatch(method, (_a = message.params) !== null && _a !== void 0 ? _a : {});
76
+ if (id !== undefined) {
77
+ this.sendResult(id, result);
78
+ }
79
+ }
80
+ catch (err) {
81
+ if (id !== undefined) {
82
+ const code = typeof (err === null || err === void 0 ? void 0 : err.code) === 'number' ? err.code : ErrorCode.INTERNAL_ERROR;
83
+ this.sendError(id, code, (_b = err.message) !== null && _b !== void 0 ? _b : 'Internal error');
84
+ }
85
+ }
86
+ }
87
+ async dispatch(method, params) {
88
+ var _a;
89
+ switch (method) {
90
+ case 'initialize':
91
+ return {
92
+ protocolVersion: MCP_PROTOCOL_VERSION,
93
+ capabilities: {
94
+ tools: { listChanged: false },
95
+ },
96
+ serverInfo: {
97
+ name: SERVER_NAME,
98
+ version: SERVER_VERSION,
99
+ },
100
+ };
101
+ case 'initialized':
102
+ case 'notifications/initialized':
103
+ case 'notifications/cancelled':
104
+ return undefined;
105
+ case 'ping':
106
+ return {};
107
+ case 'tools/list':
108
+ return { tools: this.handler.listTools() };
109
+ case 'tools/call': {
110
+ const name = params === null || params === void 0 ? void 0 : params.name;
111
+ const args = (_a = params === null || params === void 0 ? void 0 : params.arguments) !== null && _a !== void 0 ? _a : {};
112
+ if (!name || typeof name !== 'string') {
113
+ throw Object.assign(new Error('tools/call requires a string "name" parameter'), {
114
+ code: ErrorCode.INVALID_REQUEST,
115
+ });
116
+ }
117
+ if (typeof args !== 'object' || args === null || Array.isArray(args)) {
118
+ throw Object.assign(new Error('tools/call "arguments" must be an object'), {
119
+ code: ErrorCode.INVALID_REQUEST,
120
+ });
121
+ }
122
+ return this.handler.callTool(name, args);
123
+ }
124
+ default:
125
+ throw Object.assign(new Error(`Unknown method: ${method}`), {
126
+ code: ErrorCode.METHOD_NOT_FOUND,
127
+ });
128
+ }
129
+ }
130
+ sendResult(id, result) {
131
+ this.writeMessage({
132
+ jsonrpc: '2.0',
133
+ id,
134
+ result: result !== null && result !== void 0 ? result : {},
135
+ });
136
+ }
137
+ sendError(id, code, message) {
138
+ this.writeMessage({
139
+ jsonrpc: '2.0',
140
+ id: id !== null && id !== void 0 ? id : null,
141
+ error: { code, message },
142
+ });
143
+ }
144
+ writeMessage(msg) {
145
+ this.writer.write(JSON.stringify(msg) + '\n');
146
+ }
147
+ }
148
+ exports.McpStdioServer = McpStdioServer;
149
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Tool catalog and dispatch for the Almanak MCP server.
3
+ *
4
+ * Tools are organized into modes that can be selectively enabled:
5
+ * agents - Agent lifecycle (deploy, state, pause, stop, logs, pnl, etc.)
6
+ * wallets - Wallet listing, positions, role verification
7
+ * strategies - Strategy linking, validation, metadata
8
+ * github - Repository browsing (branches, tags, commits)
9
+ * edge - Edge signals and opportunities (planned)
10
+ * all - All available tools
11
+ */
12
+ import { PlatformClient } from './client';
13
+ import { ToolDefinition, ToolCallResult, McpServerHandler } from './server';
14
+ export type ToolMode = 'agents' | 'wallets' | 'strategies' | 'github' | 'edge' | 'all';
15
+ export interface ToolHandlerOptions {
16
+ includeSecretTools?: boolean;
17
+ modes?: ToolMode[];
18
+ }
19
+ export declare class PlatformToolHandler implements McpServerHandler {
20
+ private client;
21
+ private tools;
22
+ private options;
23
+ private enabledModes;
24
+ constructor(client: PlatformClient, options?: ToolHandlerOptions);
25
+ listTools(): ToolDefinition[];
26
+ callTool(name: string, args: Record<string, unknown>): Promise<ToolCallResult>;
27
+ private modeEnabled;
28
+ private register;
29
+ private registerSecret;
30
+ private registerAll;
31
+ }