@battlegrid/mcp-server 1.0.2 → 1.1.2
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/index.d.ts +20 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +148 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -2,24 +2,38 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* @battlegrid/mcp-server — stdio proxy to BattleGrid's remote MCP server
|
|
4
4
|
*
|
|
5
|
-
* Reads
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Reads BATTLEGRID_API_KEYS (comma-separated) or BATTLEGRID_API_KEY from
|
|
6
|
+
* environment, discovers account identities via GET /mcp/identity, connects
|
|
7
|
+
* to the remote BattleGrid MCP server via Streamable HTTP, and re-exposes
|
|
8
|
+
* all tools, prompts, and resources over stdio transport for local MCP clients.
|
|
9
|
+
*
|
|
10
|
+
* Multi-account support: when multiple keys are configured, an `account`
|
|
11
|
+
* enum parameter is injected into every tool so the AI agent can choose
|
|
12
|
+
* which account to act as. Tool calls are routed with the matching Bearer token.
|
|
8
13
|
*
|
|
9
14
|
* Architecture: Matches Stripe's @stripe/mcp pattern — thin authenticated proxy.
|
|
10
15
|
*
|
|
11
16
|
* Usage:
|
|
12
17
|
* BATTLEGRID_API_KEY=bg_live_... npx @battlegrid/mcp-server
|
|
18
|
+
* BATTLEGRID_API_KEYS=bg_live_aaa,bg_live_bbb npx @battlegrid/mcp-server
|
|
13
19
|
*
|
|
14
20
|
* Environment Variables:
|
|
15
|
-
*
|
|
21
|
+
* BATTLEGRID_API_KEYS (optional) — Comma-separated list of API keys
|
|
22
|
+
* BATTLEGRID_API_KEY (optional) — Single API key (fallback if BATTLEGRID_API_KEYS not set)
|
|
16
23
|
* BATTLEGRID_API_URL (optional) — Override server URL (default: https://mcp.battlegrid.trade)
|
|
17
24
|
*/
|
|
18
|
-
export declare const VERSION = "1.0
|
|
25
|
+
export declare const VERSION = "1.1.0";
|
|
19
26
|
export declare const DEFAULT_URL = "https://mcp.battlegrid.trade";
|
|
20
27
|
export interface EnvConfig {
|
|
21
|
-
|
|
28
|
+
apiKeys: string[];
|
|
22
29
|
apiUrl: string;
|
|
23
30
|
}
|
|
31
|
+
export interface AccountIdentity {
|
|
32
|
+
apiKey: string;
|
|
33
|
+
userId: string;
|
|
34
|
+
username: string;
|
|
35
|
+
keyLabel: string | null;
|
|
36
|
+
}
|
|
24
37
|
export declare function validateEnv(env: Record<string, string | undefined>): EnvConfig;
|
|
38
|
+
export declare function discoverIdentities(apiKeys: string[], apiUrl: string): Promise<AccountIdentity[]>;
|
|
25
39
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAeH,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,WAAW,iCAAiC,CAAC;AAM1D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAID,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CA+B9E;AAID,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,EAAE,CAAC,CA2C5B"}
|
package/dist/index.js
CHANGED
|
@@ -2,17 +2,24 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* @battlegrid/mcp-server — stdio proxy to BattleGrid's remote MCP server
|
|
4
4
|
*
|
|
5
|
-
* Reads
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Reads BATTLEGRID_API_KEYS (comma-separated) or BATTLEGRID_API_KEY from
|
|
6
|
+
* environment, discovers account identities via GET /mcp/identity, connects
|
|
7
|
+
* to the remote BattleGrid MCP server via Streamable HTTP, and re-exposes
|
|
8
|
+
* all tools, prompts, and resources over stdio transport for local MCP clients.
|
|
9
|
+
*
|
|
10
|
+
* Multi-account support: when multiple keys are configured, an `account`
|
|
11
|
+
* enum parameter is injected into every tool so the AI agent can choose
|
|
12
|
+
* which account to act as. Tool calls are routed with the matching Bearer token.
|
|
8
13
|
*
|
|
9
14
|
* Architecture: Matches Stripe's @stripe/mcp pattern — thin authenticated proxy.
|
|
10
15
|
*
|
|
11
16
|
* Usage:
|
|
12
17
|
* BATTLEGRID_API_KEY=bg_live_... npx @battlegrid/mcp-server
|
|
18
|
+
* BATTLEGRID_API_KEYS=bg_live_aaa,bg_live_bbb npx @battlegrid/mcp-server
|
|
13
19
|
*
|
|
14
20
|
* Environment Variables:
|
|
15
|
-
*
|
|
21
|
+
* BATTLEGRID_API_KEYS (optional) — Comma-separated list of API keys
|
|
22
|
+
* BATTLEGRID_API_KEY (optional) — Single API key (fallback if BATTLEGRID_API_KEYS not set)
|
|
16
23
|
* BATTLEGRID_API_URL (optional) — Override server URL (default: https://mcp.battlegrid.trade)
|
|
17
24
|
*/
|
|
18
25
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
@@ -20,22 +27,70 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
20
27
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
21
28
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
22
29
|
import { ListToolsRequestSchema, CallToolRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
23
|
-
export const VERSION = '1.0
|
|
30
|
+
export const VERSION = '1.1.0';
|
|
24
31
|
export const DEFAULT_URL = 'https://mcp.battlegrid.trade';
|
|
25
32
|
const MAX_RETRIES = 3;
|
|
26
33
|
const RETRY_DELAYS_MS = [2000, 4000, 8000];
|
|
34
|
+
// --- Environment validation (exported for testing) ---
|
|
27
35
|
export function validateEnv(env) {
|
|
28
|
-
const apiKey = env.BATTLEGRID_API_KEY;
|
|
29
36
|
const apiUrl = env.BATTLEGRID_API_URL || DEFAULT_URL;
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
// BATTLEGRID_API_KEYS (comma-separated) takes precedence
|
|
38
|
+
const keysRaw = env.BATTLEGRID_API_KEYS;
|
|
39
|
+
let apiKeys;
|
|
40
|
+
if (keysRaw) {
|
|
41
|
+
apiKeys = keysRaw.split(',').map(k => k.trim()).filter(Boolean);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const singleKey = env.BATTLEGRID_API_KEY;
|
|
45
|
+
apiKeys = singleKey ? [singleKey] : [];
|
|
46
|
+
}
|
|
47
|
+
if (apiKeys.length === 0) {
|
|
48
|
+
throw new Error('BATTLEGRID_API_KEY or BATTLEGRID_API_KEYS environment variable is required.\n' +
|
|
32
49
|
'Get your API key at: https://battlegrid.trade → Profile → MCP tab');
|
|
33
50
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
51
|
+
for (const key of apiKeys) {
|
|
52
|
+
if (!key.startsWith('bg_live_')) {
|
|
53
|
+
throw new Error(`API key must start with "bg_live_" (got "${key.slice(0, 12)}...")\n` +
|
|
54
|
+
'Create a new key at: https://battlegrid.trade → Profile → MCP tab');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { apiKeys, apiUrl };
|
|
58
|
+
}
|
|
59
|
+
// --- Identity discovery (exported for testing) ---
|
|
60
|
+
export async function discoverIdentities(apiKeys, apiUrl) {
|
|
61
|
+
// Strip trailing slash for clean URL construction
|
|
62
|
+
const baseUrl = apiUrl.replace(/\/+$/, '');
|
|
63
|
+
const results = await Promise.allSettled(apiKeys.map(async (apiKey) => {
|
|
64
|
+
const response = await fetch(`${baseUrl}/identity`, {
|
|
65
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const text = await response.text().catch(() => '');
|
|
69
|
+
throw new Error(`HTTP ${response.status}: ${text}`);
|
|
70
|
+
}
|
|
71
|
+
const data = await response.json();
|
|
72
|
+
return {
|
|
73
|
+
apiKey,
|
|
74
|
+
userId: data.userId,
|
|
75
|
+
username: data.username ?? data.userId.slice(0, 8),
|
|
76
|
+
keyLabel: data.keyLabel,
|
|
77
|
+
};
|
|
78
|
+
}));
|
|
79
|
+
const identities = [];
|
|
80
|
+
for (let i = 0; i < results.length; i++) {
|
|
81
|
+
const result = results[i];
|
|
82
|
+
if (result.status === 'fulfilled') {
|
|
83
|
+
identities.push(result.value);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
process.stderr.write(`Warning: identity discovery failed for key #${i + 1}: ${result.reason}\n`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (identities.length === 0) {
|
|
90
|
+
throw new Error('No valid API keys — all identity lookups failed.\n' +
|
|
91
|
+
'Check your keys at: https://battlegrid.trade → Profile → MCP tab');
|
|
37
92
|
}
|
|
38
|
-
return
|
|
93
|
+
return identities;
|
|
39
94
|
}
|
|
40
95
|
// --- Connection with retry ---
|
|
41
96
|
function isAuthError(error) {
|
|
@@ -52,7 +107,6 @@ async function connectWithRetry(client, transport, apiUrl) {
|
|
|
52
107
|
return;
|
|
53
108
|
}
|
|
54
109
|
catch (error) {
|
|
55
|
-
// Auth errors should not be retried — the key is wrong
|
|
56
110
|
if (isAuthError(error)) {
|
|
57
111
|
throw new Error('Invalid or revoked API key.\n' +
|
|
58
112
|
'Create a new key at: https://battlegrid.trade → Profile → MCP tab');
|
|
@@ -65,12 +119,26 @@ async function connectWithRetry(client, transport, apiUrl) {
|
|
|
65
119
|
const delay = RETRY_DELAYS_MS[attempt] ?? 8000;
|
|
66
120
|
process.stderr.write(`Connection attempt ${attempt + 1} failed, retrying in ${delay / 1000}s...\n`);
|
|
67
121
|
await sleep(delay);
|
|
68
|
-
// Recreate transport for retry (previous one may be in a broken state)
|
|
69
|
-
// Note: we can't reconnect the same transport, so we create a fresh Client+Transport
|
|
70
|
-
// on each retry in the main function instead
|
|
71
122
|
}
|
|
72
123
|
}
|
|
73
124
|
}
|
|
125
|
+
function injectAccountParam(tools, accountNames) {
|
|
126
|
+
return tools.map(tool => ({
|
|
127
|
+
...tool,
|
|
128
|
+
inputSchema: {
|
|
129
|
+
...tool.inputSchema,
|
|
130
|
+
properties: {
|
|
131
|
+
account: {
|
|
132
|
+
type: 'string',
|
|
133
|
+
enum: accountNames,
|
|
134
|
+
description: `Which BattleGrid account to use for this action. Available: ${accountNames.join(', ')}`,
|
|
135
|
+
},
|
|
136
|
+
...tool.inputSchema.properties,
|
|
137
|
+
},
|
|
138
|
+
required: ['account', ...(tool.inputSchema.required ?? [])],
|
|
139
|
+
},
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
74
142
|
// --- Main ---
|
|
75
143
|
async function main() {
|
|
76
144
|
let config;
|
|
@@ -81,11 +149,29 @@ async function main() {
|
|
|
81
149
|
process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
82
150
|
process.exit(1);
|
|
83
151
|
}
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
152
|
+
// Discover identities for all keys
|
|
153
|
+
let identities;
|
|
154
|
+
try {
|
|
155
|
+
identities = await discoverIdentities(config.apiKeys, config.apiUrl);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
const isMultiAccount = identities.length > 1;
|
|
162
|
+
const accountNames = identities.map(id => id.username);
|
|
163
|
+
// Build lookup: username → apiKey
|
|
164
|
+
const keyByAccount = new Map();
|
|
165
|
+
for (const id of identities) {
|
|
166
|
+
keyByAccount.set(id.username, id.apiKey);
|
|
167
|
+
}
|
|
168
|
+
process.stderr.write(`BattleGrid MCP: ${identities.length} account(s) discovered — ${accountNames.join(', ')}\n`);
|
|
169
|
+
// Connect to remote using the first key (for capability discovery)
|
|
170
|
+
const primaryKey = identities[0].apiKey;
|
|
171
|
+
const primaryTransport = new StreamableHTTPClientTransport(new URL(config.apiUrl), { requestInit: { headers: { Authorization: `Bearer ${primaryKey}` } } });
|
|
172
|
+
const primaryClient = new Client({ name: 'battlegrid-proxy', version: VERSION }, { capabilities: {} });
|
|
87
173
|
try {
|
|
88
|
-
await connectWithRetry(
|
|
174
|
+
await connectWithRetry(primaryClient, primaryTransport, config.apiUrl);
|
|
89
175
|
}
|
|
90
176
|
catch (error) {
|
|
91
177
|
process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
@@ -93,13 +179,17 @@ async function main() {
|
|
|
93
179
|
}
|
|
94
180
|
// Discover remote capabilities
|
|
95
181
|
const [toolsResult, promptsResult, resourcesResult] = await Promise.all([
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
182
|
+
primaryClient.listTools(),
|
|
183
|
+
primaryClient.listPrompts(),
|
|
184
|
+
primaryClient.listResources(),
|
|
99
185
|
]);
|
|
100
186
|
process.stderr.write(`BattleGrid MCP: ${toolsResult.tools.length} tools, ` +
|
|
101
187
|
`${promptsResult.prompts.length} prompts, ` +
|
|
102
188
|
`${resourcesResult.resources.length} resources\n`);
|
|
189
|
+
// Augment tools with account parameter if multi-account
|
|
190
|
+
const exposedTools = isMultiAccount
|
|
191
|
+
? injectAccountParam(toolsResult.tools, accountNames)
|
|
192
|
+
: toolsResult.tools;
|
|
103
193
|
// Create local stdio server
|
|
104
194
|
const localServer = new Server({ name: 'battlegrid', version: VERSION }, {
|
|
105
195
|
capabilities: {
|
|
@@ -110,13 +200,43 @@ async function main() {
|
|
|
110
200
|
});
|
|
111
201
|
// --- Proxy: tools ---
|
|
112
202
|
localServer.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
113
|
-
tools:
|
|
203
|
+
tools: exposedTools,
|
|
114
204
|
}));
|
|
205
|
+
// Keep a pool of remote clients keyed by API key for routing
|
|
206
|
+
const clientPool = new Map();
|
|
207
|
+
clientPool.set(primaryKey, primaryClient);
|
|
208
|
+
async function getClientForKey(apiKey) {
|
|
209
|
+
const existing = clientPool.get(apiKey);
|
|
210
|
+
if (existing)
|
|
211
|
+
return existing;
|
|
212
|
+
const transport = new StreamableHTTPClientTransport(new URL(config.apiUrl), { requestInit: { headers: { Authorization: `Bearer ${apiKey}` } } });
|
|
213
|
+
const client = new Client({ name: 'battlegrid-proxy', version: VERSION }, { capabilities: {} });
|
|
214
|
+
await connectWithRetry(client, transport, config.apiUrl);
|
|
215
|
+
clientPool.set(apiKey, client);
|
|
216
|
+
return client;
|
|
217
|
+
}
|
|
115
218
|
localServer.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
116
219
|
try {
|
|
117
|
-
|
|
220
|
+
let targetKey = primaryKey;
|
|
221
|
+
const args = { ...request.params.arguments };
|
|
222
|
+
if (isMultiAccount) {
|
|
223
|
+
const selectedAccount = args.account;
|
|
224
|
+
if (!selectedAccount || !keyByAccount.has(selectedAccount)) {
|
|
225
|
+
return {
|
|
226
|
+
content: [{
|
|
227
|
+
type: 'text',
|
|
228
|
+
text: `Error: "account" parameter is required. Choose one of: ${accountNames.join(', ')}`,
|
|
229
|
+
}],
|
|
230
|
+
isError: true,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
targetKey = keyByAccount.get(selectedAccount);
|
|
234
|
+
delete args.account; // Strip before forwarding to remote
|
|
235
|
+
}
|
|
236
|
+
const client = await getClientForKey(targetKey);
|
|
237
|
+
return await client.callTool({
|
|
118
238
|
name: request.params.name,
|
|
119
|
-
arguments:
|
|
239
|
+
arguments: args,
|
|
120
240
|
});
|
|
121
241
|
}
|
|
122
242
|
catch (error) {
|
|
@@ -132,7 +252,7 @@ async function main() {
|
|
|
132
252
|
prompts: promptsResult.prompts,
|
|
133
253
|
}));
|
|
134
254
|
localServer.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
135
|
-
return await
|
|
255
|
+
return await primaryClient.getPrompt({
|
|
136
256
|
name: request.params.name,
|
|
137
257
|
arguments: request.params.arguments,
|
|
138
258
|
});
|
|
@@ -142,7 +262,7 @@ async function main() {
|
|
|
142
262
|
resources: resourcesResult.resources,
|
|
143
263
|
}));
|
|
144
264
|
localServer.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
145
|
-
return await
|
|
265
|
+
return await primaryClient.readResource({
|
|
146
266
|
uri: request.params.uri,
|
|
147
267
|
});
|
|
148
268
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|