@codehawks/agent-battle-arena-mcp 1.0.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 (74) hide show
  1. package/README.md +112 -0
  2. package/dist/data/creatures.d.ts +6 -0
  3. package/dist/data/creatures.d.ts.map +1 -0
  4. package/dist/data/creatures.js +524 -0
  5. package/dist/data/creatures.js.map +1 -0
  6. package/dist/data/moves.d.ts +5 -0
  7. package/dist/data/moves.d.ts.map +1 -0
  8. package/dist/data/moves.js +1034 -0
  9. package/dist/data/moves.js.map +1 -0
  10. package/dist/data/sprites.d.ts +6 -0
  11. package/dist/data/sprites.d.ts.map +1 -0
  12. package/dist/data/sprites.js +5 -0
  13. package/dist/data/sprites.js.map +1 -0
  14. package/dist/data/types.d.ts +115 -0
  15. package/dist/data/types.d.ts.map +1 -0
  16. package/dist/data/types.js +29 -0
  17. package/dist/data/types.js.map +1 -0
  18. package/dist/engine/ai.d.ts +4 -0
  19. package/dist/engine/ai.d.ts.map +1 -0
  20. package/dist/engine/ai.js +138 -0
  21. package/dist/engine/ai.js.map +1 -0
  22. package/dist/engine/battle.d.ts +12 -0
  23. package/dist/engine/battle.d.ts.map +1 -0
  24. package/dist/engine/battle.js +313 -0
  25. package/dist/engine/battle.js.map +1 -0
  26. package/dist/engine/damage.d.ts +14 -0
  27. package/dist/engine/damage.d.ts.map +1 -0
  28. package/dist/engine/damage.js +51 -0
  29. package/dist/engine/damage.js.map +1 -0
  30. package/dist/engine/effects.d.ts +9 -0
  31. package/dist/engine/effects.d.ts.map +1 -0
  32. package/dist/engine/effects.js +99 -0
  33. package/dist/engine/effects.js.map +1 -0
  34. package/dist/engine/typeChart.d.ts +7 -0
  35. package/dist/engine/typeChart.d.ts.map +1 -0
  36. package/dist/engine/typeChart.js +73 -0
  37. package/dist/engine/typeChart.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +14 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/server.d.ts +3 -0
  43. package/dist/server.d.ts.map +1 -0
  44. package/dist/server.js +97 -0
  45. package/dist/server.js.map +1 -0
  46. package/dist/tools/getMoveInfo.d.ts +4 -0
  47. package/dist/tools/getMoveInfo.d.ts.map +1 -0
  48. package/dist/tools/getMoveInfo.js +33 -0
  49. package/dist/tools/getMoveInfo.js.map +1 -0
  50. package/dist/tools/getSprites.d.ts +2 -0
  51. package/dist/tools/getSprites.d.ts.map +1 -0
  52. package/dist/tools/getSprites.js +15 -0
  53. package/dist/tools/getSprites.js.map +1 -0
  54. package/dist/tools/getState.d.ts +2 -0
  55. package/dist/tools/getState.d.ts.map +1 -0
  56. package/dist/tools/getState.js +18 -0
  57. package/dist/tools/getState.js.map +1 -0
  58. package/dist/tools/listCreatures.d.ts +4 -0
  59. package/dist/tools/listCreatures.d.ts.map +1 -0
  60. package/dist/tools/listCreatures.js +36 -0
  61. package/dist/tools/listCreatures.js.map +1 -0
  62. package/dist/tools/makeMove.d.ts +4 -0
  63. package/dist/tools/makeMove.d.ts.map +1 -0
  64. package/dist/tools/makeMove.js +21 -0
  65. package/dist/tools/makeMove.js.map +1 -0
  66. package/dist/tools/startBattle.d.ts +6 -0
  67. package/dist/tools/startBattle.d.ts.map +1 -0
  68. package/dist/tools/startBattle.js +22 -0
  69. package/dist/tools/startBattle.js.map +1 -0
  70. package/dist/utils/rng.d.ts +11 -0
  71. package/dist/utils/rng.d.ts.map +1 -0
  72. package/dist/utils/rng.js +26 -0
  73. package/dist/utils/rng.js.map +1 -0
  74. package/package.json +45 -0
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { createServer } from './server.js';
4
+ async function main() {
5
+ const server = createServer();
6
+ const transport = new StdioServerTransport();
7
+ await server.connect(transport);
8
+ console.error('Agent Battle Arena MCP server running on stdio');
9
+ }
10
+ main().catch((error) => {
11
+ console.error('Fatal error:', error);
12
+ process.exit(1);
13
+ });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;AAClE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createServer(): McpServer;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,wBAAgB,YAAY,IAAI,SAAS,CAgIxC"}
package/dist/server.js ADDED
@@ -0,0 +1,97 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { z } from 'zod';
3
+ import { handleStartBattle } from './tools/startBattle.js';
4
+ import { handleMakeMove } from './tools/makeMove.js';
5
+ import { handleGetState } from './tools/getState.js';
6
+ import { handleListCreatures } from './tools/listCreatures.js';
7
+ import { handleGetMoveInfo } from './tools/getMoveInfo.js';
8
+ import { handleGetSprites } from './tools/getSprites.js';
9
+ export function createServer() {
10
+ const server = new McpServer({
11
+ name: 'agent-battle-arena',
12
+ version: '1.0.0',
13
+ });
14
+ // === start_battle ===
15
+ server.tool('start_battle', `Start a new creature battle! IMPORTANT UX RULES:
16
+ - If the user says "let's battle" or similar, just call start_battle immediately with NO player_creature (random assignment) — do NOT list creatures first.
17
+ - Only call list_creatures if the user explicitly asks to choose or browse creatures.
18
+ - After getting the result, call get_battle_sprites ONCE, then render a React artifact showing the battle arena with sprites, health bars, moves as clickable-looking buttons, type matchups, and battle log.
19
+ - Keep your text response SHORT — just a dramatic one-liner intro. The artifact IS the UI.`, {
20
+ player_creature: z.string().optional().describe('Creature name. OMIT for random assignment (preferred for fast start).'),
21
+ difficulty: z.enum(['easy', 'normal', 'hard']).default('normal').describe('AI difficulty.'),
22
+ mode: z.enum(['single', 'best_of_3']).default('single').describe('Single battle or best of 3.'),
23
+ }, async (args) => {
24
+ try {
25
+ const result = handleStartBattle(args);
26
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
27
+ }
28
+ catch (e) {
29
+ return { content: [{ type: 'text', text: JSON.stringify({ error: e.message }) }], isError: true };
30
+ }
31
+ });
32
+ // === make_move ===
33
+ server.tool('make_move', `Execute a move. Resolves BOTH player and opponent turns in one call.
34
+ After getting the result, UPDATE the React artifact with new HP, last round results, and battle log.
35
+ Narrate the round dramatically in 1-2 sentences. Do NOT re-fetch sprites — reuse them from the initial artifact.`, {
36
+ move_name: z.string().describe('Move name (e.g. "Thunder Strike"). Must be one of your creature\'s moves shown in the artifact.'),
37
+ }, async (args) => {
38
+ try {
39
+ const result = handleMakeMove(args);
40
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
41
+ }
42
+ catch (e) {
43
+ return { content: [{ type: 'text', text: JSON.stringify({ error: e.message }) }], isError: true };
44
+ }
45
+ });
46
+ // === get_state ===
47
+ server.tool('get_state', 'Re-read the current battle state without making a move. Use to plan strategy.', {}, async (args) => {
48
+ try {
49
+ const result = handleGetState(args);
50
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
51
+ }
52
+ catch (e) {
53
+ return { content: [{ type: 'text', text: JSON.stringify({ error: e.message }) }], isError: true };
54
+ }
55
+ });
56
+ // === list_creatures ===
57
+ server.tool('list_creatures', `List available creatures. ONLY call this if the user explicitly asks to browse or choose a creature.
58
+ Do NOT call this when the user just says "let's battle" — use start_battle with random assignment instead.`, {
59
+ type_filter: z.string().optional().describe('Filter by type (e.g. "fire"). Omit for all.'),
60
+ }, async (args) => {
61
+ try {
62
+ const result = handleListCreatures(args);
63
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
64
+ }
65
+ catch (e) {
66
+ return { content: [{ type: 'text', text: JSON.stringify({ error: e.message }) }], isError: true };
67
+ }
68
+ });
69
+ // === get_move_info ===
70
+ server.tool('get_move_info', 'Get detailed info about a specific move. Only call if the user asks about a particular move.', {
71
+ move_name: z.string().describe('Move name to look up.'),
72
+ }, async (args) => {
73
+ try {
74
+ const result = handleGetMoveInfo(args);
75
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
76
+ }
77
+ catch (e) {
78
+ return { content: [{ type: 'text', text: JSON.stringify({ error: e.message }) }], isError: true };
79
+ }
80
+ });
81
+ // === get_battle_sprites ===
82
+ server.tool('get_battle_sprites', `Get pixel art sprites (base64 PNG) for the current battle's two creatures.
83
+ Call ONCE after start_battle. Returns ~1KB total.
84
+ Embed in artifact as: <img src={\`data:image/png;base64,\${sprite}\`} style={{width:96,height:96,imageRendering:'pixelated'}} />
85
+ Flip opponent with scaleX(-1). Add CSS animation: @keyframes idle{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
86
+ Do NOT call again on subsequent turns — cache the sprites in the artifact.`, {}, async (args) => {
87
+ try {
88
+ const result = handleGetSprites(args);
89
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
90
+ }
91
+ catch (e) {
92
+ return { content: [{ type: 'text', text: JSON.stringify({ error: e.message }) }], isError: true };
93
+ }
94
+ });
95
+ return server;
96
+ }
97
+ //# 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,4 @@
1
+ export declare function handleGetMoveInfo(args: {
2
+ move_name: string;
3
+ }): object;
4
+ //# sourceMappingURL=getMoveInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMoveInfo.d.ts","sourceRoot":"","sources":["../../src/tools/getMoveInfo.ts"],"names":[],"mappings":"AAIA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAiCrE"}
@@ -0,0 +1,33 @@
1
+ import { ALL_MOVES } from '../data/moves.js';
2
+ import { TYPE_EMOJIS } from '../data/types.js';
3
+ import { getTypeInfo } from '../engine/typeChart.js';
4
+ export function handleGetMoveInfo(args) {
5
+ // Case-insensitive lookup
6
+ const move = Object.values(ALL_MOVES).find(m => m.name.toLowerCase() === args.move_name.toLowerCase());
7
+ if (!move) {
8
+ const allNames = Object.keys(ALL_MOVES).join(', ');
9
+ return {
10
+ error: `Unknown move: "${args.move_name}". Available moves: ${allNames}`,
11
+ };
12
+ }
13
+ const emoji = move.type !== 'normal' ? (TYPE_EMOJIS[move.type] || '') : '\u2B50';
14
+ const typeInfo = move.type !== 'normal' ? getTypeInfo(move.type) : null;
15
+ return {
16
+ name: move.name,
17
+ type: `${emoji} ${move.type}`,
18
+ power: move.power,
19
+ accuracy: move.accuracy,
20
+ pp: move.pp,
21
+ description: move.description,
22
+ effect: move.effect ? {
23
+ ...move.effect,
24
+ description: move.description,
25
+ } : null,
26
+ typeMatchups: typeInfo ? {
27
+ superEffectiveAgainst: typeInfo.strong_against.map((t) => `${TYPE_EMOJIS[t]} ${t}`),
28
+ notVeryEffectiveAgainst: typeInfo.weak_against.map((t) => `${TYPE_EMOJIS[t]} ${t}`),
29
+ } : null,
30
+ _hint: `${move.name} is a ${move.type}-type move with ${move.power} power and ${move.accuracy}% accuracy. ${move.description}`,
31
+ };
32
+ }
33
+ //# sourceMappingURL=getMoveInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMoveInfo.js","sourceRoot":"","sources":["../../src/tools/getMoveInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAA0B,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,IAA2B;IAC3D,0BAA0B;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAC3D,CAAC;IAEF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO;YACL,KAAK,EAAE,kBAAkB,IAAI,CAAC,SAAS,uBAAuB,QAAQ,EAAE;SACzE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjG,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAoB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAExF,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACpB,GAAG,IAAI,CAAC,MAAM;YACd,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC,CAAC,IAAI;QACR,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;YACvB,qBAAqB,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACjG,uBAAuB,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;SAClG,CAAC,CAAC,CAAC,IAAI;QACR,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,mBAAmB,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,QAAQ,eAAe,IAAI,CAAC,WAAW,EAAE;KAC/H,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleGetSprites(_args: Record<string, unknown>): object;
2
+ //# sourceMappingURL=getSprites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSprites.d.ts","sourceRoot":"","sources":["../../src/tools/getSprites.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAYvE"}
@@ -0,0 +1,15 @@
1
+ import { battleManager } from '../engine/battle.js';
2
+ import { getCreatureSprite, getArenaBackground } from '../data/sprites.js';
3
+ export function handleGetSprites(_args) {
4
+ const state = battleManager.getState();
5
+ if (!state) {
6
+ return { error: 'No active battle. Use start_battle first.' };
7
+ }
8
+ return {
9
+ playerSprite: getCreatureSprite(state.player.creature.name) || '',
10
+ opponentSprite: getCreatureSprite(state.opponent.creature.name) || '',
11
+ arenaBackground: getArenaBackground(state.opponent.creature.type) || '',
12
+ _hint: 'Sprites have transparent backgrounds. Embed as <img src="data:image/png;base64,..." />. Scale creatures to 80-96px with image-rendering:pixelated. Use arena as a subtle background-image on the main container (opacity 0.2). Flip opponent with scaleX(-1). Add idle bob animation.',
13
+ };
14
+ }
15
+ //# sourceMappingURL=getSprites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSprites.js","sourceRoot":"","sources":["../../src/tools/getSprites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,MAAM,UAAU,gBAAgB,CAAC,KAA8B;IAC7D,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IAChE,CAAC;IAED,OAAO;QACL,YAAY,EAAE,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;QACjE,cAAc,EAAE,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;QACrE,eAAe,EAAE,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAoB,CAAC,IAAI,EAAE;QACvF,KAAK,EAAE,uRAAuR;KAC/R,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleGetState(_args: Record<string, unknown>): object;
2
+ //# sourceMappingURL=getState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getState.d.ts","sourceRoot":"","sources":["../../src/tools/getState.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAerE"}
@@ -0,0 +1,18 @@
1
+ import { battleManager } from '../engine/battle.js';
2
+ export function handleGetState(_args) {
3
+ const state = battleManager.getState();
4
+ if (!state) {
5
+ return {
6
+ error: 'No active battle. Use start_battle to begin.',
7
+ _hint: 'There is no battle in progress. Ask the user if they want to start one.',
8
+ };
9
+ }
10
+ return {
11
+ ...state,
12
+ _hint: `Current state: Turn ${state.turn}, ` +
13
+ `${state.player.creature.name} ${state.player.creature.hp}/${state.player.creature.maxHp} HP vs ` +
14
+ `${state.opponent.creature.name} ${state.opponent.creature.hp}/${state.opponent.creature.maxHp} HP. ` +
15
+ `Status: ${state.status}.`,
16
+ };
17
+ }
18
+ //# sourceMappingURL=getState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getState.js","sourceRoot":"","sources":["../../src/tools/getState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,cAAc,CAAC,KAA8B;IAC3D,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,8CAA8C;YACrD,KAAK,EAAE,yEAAyE;SACjF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,KAAK;QACR,KAAK,EAAE,uBAAuB,KAAK,CAAC,IAAI,IAAI;YAC1C,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS;YACjG,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,OAAO;YACrG,WAAW,KAAK,CAAC,MAAM,GAAG;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function handleListCreatures(args: {
2
+ type_filter?: string;
3
+ }): object;
4
+ //# sourceMappingURL=listCreatures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listCreatures.d.ts","sourceRoot":"","sources":["../../src/tools/listCreatures.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAiC1E"}
@@ -0,0 +1,36 @@
1
+ import { ALL_CREATURES } from '../data/creatures.js';
2
+ import { TYPE_EMOJIS } from '../data/types.js';
3
+ import { getTypeInfo } from '../engine/typeChart.js';
4
+ import { ALL_MOVES } from '../data/moves.js';
5
+ export function handleListCreatures(args) {
6
+ let creatures = Object.values(ALL_CREATURES);
7
+ if (args.type_filter) {
8
+ creatures = creatures.filter(c => c.type === args.type_filter);
9
+ }
10
+ const list = creatures.map(c => {
11
+ const emoji = TYPE_EMOJIS[c.type] || '';
12
+ const typeInfo = getTypeInfo(c.type);
13
+ return {
14
+ name: c.name,
15
+ type: `${emoji} ${c.type}`,
16
+ stats: { hp: c.hp, attack: c.attack, defense: c.defense, speed: c.speed },
17
+ statTotal: c.hp + c.attack + c.defense + c.speed,
18
+ moves: c.moves.map(moveName => {
19
+ const m = ALL_MOVES[moveName];
20
+ return m
21
+ ? { name: m.name, type: m.type, power: m.power, accuracy: m.accuracy, effect: m.effect ? m.description : null }
22
+ : { name: moveName, type: 'unknown', power: 0, accuracy: 0, effect: null };
23
+ }),
24
+ flavour: c.flavour,
25
+ strongAgainst: typeInfo.strong_against.map((t) => `${TYPE_EMOJIS[t]} ${t}`),
26
+ weakTo: typeInfo.weak_to.map((t) => `${TYPE_EMOJIS[t]} ${t}`),
27
+ };
28
+ });
29
+ return {
30
+ creatures: list,
31
+ total: list.length,
32
+ _hint: `There are ${list.length} creatures available. ` +
33
+ (args.type_filter ? `Filtered by type: ${args.type_filter}.` : 'No filter applied.'),
34
+ };
35
+ }
36
+ //# sourceMappingURL=listCreatures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listCreatures.js","sourceRoot":"","sources":["../../src/tools/listCreatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,UAAU,mBAAmB,CAAC,IAA8B;IAChE,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE;YAC1B,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;YACzE,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK;YAChD,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC9B,OAAO,CAAC;oBACN,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC/G,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC/E,CAAC,CAAC;YACF,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,aAAa,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACzF,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,KAAK,EAAE,aAAa,IAAI,CAAC,MAAM,wBAAwB;YACrD,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,qBAAqB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC;KACvF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function handleMakeMove(args: {
2
+ move_name: string;
3
+ }): object;
4
+ //# sourceMappingURL=makeMove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeMove.d.ts","sourceRoot":"","sources":["../../src/tools/makeMove.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkBlE"}
@@ -0,0 +1,21 @@
1
+ import { battleManager } from '../engine/battle.js';
2
+ export function handleMakeMove(args) {
3
+ const state = battleManager.makeMove(args.move_name);
4
+ const round = state.lastRound;
5
+ const p = state.player.creature;
6
+ const o = state.opponent.creature;
7
+ let hint = '';
8
+ if (state.status === 'active' && round) {
9
+ hint = `T${state.turn}: ${round.narrative.substring(0, 150)} ` +
10
+ `HP: ${p.hp}/${p.maxHp} vs ${o.hp}/${o.maxHp}. ` +
11
+ `Update the SAME minimal artifact — just change HP values and add 1 line to the round result. Reuse sprites from before. Keep it SHORT.`;
12
+ }
13
+ else if (state.status === 'player_won') {
14
+ hint = `VICTORY in ${state.turn} turns! Update artifact with a green victory banner. Offer rematch.`;
15
+ }
16
+ else if (state.status === 'opponent_won') {
17
+ hint = `DEFEAT in ${state.turn} turns. Update artifact with a red defeat banner. Offer rematch.`;
18
+ }
19
+ return { ...state, _hint: hint };
20
+ }
21
+ //# sourceMappingURL=makeMove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeMove.js","sourceRoot":"","sources":["../../src/tools/makeMove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,cAAc,CAAC,IAA2B;IACxD,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;IAChC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAElC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;QACvC,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;YAC5D,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI;YAChD,wIAAwI,CAAC;IAC7I,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACzC,IAAI,GAAG,cAAc,KAAK,CAAC,IAAI,qEAAqE,CAAC;IACvG,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QAC3C,IAAI,GAAG,aAAa,KAAK,CAAC,IAAI,kEAAkE,CAAC;IACnG,CAAC;IAED,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function handleStartBattle(args: {
2
+ player_creature?: string;
3
+ difficulty?: string;
4
+ mode?: string;
5
+ }): object;
6
+ //# sourceMappingURL=startBattle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startBattle.d.ts","sourceRoot":"","sources":["../../src/tools/startBattle.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CAwBT"}
@@ -0,0 +1,22 @@
1
+ import { battleManager } from '../engine/battle.js';
2
+ export function handleStartBattle(args) {
3
+ const difficulty = (['easy', 'normal', 'hard'].includes(args.difficulty ?? '')
4
+ ? args.difficulty
5
+ : 'normal');
6
+ const mode = (['single', 'best_of_3'].includes(args.mode ?? '')
7
+ ? args.mode
8
+ : 'single');
9
+ const state = battleManager.startBattle(args.player_creature, difficulty, mode);
10
+ const p = state.player.creature;
11
+ const o = state.opponent.creature;
12
+ return {
13
+ ...state,
14
+ _hint: `Battle: ${p.name}(${p.type}) vs ${o.name}(${o.type}). ` +
15
+ `Call get_battle_sprites, then render a TINY React artifact (<50 lines). ` +
16
+ `KEEP IT MINIMAL: dark bg, two columns with sprite img + name + HP bar + type, then 4 move buttons in a 2x2 grid. ` +
17
+ `NO battle log, NO type matchup section, NO stat displays, NO status badges, NO sub-components. ` +
18
+ `Just inline everything in ONE return statement. Sprites: <img src={\`data:image/png;base64,\${SPRITE}\`} style={{width:80,height:80,imageRendering:'pixelated'}} />. ` +
19
+ `Write 1 sentence intro then the artifact. User clicks a move name → you call make_move.`,
20
+ };
21
+ }
22
+ //# sourceMappingURL=startBattle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startBattle.js","sourceRoot":"","sources":["../../src/tools/startBattle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,UAAU,iBAAiB,CAAC,IAIjC;IACC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QAC5E,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,QAAQ,CAAe,CAAC;IAE5B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7D,CAAC,CAAC,IAAI,CAAC,IAAI;QACX,CAAC,CAAC,QAAQ,CAAe,CAAC;IAE5B,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAEhF,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;IAChC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAElC,OAAO;QACL,GAAG,KAAK;QACR,KAAK,EACH,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK;YACxD,0EAA0E;YAC1E,mHAAmH;YACnH,iGAAiG;YACjG,uKAAuK;YACvK,yFAAyF;KAC5F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare class SeededRNG {
2
+ private seed;
3
+ constructor(seed?: number);
4
+ next(): number;
5
+ nextInt(min: number, max: number): number;
6
+ chance(percent: number): boolean;
7
+ pick<T>(arr: T[]): T;
8
+ variance(): number;
9
+ getSeed(): number;
10
+ }
11
+ //# sourceMappingURL=rng.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng.d.ts","sourceRoot":"","sources":["../../src/utils/rng.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,CAAC,EAAE,MAAM;IAIzB,IAAI,IAAI,MAAM;IAKd,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAIzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIhC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IAIpB,QAAQ,IAAI,MAAM;IAIlB,OAAO,IAAI,MAAM;CAGlB"}
@@ -0,0 +1,26 @@
1
+ export class SeededRNG {
2
+ seed;
3
+ constructor(seed) {
4
+ this.seed = seed ?? Date.now();
5
+ }
6
+ next() {
7
+ this.seed = (this.seed * 1664525 + 1013904223) & 0xffffffff;
8
+ return (this.seed >>> 0) / 0xffffffff;
9
+ }
10
+ nextInt(min, max) {
11
+ return Math.floor(this.next() * (max - min + 1)) + min;
12
+ }
13
+ chance(percent) {
14
+ return this.next() * 100 < percent;
15
+ }
16
+ pick(arr) {
17
+ return arr[Math.floor(this.next() * arr.length)];
18
+ }
19
+ variance() {
20
+ return 0.85 + this.next() * 0.15;
21
+ }
22
+ getSeed() {
23
+ return this.seed;
24
+ }
25
+ }
26
+ //# sourceMappingURL=rng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng.js","sourceRoot":"","sources":["../../src/utils/rng.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;IACZ,IAAI,CAAS;IAErB,YAAY,IAAa;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,GAAW;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC;IACrC,CAAC;IAED,IAAI,CAAI,GAAQ;QACd,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IACnC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@codehawks/agent-battle-arena-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server — a creature battle game where Claude is the player. 50 creatures, 12 types, pixel art sprites, strategic AI opponent.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "agent-battle-arena-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/**/*"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "start": "node dist/index.js",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": [
19
+ "mcp",
20
+ "mcp-server",
21
+ "claude",
22
+ "battle",
23
+ "game",
24
+ "ai",
25
+ "agent",
26
+ "creature",
27
+ "pixel-art",
28
+ "turn-based",
29
+ "anthropic"
30
+ ],
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/LouisKnworpsworx/agent-battle-arena-mcp"
35
+ },
36
+ "dependencies": {
37
+ "@modelcontextprotocol/sdk": "^1.12.0",
38
+ "zod": "^3.24.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^22.0.0",
42
+ "sharp": "^0.34.5",
43
+ "typescript": "^5.7.0"
44
+ }
45
+ }