@mythxengine/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.
Files changed (214) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/assemble.test.d.ts +2 -0
  3. package/dist/__tests__/assemble.test.d.ts.map +1 -0
  4. package/dist/__tests__/assemble.test.js +81 -0
  5. package/dist/__tests__/assemble.test.js.map +1 -0
  6. package/dist/index.d.ts +10 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +38 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/resources/index.d.ts +9 -0
  11. package/dist/resources/index.d.ts.map +1 -0
  12. package/dist/resources/index.js +202 -0
  13. package/dist/resources/index.js.map +1 -0
  14. package/dist/server.d.ts +41 -0
  15. package/dist/server.d.ts.map +1 -0
  16. package/dist/server.js +91 -0
  17. package/dist/server.js.map +1 -0
  18. package/dist/state/manager.d.ts +88 -0
  19. package/dist/state/manager.d.ts.map +1 -0
  20. package/dist/state/manager.js +308 -0
  21. package/dist/state/manager.js.map +1 -0
  22. package/dist/state/rules.d.ts +30 -0
  23. package/dist/state/rules.d.ts.map +1 -0
  24. package/dist/state/rules.js +61 -0
  25. package/dist/state/rules.js.map +1 -0
  26. package/dist/state/worldpacks.d.ts +43 -0
  27. package/dist/state/worldpacks.d.ts.map +1 -0
  28. package/dist/state/worldpacks.js +125 -0
  29. package/dist/state/worldpacks.js.map +1 -0
  30. package/dist/tools/augmentation/augment.d.ts +15 -0
  31. package/dist/tools/augmentation/augment.d.ts.map +1 -0
  32. package/dist/tools/augmentation/augment.js +512 -0
  33. package/dist/tools/augmentation/augment.js.map +1 -0
  34. package/dist/tools/augmentation/index.d.ts +6 -0
  35. package/dist/tools/augmentation/index.d.ts.map +1 -0
  36. package/dist/tools/augmentation/index.js +7 -0
  37. package/dist/tools/augmentation/index.js.map +1 -0
  38. package/dist/tools/characters.d.ts +26 -0
  39. package/dist/tools/characters.d.ts.map +1 -0
  40. package/dist/tools/characters.js +362 -0
  41. package/dist/tools/characters.js.map +1 -0
  42. package/dist/tools/clocks.d.ts +33 -0
  43. package/dist/tools/clocks.d.ts.map +1 -0
  44. package/dist/tools/clocks.js +438 -0
  45. package/dist/tools/clocks.js.map +1 -0
  46. package/dist/tools/combat.d.ts +38 -0
  47. package/dist/tools/combat.d.ts.map +1 -0
  48. package/dist/tools/combat.js +574 -0
  49. package/dist/tools/combat.js.map +1 -0
  50. package/dist/tools/dice.d.ts +9 -0
  51. package/dist/tools/dice.d.ts.map +1 -0
  52. package/dist/tools/dice.js +287 -0
  53. package/dist/tools/dice.js.map +1 -0
  54. package/dist/tools/encounters.d.ts +21 -0
  55. package/dist/tools/encounters.d.ts.map +1 -0
  56. package/dist/tools/encounters.js +521 -0
  57. package/dist/tools/encounters.js.map +1 -0
  58. package/dist/tools/engagement.d.ts +25 -0
  59. package/dist/tools/engagement.d.ts.map +1 -0
  60. package/dist/tools/engagement.js +491 -0
  61. package/dist/tools/engagement.js.map +1 -0
  62. package/dist/tools/expansion/archetype.d.ts +12 -0
  63. package/dist/tools/expansion/archetype.d.ts.map +1 -0
  64. package/dist/tools/expansion/archetype.js +157 -0
  65. package/dist/tools/expansion/archetype.js.map +1 -0
  66. package/dist/tools/expansion/index.d.ts +12 -0
  67. package/dist/tools/expansion/index.d.ts.map +1 -0
  68. package/dist/tools/expansion/index.js +21 -0
  69. package/dist/tools/expansion/index.js.map +1 -0
  70. package/dist/tools/expansion/location.d.ts +12 -0
  71. package/dist/tools/expansion/location.d.ts.map +1 -0
  72. package/dist/tools/expansion/location.js +149 -0
  73. package/dist/tools/expansion/location.js.map +1 -0
  74. package/dist/tools/expansion/monster.d.ts +12 -0
  75. package/dist/tools/expansion/monster.d.ts.map +1 -0
  76. package/dist/tools/expansion/monster.js +157 -0
  77. package/dist/tools/expansion/monster.js.map +1 -0
  78. package/dist/tools/expansion/npc.d.ts +12 -0
  79. package/dist/tools/expansion/npc.d.ts.map +1 -0
  80. package/dist/tools/expansion/npc.js +153 -0
  81. package/dist/tools/expansion/npc.js.map +1 -0
  82. package/dist/tools/generation/archetypes.d.ts +12 -0
  83. package/dist/tools/generation/archetypes.d.ts.map +1 -0
  84. package/dist/tools/generation/archetypes.js +129 -0
  85. package/dist/tools/generation/archetypes.js.map +1 -0
  86. package/dist/tools/generation/arcs.d.ts +13 -0
  87. package/dist/tools/generation/arcs.d.ts.map +1 -0
  88. package/dist/tools/generation/arcs.js +186 -0
  89. package/dist/tools/generation/arcs.js.map +1 -0
  90. package/dist/tools/generation/encounters.d.ts +12 -0
  91. package/dist/tools/generation/encounters.d.ts.map +1 -0
  92. package/dist/tools/generation/encounters.js +169 -0
  93. package/dist/tools/generation/encounters.js.map +1 -0
  94. package/dist/tools/generation/index.d.ts +19 -0
  95. package/dist/tools/generation/index.d.ts.map +1 -0
  96. package/dist/tools/generation/index.js +42 -0
  97. package/dist/tools/generation/index.js.map +1 -0
  98. package/dist/tools/generation/items.d.ts +12 -0
  99. package/dist/tools/generation/items.d.ts.map +1 -0
  100. package/dist/tools/generation/items.js +149 -0
  101. package/dist/tools/generation/items.js.map +1 -0
  102. package/dist/tools/generation/locations.d.ts +12 -0
  103. package/dist/tools/generation/locations.d.ts.map +1 -0
  104. package/dist/tools/generation/locations.js +131 -0
  105. package/dist/tools/generation/locations.js.map +1 -0
  106. package/dist/tools/generation/monsters.d.ts +12 -0
  107. package/dist/tools/generation/monsters.d.ts.map +1 -0
  108. package/dist/tools/generation/monsters.js +154 -0
  109. package/dist/tools/generation/monsters.js.map +1 -0
  110. package/dist/tools/generation/narrative.d.ts +12 -0
  111. package/dist/tools/generation/narrative.d.ts.map +1 -0
  112. package/dist/tools/generation/narrative.js +129 -0
  113. package/dist/tools/generation/narrative.js.map +1 -0
  114. package/dist/tools/generation/npcs.d.ts +12 -0
  115. package/dist/tools/generation/npcs.d.ts.map +1 -0
  116. package/dist/tools/generation/npcs.js +136 -0
  117. package/dist/tools/generation/npcs.js.map +1 -0
  118. package/dist/tools/generation/resume.d.ts +12 -0
  119. package/dist/tools/generation/resume.d.ts.map +1 -0
  120. package/dist/tools/generation/resume.js +288 -0
  121. package/dist/tools/generation/resume.js.map +1 -0
  122. package/dist/tools/generation/rules-prompt.d.ts +23 -0
  123. package/dist/tools/generation/rules-prompt.d.ts.map +1 -0
  124. package/dist/tools/generation/rules-prompt.js +209 -0
  125. package/dist/tools/generation/rules-prompt.js.map +1 -0
  126. package/dist/tools/generation/seed.d.ts +12 -0
  127. package/dist/tools/generation/seed.d.ts.map +1 -0
  128. package/dist/tools/generation/seed.js +171 -0
  129. package/dist/tools/generation/seed.js.map +1 -0
  130. package/dist/tools/generation/situations.d.ts +13 -0
  131. package/dist/tools/generation/situations.d.ts.map +1 -0
  132. package/dist/tools/generation/situations.js +247 -0
  133. package/dist/tools/generation/situations.js.map +1 -0
  134. package/dist/tools/gm-guidance.d.ts +13 -0
  135. package/dist/tools/gm-guidance.d.ts.map +1 -0
  136. package/dist/tools/gm-guidance.js +395 -0
  137. package/dist/tools/gm-guidance.js.map +1 -0
  138. package/dist/tools/index.d.ts +33 -0
  139. package/dist/tools/index.d.ts.map +1 -0
  140. package/dist/tools/index.js +80 -0
  141. package/dist/tools/index.js.map +1 -0
  142. package/dist/tools/investigation.d.ts +41 -0
  143. package/dist/tools/investigation.d.ts.map +1 -0
  144. package/dist/tools/investigation.js +586 -0
  145. package/dist/tools/investigation.js.map +1 -0
  146. package/dist/tools/leads.d.ts +29 -0
  147. package/dist/tools/leads.d.ts.map +1 -0
  148. package/dist/tools/leads.js +460 -0
  149. package/dist/tools/leads.js.map +1 -0
  150. package/dist/tools/players.d.ts +30 -0
  151. package/dist/tools/players.d.ts.map +1 -0
  152. package/dist/tools/players.js +448 -0
  153. package/dist/tools/players.js.map +1 -0
  154. package/dist/tools/portable-clues.d.ts +29 -0
  155. package/dist/tools/portable-clues.d.ts.map +1 -0
  156. package/dist/tools/portable-clues.js +490 -0
  157. package/dist/tools/portable-clues.js.map +1 -0
  158. package/dist/tools/relationships.d.ts +29 -0
  159. package/dist/tools/relationships.d.ts.map +1 -0
  160. package/dist/tools/relationships.js +471 -0
  161. package/dist/tools/relationships.js.map +1 -0
  162. package/dist/tools/scene-framing.d.ts +21 -0
  163. package/dist/tools/scene-framing.d.ts.map +1 -0
  164. package/dist/tools/scene-framing.js +380 -0
  165. package/dist/tools/scene-framing.js.map +1 -0
  166. package/dist/tools/sessions.d.ts +30 -0
  167. package/dist/tools/sessions.d.ts.map +1 -0
  168. package/dist/tools/sessions.js +253 -0
  169. package/dist/tools/sessions.js.map +1 -0
  170. package/dist/tools/time.d.ts +26 -0
  171. package/dist/tools/time.d.ts.map +1 -0
  172. package/dist/tools/time.js +438 -0
  173. package/dist/tools/time.js.map +1 -0
  174. package/dist/tools/turns.d.ts +38 -0
  175. package/dist/tools/turns.d.ts.map +1 -0
  176. package/dist/tools/turns.js +560 -0
  177. package/dist/tools/turns.js.map +1 -0
  178. package/dist/tools/worldpack/assemble.d.ts +20 -0
  179. package/dist/tools/worldpack/assemble.d.ts.map +1 -0
  180. package/dist/tools/worldpack/assemble.js +237 -0
  181. package/dist/tools/worldpack/assemble.js.map +1 -0
  182. package/dist/tools/worldpack/docs-generator.d.ts +18 -0
  183. package/dist/tools/worldpack/docs-generator.d.ts.map +1 -0
  184. package/dist/tools/worldpack/docs-generator.js +264 -0
  185. package/dist/tools/worldpack/docs-generator.js.map +1 -0
  186. package/dist/tools/worldpack/export.d.ts +12 -0
  187. package/dist/tools/worldpack/export.d.ts.map +1 -0
  188. package/dist/tools/worldpack/export.js +209 -0
  189. package/dist/tools/worldpack/export.js.map +1 -0
  190. package/dist/tools/worldpack/index.d.ts +15 -0
  191. package/dist/tools/worldpack/index.d.ts.map +1 -0
  192. package/dist/tools/worldpack/index.js +30 -0
  193. package/dist/tools/worldpack/index.js.map +1 -0
  194. package/dist/tools/worldpack/lookup.d.ts +19 -0
  195. package/dist/tools/worldpack/lookup.d.ts.map +1 -0
  196. package/dist/tools/worldpack/lookup.js +320 -0
  197. package/dist/tools/worldpack/lookup.js.map +1 -0
  198. package/dist/tools/worldpack/manage.d.ts +20 -0
  199. package/dist/tools/worldpack/manage.d.ts.map +1 -0
  200. package/dist/tools/worldpack/manage.js +101 -0
  201. package/dist/tools/worldpack/manage.js.map +1 -0
  202. package/dist/tools/worldpack/save-result.d.ts +12 -0
  203. package/dist/tools/worldpack/save-result.d.ts.map +1 -0
  204. package/dist/tools/worldpack/save-result.js +222 -0
  205. package/dist/tools/worldpack/save-result.js.map +1 -0
  206. package/dist/tools/worldpack/summary.d.ts +13 -0
  207. package/dist/tools/worldpack/summary.d.ts.map +1 -0
  208. package/dist/tools/worldpack/summary.js +180 -0
  209. package/dist/tools/worldpack/summary.js.map +1 -0
  210. package/dist/tools/worldpack/validate.d.ts +12 -0
  211. package/dist/tools/worldpack/validate.d.ts.map +1 -0
  212. package/dist/tools/worldpack/validate.js +388 -0
  213. package/dist/tools/worldpack/validate.js.map +1 -0
  214. package/package.json +59 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Encounter Generation Tool
3
+ *
4
+ * Generates encounters based on the world seed.
5
+ */
6
+ import { z } from "zod";
7
+ import { randomUUID } from "crypto";
8
+ import { sessionManager, readManifest, writeManifest, addManifestStep, } from "../../state/manager.js";
9
+ import { buildRulesPromptSection } from "./rules-prompt.js";
10
+ const GenerateEncountersInput = z.object({
11
+ sessionId: z.string(),
12
+ count: z.number().min(1).max(30).optional().default(12).describe("Number of encounters to generate"),
13
+ types: z.array(z.enum(["combat", "event", "social"])).optional().describe("Encounter types to include"),
14
+ });
15
+ /**
16
+ * generate_encounters tool
17
+ */
18
+ export const generateEncountersTool = {
19
+ name: "generate_encounters",
20
+ description: "Generate encounters based on the world seed. Returns a prompt for LLM execution.",
21
+ inputSchema: {
22
+ type: "object",
23
+ properties: {
24
+ sessionId: { type: "string", description: "Session ID" },
25
+ count: { type: "number", description: "Number of encounters to generate (default: 12)" },
26
+ types: {
27
+ type: "array",
28
+ items: { type: "string", enum: ["combat", "event", "social"] },
29
+ description: "Encounter types to include"
30
+ },
31
+ },
32
+ required: ["sessionId"],
33
+ },
34
+ handler: async (args) => {
35
+ const input = GenerateEncountersInput.parse(args);
36
+ const session = await sessionManager.get(input.sessionId);
37
+ if (!session) {
38
+ throw new Error(`Session not found: ${input.sessionId}`);
39
+ }
40
+ if (!session.generation?.worldSeed) {
41
+ throw new Error("World seed not found. Call generate_world_seed first.");
42
+ }
43
+ const worldSeed = session.generation.worldSeed;
44
+ const stepId = randomUUID();
45
+ const count = input.count || 12;
46
+ const types = input.types || ["combat", "event", "social"];
47
+ // Record the generation step
48
+ session.generation.history.push({
49
+ id: stepId,
50
+ type: "encounters",
51
+ startedAt: new Date().toISOString(),
52
+ completedAt: null,
53
+ status: "in_progress",
54
+ generatedIds: [],
55
+ });
56
+ session.generation.status = "generating";
57
+ await sessionManager.save(session);
58
+ // Update manifest
59
+ const manifest = await readManifest(input.sessionId);
60
+ if (manifest) {
61
+ addManifestStep(manifest, "encounters", "encounters.json");
62
+ manifest.status = "generating";
63
+ await writeManifest(input.sessionId, manifest);
64
+ }
65
+ // Build rules section from seed (uses defaults if no custom rules)
66
+ const rulesSection = buildRulesPromptSection(worldSeed.rules);
67
+ const systemPrompt = `You are an encounter designer for tabletop RPGs. Create varied, engaging encounters that challenge players in different ways.
68
+
69
+ ${rulesSection}
70
+
71
+ ### Encounter Types
72
+ - Combat: Fights with monsters, enemies, or environmental hazards
73
+ - Event: Skill challenges, puzzles, traps, or environmental obstacles
74
+ - Social: Negotiations, interrogations, persuasion, or roleplay scenarios
75
+
76
+ ### Encounter Design Guidelines
77
+ - Combat encounters reference monsters by ID (monster:slug-name)
78
+ - Social encounters reference NPCs by ID (npc:slug-name)
79
+ - Event encounters have choices with skill tests (use abilities and difficulties from rules above)
80
+ - Include GM guidance and multiple possible outcomes
81
+
82
+ Output valid JSON only.`;
83
+ // Calculate distribution
84
+ const distribution = {};
85
+ const perType = Math.floor(count / types.length);
86
+ const remainder = count % types.length;
87
+ types.forEach((type, i) => {
88
+ distribution[type] = perType + (i < remainder ? 1 : 0);
89
+ });
90
+ const userPrompt = `Generate ${count} encounters for this world:
91
+
92
+ World: ${worldSeed.name}
93
+ Tone: ${worldSeed.aesthetic.tone}
94
+ Core Conflict: ${worldSeed.coreConflict}
95
+ Lethality: ${worldSeed.settings.lethality}
96
+ Supernatural Presence: ${worldSeed.settings.supernaturalPresence}
97
+
98
+ Locations where encounters might occur:
99
+ ${worldSeed.locationSeeds.map(l => `- ${l.name}: ${l.concept}`).join("\n")}
100
+
101
+ Monsters available:
102
+ ${worldSeed.monsterSeeds.map(m => `- ${m.name} (${m.threat}): ${m.concept}`).join("\n")}
103
+
104
+ NPCs available:
105
+ ${worldSeed.npcSeeds.map(n => `- ${n.name}: ${n.concept}`).join("\n")}
106
+
107
+ Encounter distribution:
108
+ ${Object.entries(distribution).map(([type, n]) => `- ${type}: ${n} encounters`).join("\n")}
109
+
110
+ Output a JSON object:
111
+ {
112
+ "encounters": [
113
+ {
114
+ "id": "encounter:slug-name",
115
+ "name": "Encounter Name",
116
+ "type": "combat|event|social",
117
+ "description": "What this encounter is about",
118
+ "text": "Narrative text when encounter begins (read-aloud)",
119
+ "gmGuidance": "Tips for running this encounter",
120
+ "outcomes": ["Possible outcome 1", "Possible outcome 2", "Possible outcome 3"],
121
+ "combat": {
122
+ "monsters": [
123
+ { "monsterId": "monster:slug-name", "count": 2 }
124
+ ],
125
+ "surprise": "none|enemies|party",
126
+ "environment": {
127
+ "lighting": "bright|dim|dark",
128
+ "terrain": "open|cramped|hazardous",
129
+ "hazards": ["optional hazard descriptions"]
130
+ }
131
+ },
132
+ "event": {
133
+ "choices": [
134
+ {
135
+ "text": "Choice description",
136
+ "test": { "ability": "STR|AGI|WIT|CON", "difficulty": 12 },
137
+ "successOutcome": "What happens on success",
138
+ "failureOutcome": "What happens on failure"
139
+ }
140
+ ]
141
+ },
142
+ "social": {
143
+ "npcIds": ["npc:slug-name"],
144
+ "initialAttitude": "friendly|neutral|hostile",
145
+ "negotiable": true
146
+ }
147
+ }
148
+ ]
149
+ }
150
+
151
+ Notes:
152
+ - Include combat object only for combat encounters
153
+ - Include event object only for event encounters
154
+ - Include social object only for social encounters
155
+
156
+ Return ONLY the JSON object, no markdown formatting.`;
157
+ return {
158
+ prompt: {
159
+ system: systemPrompt,
160
+ user: userPrompt,
161
+ outputSchemaName: "WorldEncounter[]",
162
+ },
163
+ stepId,
164
+ message: `Encounter generation initiated for ${count} encounters. Execute the prompt and call save_generation_result.`,
165
+ };
166
+ },
167
+ };
168
+ export const encounterTools = [generateEncountersTool];
169
+ //# sourceMappingURL=encounters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encounters.js","sourceRoot":"","sources":["../../../src/tools/generation/encounters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Generation tools - world content generation
3
+ */
4
+ export { seedTools, generateWorldSeedTool } from "./seed.js";
5
+ export { archetypeTools, generateArchetypesTool } from "./archetypes.js";
6
+ export { monsterTools, generateMonstersTool } from "./monsters.js";
7
+ export { itemTools, generateItemsTool } from "./items.js";
8
+ export { encounterTools, generateEncountersTool } from "./encounters.js";
9
+ export { locationTools, generateLocationsTool } from "./locations.js";
10
+ export { npcTools, generateNPCsTool } from "./npcs.js";
11
+ export { narrativeTools, generateNarrativeTool } from "./narrative.js";
12
+ export { situationTools, generateSituationsTool } from "./situations.js";
13
+ export { arcTools, generateArcsTool } from "./arcs.js";
14
+ export { resumeTools, resumeGenerationTool } from "./resume.js";
15
+ /**
16
+ * All generation tools
17
+ */
18
+ export declare const generationTools: import("@mythxengine/types").MCPToolEntry[];
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/generation/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAchE;;GAEG;AACH,eAAO,MAAM,eAAe,6CAY3B,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Generation tools - world content generation
3
+ */
4
+ export { seedTools, generateWorldSeedTool } from "./seed.js";
5
+ export { archetypeTools, generateArchetypesTool } from "./archetypes.js";
6
+ export { monsterTools, generateMonstersTool } from "./monsters.js";
7
+ export { itemTools, generateItemsTool } from "./items.js";
8
+ export { encounterTools, generateEncountersTool } from "./encounters.js";
9
+ export { locationTools, generateLocationsTool } from "./locations.js";
10
+ export { npcTools, generateNPCsTool } from "./npcs.js";
11
+ export { narrativeTools, generateNarrativeTool } from "./narrative.js";
12
+ export { situationTools, generateSituationsTool } from "./situations.js";
13
+ export { arcTools, generateArcsTool } from "./arcs.js";
14
+ export { resumeTools, resumeGenerationTool } from "./resume.js";
15
+ import { seedTools } from "./seed.js";
16
+ import { archetypeTools } from "./archetypes.js";
17
+ import { monsterTools } from "./monsters.js";
18
+ import { itemTools } from "./items.js";
19
+ import { encounterTools } from "./encounters.js";
20
+ import { locationTools } from "./locations.js";
21
+ import { npcTools } from "./npcs.js";
22
+ import { narrativeTools } from "./narrative.js";
23
+ import { situationTools } from "./situations.js";
24
+ import { arcTools } from "./arcs.js";
25
+ import { resumeTools } from "./resume.js";
26
+ /**
27
+ * All generation tools
28
+ */
29
+ export const generationTools = [
30
+ ...seedTools,
31
+ ...archetypeTools,
32
+ ...monsterTools,
33
+ ...itemTools,
34
+ ...encounterTools,
35
+ ...locationTools,
36
+ ...npcTools,
37
+ ...narrativeTools,
38
+ ...situationTools,
39
+ ...arcTools,
40
+ ...resumeTools,
41
+ ];
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/generation/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,GAAG,SAAS;IACZ,GAAG,cAAc;IACjB,GAAG,YAAY;IACf,GAAG,SAAS;IACZ,GAAG,cAAc;IACjB,GAAG,aAAa;IAChB,GAAG,QAAQ;IACX,GAAG,cAAc;IACjB,GAAG,cAAc;IACjB,GAAG,QAAQ;IACX,GAAG,WAAW;CACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Item Generation Tool
3
+ *
4
+ * Generates items based on the world seed.
5
+ */
6
+ import type { MCPToolEntry } from "@mythxengine/types";
7
+ /**
8
+ * generate_items tool
9
+ */
10
+ export declare const generateItemsTool: MCPToolEntry;
11
+ export declare const itemTools: MCPToolEntry[];
12
+ //# sourceMappingURL=items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../src/tools/generation/items.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AAezE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAmJ/B,CAAC;AAEF,eAAO,MAAM,SAAS,gBAAsB,CAAC"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Item Generation Tool
3
+ *
4
+ * Generates items based on the world seed.
5
+ */
6
+ import { z } from "zod";
7
+ import { randomUUID } from "crypto";
8
+ import { sessionManager, readManifest, writeManifest, addManifestStep, } from "../../state/manager.js";
9
+ import { buildRulesPromptSection } from "./rules-prompt.js";
10
+ const GenerateItemsInput = z.object({
11
+ sessionId: z.string(),
12
+ count: z.number().min(1).max(50).optional().default(20).describe("Number of items to generate"),
13
+ kinds: z.array(z.enum(["weapon", "armor", "consumable", "special", "misc"])).optional().describe("Item kinds to include"),
14
+ });
15
+ /**
16
+ * generate_items tool
17
+ */
18
+ export const generateItemsTool = {
19
+ name: "generate_items",
20
+ description: "Generate items based on the world seed. Returns a prompt for LLM execution.",
21
+ inputSchema: {
22
+ type: "object",
23
+ properties: {
24
+ sessionId: { type: "string", description: "Session ID" },
25
+ count: { type: "number", description: "Number of items to generate (default: 20)" },
26
+ kinds: {
27
+ type: "array",
28
+ items: { type: "string", enum: ["weapon", "armor", "consumable", "special", "misc"] },
29
+ description: "Item kinds to include"
30
+ },
31
+ },
32
+ required: ["sessionId"],
33
+ },
34
+ handler: async (args) => {
35
+ const input = GenerateItemsInput.parse(args);
36
+ const session = await sessionManager.get(input.sessionId);
37
+ if (!session) {
38
+ throw new Error(`Session not found: ${input.sessionId}`);
39
+ }
40
+ if (!session.generation?.worldSeed) {
41
+ throw new Error("World seed not found. Call generate_world_seed first.");
42
+ }
43
+ const worldSeed = session.generation.worldSeed;
44
+ const stepId = randomUUID();
45
+ const count = input.count || 20;
46
+ const kinds = input.kinds || ["weapon", "armor", "consumable", "special", "misc"];
47
+ // Record the generation step
48
+ session.generation.history.push({
49
+ id: stepId,
50
+ type: "items",
51
+ startedAt: new Date().toISOString(),
52
+ completedAt: null,
53
+ status: "in_progress",
54
+ generatedIds: [],
55
+ });
56
+ session.generation.status = "generating";
57
+ await sessionManager.save(session);
58
+ // Update manifest
59
+ const manifest = await readManifest(input.sessionId);
60
+ if (manifest) {
61
+ addManifestStep(manifest, "items", "items.json");
62
+ manifest.status = "generating";
63
+ await writeManifest(input.sessionId, manifest);
64
+ }
65
+ // Build rules section from seed (uses defaults if no custom rules)
66
+ const rulesSection = buildRulesPromptSection(worldSeed.rules);
67
+ const systemPrompt = `You are an item designer for tabletop RPGs. Create thematic, useful items that fit the world and support different playstyles.
68
+
69
+ ${rulesSection}
70
+
71
+ ### Item Design Guidelines
72
+ - Weapons use damage dice (d4=light, d6=standard, d8=heavy, d10=two-handed, d12=devastating)
73
+ - Weapons specify which ability they use for attacks (reference the abilities above)
74
+ - Armor provides damage reduction (1=light, 2=medium, 3=heavy)
75
+ - Consumables have limited uses and clear effects
76
+ - Items should reference the world's technology level and aesthetic
77
+ - Include items that support each archetype's playstyle
78
+
79
+ Output valid JSON only.`;
80
+ // Calculate distribution
81
+ const distribution = {};
82
+ const perKind = Math.floor(count / kinds.length);
83
+ const remainder = count % kinds.length;
84
+ kinds.forEach((kind, i) => {
85
+ distribution[kind] = perKind + (i < remainder ? 1 : 0);
86
+ });
87
+ const userPrompt = `Generate ${count} items for this world:
88
+
89
+ World: ${worldSeed.name}
90
+ Tone: ${worldSeed.aesthetic.tone}
91
+ Technology Level: ${worldSeed.settings.technologyLevel}
92
+ Magic Level: ${worldSeed.settings.magicLevel}
93
+ Lethality: ${worldSeed.settings.lethality}
94
+
95
+ Archetypes that need equipment:
96
+ ${worldSeed.archetypeSeeds.map(a => `- ${a.name}: ${a.concept}`).join("\n")}
97
+
98
+ Item distribution:
99
+ ${Object.entries(distribution).map(([kind, n]) => `- ${kind}: ${n} items`).join("\n")}
100
+
101
+ Output a JSON object:
102
+ {
103
+ "items": [
104
+ {
105
+ "id": "item:slug-name",
106
+ "name": "Item Name",
107
+ "kind": "weapon|armor|consumable|special|misc",
108
+ "description": "What the item is and does",
109
+ "flavor": "Evocative description or lore",
110
+ "tags": ["melee", "ranged", "magical", "etc"],
111
+ "slots": 1,
112
+ "weapon": {
113
+ "damage": "d6",
114
+ "ability": "STR|AGI|WIT|CON",
115
+ "properties": ["optional", "tags"]
116
+ },
117
+ "armor": {
118
+ "damageReduction": 1,
119
+ "properties": ["optional", "tags"]
120
+ },
121
+ "consumable": {
122
+ "uses": 1,
123
+ "effect": "mechanical effect",
124
+ "effectDescription": "narrative description"
125
+ }
126
+ }
127
+ ]
128
+ }
129
+
130
+ Notes:
131
+ - Include weapon object only for weapons
132
+ - Include armor object only for armor
133
+ - Include consumable object only for consumables
134
+ - special and misc items have no subtype objects
135
+
136
+ Return ONLY the JSON object, no markdown formatting.`;
137
+ return {
138
+ prompt: {
139
+ system: systemPrompt,
140
+ user: userPrompt,
141
+ outputSchemaName: "WorldItem[]",
142
+ },
143
+ stepId,
144
+ message: `Item generation initiated for ${count} items. Execute the prompt and call save_generation_result.`,
145
+ };
146
+ },
147
+ };
148
+ export const itemTools = [generateItemsTool];
149
+ //# sourceMappingURL=items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.js","sourceRoot":"","sources":["../../../src/tools/generation/items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Location Generation Tool
3
+ *
4
+ * Generates locations based on the world seed.
5
+ */
6
+ import type { MCPToolEntry } from "@mythxengine/types";
7
+ /**
8
+ * generate_locations tool
9
+ */
10
+ export declare const generateLocationsTool: MCPToolEntry;
11
+ export declare const locationTools: MCPToolEntry[];
12
+ //# sourceMappingURL=locations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locations.d.ts","sourceRoot":"","sources":["../../../src/tools/generation/locations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AAezE;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAkInC,CAAC;AAEF,eAAO,MAAM,aAAa,gBAA0B,CAAC"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Location Generation Tool
3
+ *
4
+ * Generates locations based on the world seed.
5
+ */
6
+ import { z } from "zod";
7
+ import { randomUUID } from "crypto";
8
+ import { sessionManager, readManifest, writeManifest, addManifestStep, } from "../../state/manager.js";
9
+ import { buildRulesPromptSection } from "./rules-prompt.js";
10
+ const GenerateLocationsInput = z.object({
11
+ sessionId: z.string(),
12
+ count: z.number().min(1).max(20).optional().describe("Number of locations to generate (default: from world seed)"),
13
+ focusOn: z.array(z.string()).optional().describe("Specific location seeds to focus on (by name)"),
14
+ });
15
+ /**
16
+ * generate_locations tool
17
+ */
18
+ export const generateLocationsTool = {
19
+ name: "generate_locations",
20
+ description: "Generate locations based on the world seed. Returns a prompt for LLM execution.",
21
+ inputSchema: {
22
+ type: "object",
23
+ properties: {
24
+ sessionId: { type: "string", description: "Session ID" },
25
+ count: { type: "number", description: "Number of locations to generate" },
26
+ focusOn: { type: "array", items: { type: "string" }, description: "Specific location seeds to focus on" },
27
+ },
28
+ required: ["sessionId"],
29
+ },
30
+ handler: async (args) => {
31
+ const input = GenerateLocationsInput.parse(args);
32
+ const session = await sessionManager.get(input.sessionId);
33
+ if (!session) {
34
+ throw new Error(`Session not found: ${input.sessionId}`);
35
+ }
36
+ if (!session.generation?.worldSeed) {
37
+ throw new Error("World seed not found. Call generate_world_seed first.");
38
+ }
39
+ const worldSeed = session.generation.worldSeed;
40
+ const stepId = randomUUID();
41
+ const locationSeeds = input.focusOn
42
+ ? worldSeed.locationSeeds.filter(l => input.focusOn.includes(l.name))
43
+ : worldSeed.locationSeeds;
44
+ const count = input.count || locationSeeds.length;
45
+ // Record the generation step
46
+ session.generation.history.push({
47
+ id: stepId,
48
+ type: "locations",
49
+ startedAt: new Date().toISOString(),
50
+ completedAt: null,
51
+ status: "in_progress",
52
+ generatedIds: [],
53
+ });
54
+ session.generation.status = "generating";
55
+ await sessionManager.save(session);
56
+ // Update manifest
57
+ const manifest = await readManifest(input.sessionId);
58
+ if (manifest) {
59
+ addManifestStep(manifest, "locations", "locations.json");
60
+ manifest.status = "generating";
61
+ await writeManifest(input.sessionId, manifest);
62
+ }
63
+ // Build rules section from seed (uses defaults if no custom rules)
64
+ const rulesSection = buildRulesPromptSection(worldSeed.rules);
65
+ const systemPrompt = `You are a location designer for tabletop RPGs. Create memorable, explorable locations that serve as backdrops for adventure.
66
+
67
+ ${rulesSection}
68
+
69
+ ### Location Design Guidelines
70
+ - Each location needs a clear type (settlement, dungeon, wilderness, landmark, building)
71
+ - Include atmospheric details (sights, sounds, smells)
72
+ - List notable features players can interact with
73
+ - Define connections to other locations (by ID)
74
+ - Suggest encounters that might occur here
75
+ - Place NPCs where appropriate
76
+ - Include optional secrets for discovery
77
+
78
+ Output valid JSON only.`;
79
+ const userPrompt = `Generate ${count} locations for this world:
80
+
81
+ World: ${worldSeed.name}
82
+ Visual Style: ${worldSeed.aesthetic.visualStyle}
83
+ Tone: ${worldSeed.aesthetic.tone}
84
+ Core Conflict: ${worldSeed.coreConflict}
85
+ Technology Level: ${worldSeed.settings.technologyLevel}
86
+ Supernatural Presence: ${worldSeed.settings.supernaturalPresence}
87
+
88
+ Location seeds to develop:
89
+ ${locationSeeds.slice(0, count).map((l, i) => `${i + 1}. ${l.name}: ${l.concept}`).join("\n")}
90
+
91
+ NPCs that might be placed:
92
+ ${worldSeed.npcSeeds.map(n => `- ${n.name}: ${n.concept}`).join("\n")}
93
+
94
+ Output a JSON object:
95
+ {
96
+ "locations": [
97
+ {
98
+ "id": "location:slug-name",
99
+ "name": "Location Name",
100
+ "description": "2-3 sentences describing the location",
101
+ "type": "settlement|dungeon|wilderness|landmark|building",
102
+ "atmosphere": "Sensory details - what players see, hear, smell",
103
+ "features": ["Notable feature 1", "Notable feature 2", "Notable feature 3"],
104
+ "connections": ["location:other-location-id"],
105
+ "encounters": ["encounter:relevant-encounter-id"],
106
+ "npcs": ["npc:resident-npc-id"],
107
+ "secrets": ["Hidden thing players might discover"],
108
+ "gmNotes": "Tips for running scenes here"
109
+ }
110
+ ]
111
+ }
112
+
113
+ Notes:
114
+ - Connections should form a logical network (paths, roads, doors)
115
+ - Not all locations need secrets
116
+ - Place NPCs where they logically belong
117
+
118
+ Return ONLY the JSON object, no markdown formatting.`;
119
+ return {
120
+ prompt: {
121
+ system: systemPrompt,
122
+ user: userPrompt,
123
+ outputSchemaName: "WorldLocation[]",
124
+ },
125
+ stepId,
126
+ message: `Location generation initiated for ${count} locations. Execute the prompt and call save_generation_result.`,
127
+ };
128
+ },
129
+ };
130
+ export const locationTools = [generateLocationsTool];
131
+ //# sourceMappingURL=locations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locations.js","sourceRoot":"","sources":["../../../src/tools/generation/locations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Monster Generation Tool
3
+ *
4
+ * Generates monsters based on the world seed.
5
+ */
6
+ import type { MCPToolEntry } from "@mythxengine/types";
7
+ /**
8
+ * generate_monsters tool
9
+ */
10
+ export declare const generateMonstersTool: MCPToolEntry;
11
+ export declare const monsterTools: MCPToolEntry[];
12
+ //# sourceMappingURL=monsters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monsters.d.ts","sourceRoot":"","sources":["../../../src/tools/generation/monsters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AAgBzE;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAwJlC,CAAC;AAEF,eAAO,MAAM,YAAY,gBAAyB,CAAC"}