@bkm016/calcite 0.0.0-stage → 0.2.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.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +416 -2
  3. package/THIRD_PARTY_NOTICES.md +44 -0
  4. package/dist/accounts.d.ts +46 -0
  5. package/dist/accounts.js +194 -0
  6. package/dist/accounts.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +332 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/client-core.d.ts +66 -0
  11. package/dist/client-core.js +530 -0
  12. package/dist/client-core.js.map +1 -0
  13. package/dist/client.d.ts +127 -0
  14. package/dist/client.js +185 -0
  15. package/dist/client.js.map +1 -0
  16. package/dist/display.d.ts +23 -0
  17. package/dist/display.js +164 -0
  18. package/dist/display.js.map +1 -0
  19. package/dist/hmc.d.ts +53 -0
  20. package/dist/hmc.js +168 -0
  21. package/dist/hmc.js.map +1 -0
  22. package/dist/index.d.ts +11 -0
  23. package/dist/index.js +8 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/install.d.ts +48 -0
  26. package/dist/install.js +119 -0
  27. package/dist/install.js.map +1 -0
  28. package/dist/java.d.ts +37 -0
  29. package/dist/java.js +222 -0
  30. package/dist/java.js.map +1 -0
  31. package/dist/loaders.d.ts +41 -0
  32. package/dist/loaders.js +86 -0
  33. package/dist/loaders.js.map +1 -0
  34. package/dist/lock.d.ts +13 -0
  35. package/dist/lock.js +79 -0
  36. package/dist/lock.js.map +1 -0
  37. package/dist/log.d.ts +13 -0
  38. package/dist/log.js +20 -0
  39. package/dist/log.js.map +1 -0
  40. package/dist/manager.d.ts +15 -0
  41. package/dist/manager.js +65 -0
  42. package/dist/manager.js.map +1 -0
  43. package/dist/mcp.d.ts +13 -0
  44. package/dist/mcp.js +377 -0
  45. package/dist/mcp.js.map +1 -0
  46. package/dist/mods.d.ts +21 -0
  47. package/dist/mods.js +135 -0
  48. package/dist/mods.js.map +1 -0
  49. package/dist/mojang.d.ts +54 -0
  50. package/dist/mojang.js +73 -0
  51. package/dist/mojang.js.map +1 -0
  52. package/dist/names.d.ts +53 -0
  53. package/dist/names.js +267 -0
  54. package/dist/names.js.map +1 -0
  55. package/dist/net.d.ts +26 -0
  56. package/dist/net.js +286 -0
  57. package/dist/net.js.map +1 -0
  58. package/dist/options.d.ts +14 -0
  59. package/dist/options.js +50 -0
  60. package/dist/options.js.map +1 -0
  61. package/dist/paths.d.ts +29 -0
  62. package/dist/paths.js +49 -0
  63. package/dist/paths.js.map +1 -0
  64. package/dist/probe-server.d.ts +28 -0
  65. package/dist/probe-server.js +132 -0
  66. package/dist/probe-server.js.map +1 -0
  67. package/dist/types.d.ts +235 -0
  68. package/dist/types.js +25 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/version.d.ts +2 -0
  71. package/dist/version.js +11 -0
  72. package/dist/version.js.map +1 -0
  73. package/dist/zip.d.ts +5 -0
  74. package/dist/zip.js +65 -0
  75. package/dist/zip.js.map +1 -0
  76. package/package.json +57 -4
  77. package/vendor/calcite-probe.jar +0 -0
package/dist/mcp.js ADDED
@@ -0,0 +1,377 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { z } from 'zod';
4
+ import { listAccounts, removeAccount, startLogin } from './accounts.js';
5
+ import { CalciteError, defaultUsername, installVersion } from './client.js';
6
+ import { getManifest } from './mojang.js';
7
+ import { ClientManager } from './manager.js';
8
+ import { resolvePaths } from './paths.js';
9
+ import { VERSION } from './version.js';
10
+ function text(value) {
11
+ return { content: [{ type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) }] };
12
+ }
13
+ function failure(err) {
14
+ const code = err instanceof CalciteError ? err.code : err?.code;
15
+ const message = err instanceof Error ? err.message : String(err);
16
+ return { isError: true, content: [{ type: 'text', text: code ? `[${code}] ${message}` : message }] };
17
+ }
18
+ /** Wraps a handler so every failure becomes an MCP tool error instead of a protocol error. */
19
+ function safe(fn) {
20
+ return async (args) => {
21
+ try {
22
+ return await fn(args);
23
+ }
24
+ catch (err) {
25
+ return failure(err);
26
+ }
27
+ };
28
+ }
29
+ const clientName = z.string().optional().describe('Client name; may be omitted when exactly one client is running');
30
+ const entityFilter = {
31
+ radius: z.number().positive().optional().describe('Only entities within this many blocks of the player'),
32
+ type: z.string().optional().describe('Entity type id, e.g. "minecraft:player" or "zombie"'),
33
+ uuid: z.string().optional(),
34
+ name: z.string().optional().describe('Case-insensitive substring of the name or custom name'),
35
+ limit: z.number().int().positive().max(1000).optional(),
36
+ includeSelf: z.boolean().optional(),
37
+ };
38
+ export function createMcpServer(opts = {}) {
39
+ const paths = resolvePaths();
40
+ const manager = new ClientManager();
41
+ const logins = new Map();
42
+ let loginSeq = 0;
43
+ const server = new McpServer({ name: 'calcite', version: VERSION }, {
44
+ instructions: [
45
+ 'Calcite drives real Minecraft Java Edition clients (any version 1.14.4+ fully, older versions launch without probe features).',
46
+ 'Typical flow: launch_client (first launch of a version downloads ~0.5-1 GB and can take minutes) → get_state / get_entities / send_chat / run_command / screenshot / wait_for → stop_client.',
47
+ 'Acting: look / walk_to / move to get around, attack and use (right click: chests, doors, placing blocks, eating) on entity ids from get_entities or block coordinates, dig to mine, get_inventory / select_slot for items, get_container / click_slot / close_container for chests and other containers. Check results with get_state, get_target, get_block or a screenshot.',
48
+ 'Offline accounts need no login. For premium servers call account_login_start, show the URL to the user, then poll account_login_status.',
49
+ 'Screenshots need render "on-demand" (default) or "always"; with "on-demand" frames are only rendered while a screenshot is taken, keeping CPU usage low.',
50
+ 'Mods: launch_client with loader "fabric", "forge" or "neoforge" (installed on first use) and mods such as "modrinth:fabric-api", URLs or local jars.',
51
+ ].join('\n'),
52
+ });
53
+ server.registerTool('launch_client', {
54
+ title: 'Launch a Minecraft client',
55
+ description: 'Downloads (if needed) and starts a Minecraft client, optionally joining a server. Resolves once the player is in the world (or on the title screen without a server).',
56
+ inputSchema: {
57
+ name: z.string().regex(/^[A-Za-z0-9_.-]{1,32}$/).describe('Unique client name; also the instance directory'),
58
+ version: z.string().default('release').describe('Minecraft version id, "release" (latest release) or "snapshot"'),
59
+ loader: z
60
+ .string()
61
+ .optional()
62
+ .describe('Mod loader: "fabric", "forge" or "neoforge", optionally with a version ("fabric@0.19.5"); installed on first use'),
63
+ mods: z
64
+ .array(z.string())
65
+ .optional()
66
+ .describe('Mods (needs loader): "modrinth:<project>[@version]" (with required dependencies), http(s) URLs of jars, or local jar/folder paths'),
67
+ server: z.string().optional().describe('host[:port] to join'),
68
+ username: z.string().optional().describe('Offline username (3-16 chars). Ignored when microsoft is set'),
69
+ microsoft: z.union([z.boolean(), z.string()]).optional().describe('Use a stored Microsoft account: true for the primary one or the profile name'),
70
+ render: z.enum(['on-demand', 'always', 'off']).optional().describe('on-demand (default): render only for screenshots; always; off: no renderer at all'),
71
+ memory: z.string().regex(/^\d+[MG]$/).optional().describe('Max heap, e.g. "2G"'),
72
+ reconnect: z.boolean().optional().describe('Relaunch and rejoin after a disconnect/crash (default true)'),
73
+ timeoutSeconds: z.number().int().positive().optional().describe('Startup timeout (default 900)'),
74
+ },
75
+ }, safe(async (a) => {
76
+ const account = a.microsoft
77
+ ? { type: 'microsoft', name: typeof a.microsoft === 'string' ? a.microsoft : undefined }
78
+ : { type: 'offline', username: a.username ?? defaultUsername(a.name) };
79
+ const client = await manager.launch({
80
+ ...opts.defaults,
81
+ name: a.name,
82
+ version: a.version,
83
+ loader: a.loader,
84
+ mods: a.mods,
85
+ server: a.server,
86
+ account,
87
+ render: a.render ?? opts.defaults?.render,
88
+ memory: a.memory ?? opts.defaults?.memory,
89
+ reconnect: a.reconnect ?? opts.defaults?.reconnect,
90
+ startTimeoutMs: a.timeoutSeconds ? a.timeoutSeconds * 1000 : opts.defaults?.startTimeoutMs,
91
+ });
92
+ return text(client.status());
93
+ }));
94
+ server.registerTool('stop_client', { title: 'Stop a client', description: 'Stops the game and frees its resources.', inputSchema: { client: clientName } }, safe(async ({ client }) => {
95
+ const target = manager.resolve(client);
96
+ await manager.stop(target.options.name);
97
+ return text(`Stopped ${target.options.name}`);
98
+ }));
99
+ server.registerTool('list_clients', { title: 'List clients', description: 'Status of every client managed by this server.', inputSchema: {} }, safe(async () => text(manager.list())));
100
+ server.registerTool('get_state', {
101
+ title: 'Client state',
102
+ description: 'Lifecycle status plus live game state: screen, position, health, dimension, fps, disconnect reason.',
103
+ inputSchema: { client: clientName },
104
+ }, safe(async ({ client }) => {
105
+ const target = manager.resolve(client);
106
+ const status = target.status();
107
+ if (status.probeConnected) {
108
+ try {
109
+ status.game = await target.state();
110
+ }
111
+ catch {
112
+ // keep the last polled state
113
+ }
114
+ }
115
+ return text(status);
116
+ }));
117
+ server.registerTool('get_entities', {
118
+ title: 'Entities the client sees',
119
+ description: 'Entities currently known to the client (what the server actually sent), with position, type, names and vehicle.',
120
+ inputSchema: { client: clientName, ...entityFilter },
121
+ }, safe(async ({ client, ...query }) => {
122
+ const list = await manager.resolve(client).entities(query);
123
+ return text({ count: list.length, entities: list });
124
+ }));
125
+ server.registerTool('send_chat', { title: 'Send chat', description: 'Sends a chat message as the player.', inputSchema: { client: clientName, message: z.string().min(1).max(256) } }, safe(async ({ client, message }) => {
126
+ await manager.resolve(client).chat(message);
127
+ return text('sent');
128
+ }));
129
+ server.registerTool('run_command', {
130
+ title: 'Run command',
131
+ description: 'Runs a command as the player (leading "/" optional). Output arrives as chat; use get_chat or wait_for to read it.',
132
+ inputSchema: { client: clientName, command: z.string().min(1).max(32_000) },
133
+ }, safe(async ({ client, command }) => {
134
+ const target = manager.resolve(client);
135
+ const before = target.chatSince(0).at(-1)?.seq ?? 0;
136
+ await target.command(command.replace(/^\//, ''));
137
+ await new Promise((r) => setTimeout(r, 750));
138
+ return text({ sent: true, chatSince: target.chatSince(before) });
139
+ }));
140
+ server.registerTool('screenshot', {
141
+ title: 'Screenshot',
142
+ description: 'Renders and returns the current view as a PNG image.',
143
+ inputSchema: { client: clientName, keep: z.boolean().optional().describe('Also keep the file in the instance screenshots folder') },
144
+ }, safe(async ({ client, keep }) => {
145
+ const shot = await manager.resolve(client).screenshot({ keep });
146
+ const content = [{ type: 'image', data: shot.png.toString('base64'), mimeType: 'image/png' }];
147
+ if (shot.path)
148
+ content.push({ type: 'text', text: shot.path });
149
+ return { content };
150
+ }));
151
+ server.registerTool('wait_for', {
152
+ title: 'Wait for a condition',
153
+ description: 'Blocks until a chat line matches, an entity appears/disappears, or the client reaches a phase.',
154
+ inputSchema: {
155
+ client: clientName,
156
+ chat: z.string().optional().describe('Case-insensitive regular expression matched against new chat lines'),
157
+ entity: z.object({ ...entityFilter, present: z.boolean().optional().describe('false waits for it to disappear') }).optional(),
158
+ phase: z.enum(['in_game', 'disconnected', 'reconnecting', 'crashed', 'stopped']).optional(),
159
+ timeoutSeconds: z.number().positive().max(600).default(30),
160
+ },
161
+ }, safe(async ({ client, timeoutSeconds, ...cond }) => {
162
+ if (!cond.chat && !cond.entity && !cond.phase)
163
+ throw new CalciteError('bad_condition', 'Give chat, entity or phase');
164
+ return text(await manager.resolve(client).waitFor(cond, timeoutSeconds * 1000));
165
+ }));
166
+ server.registerTool('get_chat', {
167
+ title: 'Chat history',
168
+ description: 'Chat lines received by the client. Pass the last seen seq as "since" to get only new lines.',
169
+ inputSchema: { client: clientName, since: z.number().int().nonnegative().optional(), limit: z.number().int().positive().max(1000).default(50) },
170
+ }, safe(async ({ client, since, limit }) => text(manager.resolve(client).chatSince(since ?? 0, limit))));
171
+ server.registerTool('get_logs', {
172
+ title: 'Client logs',
173
+ description: 'Game and Calcite log lines (useful when a launch fails or the client crashed).',
174
+ inputSchema: {
175
+ client: clientName,
176
+ since: z.number().int().nonnegative().optional(),
177
+ limit: z.number().int().positive().max(2000).default(100),
178
+ contains: z.string().optional(),
179
+ source: z.enum(['game', 'calcite']).optional(),
180
+ },
181
+ }, safe(async ({ client, ...q }) => text(manager.resolve(client).logsSince(q))));
182
+ server.registerTool('set_render', {
183
+ title: 'Toggle continuous rendering',
184
+ description: 'Turns continuous rendering on (e.g. while watching) or off (saves CPU). Screenshots work either way.',
185
+ inputSchema: { client: clientName, enabled: z.boolean() },
186
+ }, safe(async ({ client, enabled }) => {
187
+ await manager.resolve(client).setRender(enabled);
188
+ return text(`render ${enabled ? 'on' : 'off'}`);
189
+ }));
190
+ server.registerTool('respawn', { title: 'Respawn', description: 'Respawns the player after death.', inputSchema: { client: clientName } }, safe(async ({ client }) => {
191
+ await manager.resolve(client).respawn();
192
+ return text('respawned');
193
+ }));
194
+ const coord = z.number().describe('Block coordinate');
195
+ const face = z.enum(['down', 'up', 'north', 'south', 'west', 'east']).optional().describe('Block face to target (default: the face nearest to the player)');
196
+ server.registerTool('look', {
197
+ title: 'Look',
198
+ description: 'Turns the player: either to yaw/pitch in degrees (yaw 0 = south, 90 = west, 180 = north, -90 = east; pitch -90 = up, 90 = down) or towards the point x/y/z.',
199
+ inputSchema: {
200
+ client: clientName,
201
+ yaw: z.number().optional(),
202
+ pitch: z.number().min(-90).max(90).optional(),
203
+ x: z.number().optional(),
204
+ y: z.number().optional(),
205
+ z: z.number().optional(),
206
+ },
207
+ }, safe(async ({ client, yaw, pitch, x, y, z: zz }) => {
208
+ const target = manager.resolve(client);
209
+ if (x !== undefined || y !== undefined || zz !== undefined) {
210
+ if (x === undefined || y === undefined || zz === undefined)
211
+ throw new CalciteError('bad_request', 'Give all of x, y and z');
212
+ return text(await target.look({ x, y, z: zz }));
213
+ }
214
+ return text(await target.look({ yaw, pitch }));
215
+ }));
216
+ server.registerTool('walk_to', {
217
+ title: 'Walk to a position',
218
+ description: 'Walks in a straight line to x/z (jumps over single blocks, swims). Returns arrived=false with reason "stuck" or "timeout" when blocked; there is no path finding, so route around obstacles with intermediate points.',
219
+ inputSchema: {
220
+ client: clientName,
221
+ x: z.number(),
222
+ z: z.number(),
223
+ range: z.number().positive().max(16).default(0.5).describe('Stop within this many blocks'),
224
+ sprint: z.boolean().default(true),
225
+ timeoutSeconds: z.number().positive().max(600).default(60),
226
+ },
227
+ }, safe(async ({ client, x, z: zz, range, sprint, timeoutSeconds }) => text(await manager.resolve(client).walkTo(x, zz, { range, sprint, timeoutMs: timeoutSeconds * 1000 }))));
228
+ server.registerTool('move', {
229
+ title: 'Hold movement keys',
230
+ description: 'Presses (true) or releases (false) movement keys; omitted keys keep their state. With ticks (20 per second) they are released automatically, otherwise they stay held until changed or stop_actions.',
231
+ inputSchema: {
232
+ client: clientName,
233
+ forward: z.boolean().optional(),
234
+ back: z.boolean().optional(),
235
+ left: z.boolean().optional(),
236
+ right: z.boolean().optional(),
237
+ jump: z.boolean().optional(),
238
+ sneak: z.boolean().optional(),
239
+ sprint: z.boolean().optional(),
240
+ ticks: z.number().int().positive().max(12_000).optional(),
241
+ },
242
+ }, safe(async ({ client, ticks, ...controls }) => text(await manager.resolve(client).move(controls, { ticks }))));
243
+ server.registerTool('stop_actions', { title: 'Stop actions', description: 'Releases all keys and cancels a running walk_to, dig or held use.', inputSchema: { client: clientName } }, safe(async ({ client }) => {
244
+ await manager.resolve(client).stopActions();
245
+ return text('stopped');
246
+ }));
247
+ server.registerTool('attack', {
248
+ title: 'Attack (left click)',
249
+ description: 'Attacks the entity with this id (from get_entities; the player turns to it, must be within reach) or, without an id, whatever the crosshair points at.',
250
+ inputSchema: { client: clientName, entityId: z.number().int().optional() },
251
+ }, safe(async ({ client, entityId }) => text(await manager.resolve(client).attack(entityId))));
252
+ server.registerTool('use', {
253
+ title: 'Use / interact (right click)',
254
+ description: 'Right click on an entity (entityId: trade, ride, feed...), on a block (x/y/z: open chests and doors, press buttons, place the held block against that face) or, with neither, on whatever the crosshair points at / the held item in the air. holdTicks keeps the button held (eat, drink, draw a bow).',
255
+ inputSchema: {
256
+ client: clientName,
257
+ entityId: z.number().int().optional(),
258
+ x: coord.optional(),
259
+ y: coord.optional(),
260
+ z: coord.optional(),
261
+ face,
262
+ holdTicks: z.number().int().positive().max(1200).optional(),
263
+ },
264
+ }, safe(async ({ client, entityId, x, y, z: zz, face: f, holdTicks }) => {
265
+ const hasBlock = x !== undefined || y !== undefined || zz !== undefined;
266
+ if (hasBlock && (x === undefined || y === undefined || zz === undefined))
267
+ throw new CalciteError('bad_request', 'Give all of x, y and z');
268
+ const block = hasBlock ? { x: x, y: y, z: zz, face: f } : undefined;
269
+ return text(await manager.resolve(client).use({ entityId, block, holdTicks }));
270
+ }));
271
+ server.registerTool('dig', {
272
+ title: 'Mine a block',
273
+ description: 'Mines the block at x/y/z like a player holding left click (real break time in survival, instant in creative). The block must be within reach.',
274
+ inputSchema: { client: clientName, x: coord, y: coord, z: coord, face, timeoutSeconds: z.number().positive().max(300).default(30) },
275
+ }, safe(async ({ client, timeoutSeconds, face: f, ...pos }) => text(await manager.resolve(client).dig({ ...pos, face: f }, { timeoutMs: timeoutSeconds * 1000 }))));
276
+ server.registerTool('get_block', { title: 'Block at a position', description: 'Block id and state properties at x/y/z as the client sees them.', inputSchema: { client: clientName, x: coord, y: coord, z: coord } }, safe(async ({ client, ...pos }) => text(await manager.resolve(client).block(pos))));
277
+ server.registerTool('get_target', { title: 'Crosshair target', description: 'The block (with face) or entity the crosshair points at.', inputSchema: { client: clientName } }, safe(async ({ client }) => text(await manager.resolve(client).target())));
278
+ server.registerTool('get_inventory', {
279
+ title: 'Inventory',
280
+ description: 'Non-empty inventory slots (0-8 hotbar, 9-35 main, 36-39 armor, 40 offhand) and the selected hotbar slot.',
281
+ inputSchema: { client: clientName },
282
+ }, safe(async ({ client }) => text(await manager.resolve(client).inventory())));
283
+ server.registerTool('select_slot', { title: 'Select hotbar slot', description: 'Selects hotbar slot 0-8 (the held item).', inputSchema: { client: clientName, slot: z.number().int().min(0).max(8) } }, safe(async ({ client, slot }) => text(await manager.resolve(client).selectSlot(slot))));
284
+ server.registerTool('get_container', {
285
+ title: 'Open container',
286
+ description: 'The open container (chest, barrel, furnace, villager trades...) with its non-empty slots; slots 0..containerSlots-1 are the container, the rest the player inventory. waitSeconds waits for one to open, e.g. right after use on a chest.',
287
+ inputSchema: { client: clientName, waitSeconds: z.number().min(0).max(30).default(0) },
288
+ }, safe(async ({ client, waitSeconds }) => text(await manager.resolve(client).container({ waitMs: waitSeconds * 1000 }))));
289
+ server.registerTool('click_slot', {
290
+ title: 'Click a container slot',
291
+ description: 'Clicks a slot of the open container (or of the inventory when none is open) and returns the new contents. mode: pickup (button 0 left / 1 right), quick_move (shift click: move the stack between container and inventory), swap (button = hotbar slot 0-8, 40 offhand), throw (button 1 = whole stack), clone, quick_craft, pickup_all. Slot -999 clicks outside (drops the carried stack).',
292
+ inputSchema: {
293
+ client: clientName,
294
+ slot: z.number().int().min(-999),
295
+ button: z.number().int().min(0).max(40).default(0),
296
+ mode: z.enum(['pickup', 'quick_move', 'swap', 'clone', 'throw', 'quick_craft', 'pickup_all']).default('pickup'),
297
+ },
298
+ }, safe(async ({ client, slot, button, mode }) => text(await manager.resolve(client).click(slot, { button, mode }))));
299
+ server.registerTool('close_container', { title: 'Close container', description: 'Closes the open container or screen.', inputSchema: { client: clientName } }, safe(async ({ client }) => {
300
+ await manager.resolve(client).closeContainer();
301
+ return text('closed');
302
+ }));
303
+ server.registerTool('drop_item', { title: 'Drop item', description: 'Drops one item, or the whole stack, from the selected hotbar slot.', inputSchema: { client: clientName, all: z.boolean().default(false) } }, safe(async ({ client, all }) => text(await manager.resolve(client).drop({ all }))));
304
+ server.registerTool('install_version', {
305
+ title: 'Pre-download a version',
306
+ description: 'Downloads a version (client, libraries, assets, Java, optionally a mod loader) without launching, so the next launch is fast.',
307
+ inputSchema: {
308
+ version: z.string().default('release'),
309
+ loader: z.string().optional().describe('Also install a mod loader: "fabric", "forge" or "neoforge", optionally "@<version>"'),
310
+ },
311
+ }, safe(async ({ version, loader }) => text(await installVersion(version, { paths, loader }))));
312
+ server.registerTool('list_versions', {
313
+ title: 'Available versions',
314
+ description: 'Minecraft versions from Mojang\'s manifest (newest first).',
315
+ inputSchema: { type: z.enum(['release', 'snapshot', 'old_beta', 'old_alpha', 'all']).default('release'), limit: z.number().int().positive().default(30) },
316
+ }, safe(async ({ type, limit }) => {
317
+ const manifest = await getManifest(paths);
318
+ const versions = manifest.versions.filter((v) => type === 'all' || v.type === type).slice(0, limit);
319
+ return text({ latest: manifest.latest, versions: versions.map((v) => ({ id: v.id, type: v.type, releaseTime: v.releaseTime })) });
320
+ }));
321
+ server.registerTool('account_list', { title: 'Stored Microsoft accounts', description: 'Microsoft accounts whose login is saved.', inputSchema: {} }, safe(async () => text(await listAccounts(paths))));
322
+ server.registerTool('account_login_start', {
323
+ title: 'Start Microsoft login',
324
+ description: 'Starts a Microsoft device login. Returns a URL the user must open in a browser and approve; then poll account_login_status. The session is saved and refreshed automatically.',
325
+ inputSchema: {},
326
+ }, safe(async () => {
327
+ const id = ++loginSeq;
328
+ const handle = await startLogin(paths);
329
+ const entry = { handle };
330
+ logins.set(id, entry);
331
+ handle.done.then((n) => (entry.result = n), (e) => (entry.error = e.message));
332
+ entry.url = await handle.url;
333
+ return text({ loginId: id, url: entry.url, next: 'Ask the user to open the URL and sign in, then call account_login_status' });
334
+ }));
335
+ server.registerTool('account_login_status', {
336
+ title: 'Microsoft login status',
337
+ description: 'Waits up to waitSeconds for a pending login started with account_login_start.',
338
+ inputSchema: { loginId: z.number().int(), waitSeconds: z.number().min(0).max(120).default(30) },
339
+ }, safe(async ({ loginId, waitSeconds }) => {
340
+ const entry = logins.get(loginId);
341
+ if (!entry)
342
+ throw new CalciteError('unknown_login', `No login with id ${loginId}`);
343
+ if (!entry.result && !entry.error) {
344
+ await Promise.race([entry.handle.done.catch(() => undefined), new Promise((r) => setTimeout(r, waitSeconds * 1000))]);
345
+ }
346
+ if (entry.result)
347
+ return text({ status: 'done', account: entry.result });
348
+ if (entry.error)
349
+ return text({ status: 'failed', error: entry.error });
350
+ return text({ status: 'pending', url: entry.url });
351
+ }));
352
+ server.registerTool('account_remove', { title: 'Remove a stored account', description: 'Deletes a saved Microsoft login.', inputSchema: { account: z.string() } }, safe(async ({ account }) => {
353
+ if (!(await removeAccount(paths, account)))
354
+ throw new CalciteError('unknown_account', `No stored account named "${account}"`);
355
+ return text(`Removed ${account}`);
356
+ }));
357
+ return { server, manager };
358
+ }
359
+ /** Runs the MCP server over stdio until the client disconnects. stdout carries only protocol messages. */
360
+ export async function runMcpStdio(opts = {}) {
361
+ const { server, manager } = createMcpServer(opts);
362
+ const transport = new StdioServerTransport();
363
+ let closing = false;
364
+ const close = async () => {
365
+ if (closing)
366
+ return;
367
+ closing = true;
368
+ await manager.stopAll();
369
+ process.exit(0);
370
+ };
371
+ transport.onclose = () => void close();
372
+ process.stdin.once('end', () => void close());
373
+ process.once('SIGINT', () => void close());
374
+ process.once('SIGTERM', () => void close());
375
+ await server.connect(transport);
376
+ }
377
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
package/dist/mods.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import type { LoaderKind } from './loaders.js';
2
+ import type { CalcitePaths } from './paths.js';
3
+ /** A mod jar ready to be placed in the game's mods folder. */
4
+ export interface ModFile {
5
+ /** File name inside the mods folder. */
6
+ name: string;
7
+ /** Local source file. */
8
+ file: string;
9
+ /** Where it came from (the spec, or "<spec> → dependency"). */
10
+ source: string;
11
+ }
12
+ /**
13
+ * Resolves mod specs to local jars: a jar or folder of jars, an http(s) URL, or "modrinth:<project>[@<version>]"
14
+ * (the newest release for this Minecraft version and loader, plus its required dependencies).
15
+ */
16
+ export declare function resolveMods(paths: CalcitePaths, specs: string[], mc: string, loader: LoaderKind): Promise<ModFile[]>;
17
+ /**
18
+ * Makes {@code gameDir}/mods contain exactly the given Calcite-managed mods. Files Calcite did not place there are
19
+ * left alone; managed files no longer requested are removed.
20
+ */
21
+ export declare function syncMods(gameDir: string, mods: ModFile[]): Promise<void>;
package/dist/mods.js ADDED
@@ -0,0 +1,135 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { copyFile, mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
3
+ import { basename, join, resolve } from 'node:path';
4
+ import { download, httpJson } from './net.js';
5
+ import { CalciteError } from './types.js';
6
+ const MODRINTH_API = 'https://api.modrinth.com/v2';
7
+ const MANIFEST = '.calcite-mods.json';
8
+ function safeName(name) {
9
+ const clean = basename(name.replace(/\\/g, '/'));
10
+ if (!clean || clean.startsWith('.') || !clean.toLowerCase().endsWith('.jar')) {
11
+ throw new CalciteError('bad_mod', `Not a mod jar: "${name}"`);
12
+ }
13
+ return clean;
14
+ }
15
+ async function modrinthVersion(project, version, mc, loader) {
16
+ const query = `loaders=${encodeURIComponent(JSON.stringify([loader]))}&game_versions=${encodeURIComponent(JSON.stringify([mc]))}`;
17
+ let versions;
18
+ try {
19
+ versions = await httpJson(`${MODRINTH_API}/project/${encodeURIComponent(project)}/version?${query}`);
20
+ }
21
+ catch (err) {
22
+ if (err.status === 404)
23
+ throw new CalciteError('mod_not_found', `Modrinth has no project "${project}"`);
24
+ throw err;
25
+ }
26
+ const pick = version
27
+ ? versions.find((v) => v.version_number === version || v.id === version)
28
+ : (versions.find((v) => v.version_type === 'release') ?? versions[0]);
29
+ if (!pick) {
30
+ throw new CalciteError('mod_not_found', `Modrinth project "${project}" has no ${version ? `version "${version}"` : 'version'} for ${loader} on Minecraft ${mc}`);
31
+ }
32
+ return pick;
33
+ }
34
+ async function modrinthFile(paths, v) {
35
+ const f = v.files.find((x) => x.primary) ?? v.files[0];
36
+ if (!f)
37
+ throw new CalciteError('mod_not_found', `Modrinth version ${v.id} has no files`);
38
+ const name = safeName(f.filename);
39
+ const file = join(paths.mods, 'modrinth', f.hashes.sha1, name);
40
+ await download(f.url, file, { sha1: f.hashes.sha1 });
41
+ return { name, file };
42
+ }
43
+ async function localJars(spec) {
44
+ const path = resolve(spec);
45
+ let info;
46
+ try {
47
+ info = await stat(path);
48
+ }
49
+ catch {
50
+ throw new CalciteError('mod_not_found', `Mod file or folder not found: ${path}`);
51
+ }
52
+ if (!info.isDirectory())
53
+ return [path];
54
+ return (await readdir(path)).filter((n) => n.toLowerCase().endsWith('.jar')).sort().map((n) => join(path, n));
55
+ }
56
+ /**
57
+ * Resolves mod specs to local jars: a jar or folder of jars, an http(s) URL, or "modrinth:<project>[@<version>]"
58
+ * (the newest release for this Minecraft version and loader, plus its required dependencies).
59
+ */
60
+ export async function resolveMods(paths, specs, mc, loader) {
61
+ const mods = [];
62
+ const projects = new Set();
63
+ const pending = [];
64
+ for (const raw of specs) {
65
+ const spec = raw.trim();
66
+ if (!spec)
67
+ continue;
68
+ const modrinth = /^modrinth:([^@\s]+)(?:@(\S+))?$/i.exec(spec);
69
+ if (modrinth) {
70
+ pending.push({ project: modrinth[1], version: modrinth[2], source: spec });
71
+ }
72
+ else if (/^https?:\/\//i.test(spec)) {
73
+ const url = new URL(spec);
74
+ const name = safeName(decodeURIComponent(url.pathname));
75
+ const file = join(paths.mods, 'url', createHash('sha256').update(spec).digest('hex').slice(0, 16), name);
76
+ await download(spec, file);
77
+ mods.push({ name, file, source: spec });
78
+ }
79
+ else {
80
+ for (const file of await localJars(spec))
81
+ mods.push({ name: safeName(file), file, source: spec });
82
+ }
83
+ }
84
+ // Modrinth projects and their required dependencies, breadth first
85
+ while (pending.length) {
86
+ const next = pending.shift();
87
+ const v = await modrinthVersion(next.project, next.version, mc, loader);
88
+ if (projects.has(v.project_id))
89
+ continue;
90
+ projects.add(v.project_id);
91
+ mods.push({ ...(await modrinthFile(paths, v)), source: next.source });
92
+ for (const dep of v.dependencies) {
93
+ if (dep.dependency_type !== 'required' || !dep.project_id || projects.has(dep.project_id))
94
+ continue;
95
+ pending.push({ project: dep.project_id, source: `${next.source} → dependency` });
96
+ }
97
+ }
98
+ const seen = new Map();
99
+ for (const m of mods) {
100
+ const other = seen.get(m.name);
101
+ if (other && other !== m.file)
102
+ throw new CalciteError('bad_mod', `Two mods share the file name ${m.name}`);
103
+ seen.set(m.name, m.file);
104
+ }
105
+ return mods.filter((m, i) => mods.findIndex((x) => x.name === m.name) === i);
106
+ }
107
+ /**
108
+ * Makes {@code gameDir}/mods contain exactly the given Calcite-managed mods. Files Calcite did not place there are
109
+ * left alone; managed files no longer requested are removed.
110
+ */
111
+ export async function syncMods(gameDir, mods) {
112
+ const dir = join(gameDir, 'mods');
113
+ const manifest = join(dir, MANIFEST);
114
+ let previous = [];
115
+ try {
116
+ previous = JSON.parse(await readFile(manifest, 'utf8')).files ?? [];
117
+ }
118
+ catch {
119
+ // first sync
120
+ }
121
+ const wanted = new Set(mods.map((m) => m.name));
122
+ for (const name of previous) {
123
+ if (!wanted.has(name))
124
+ await rm(join(dir, basename(name)), { force: true });
125
+ }
126
+ if (!mods.length) {
127
+ await rm(manifest, { force: true });
128
+ return;
129
+ }
130
+ await mkdir(dir, { recursive: true });
131
+ for (const m of mods)
132
+ await copyFile(m.file, join(dir, m.name));
133
+ await writeFile(manifest, JSON.stringify({ files: [...wanted] }, null, 2));
134
+ }
135
+ //# sourceMappingURL=mods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mods.js","sourceRoot":"","sources":["../src/mods.ts"],"names":[],"mappings":"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"}