@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,388 @@
1
+ /**
2
+ * Validate World Pack Tool
3
+ *
4
+ * Checks a world pack for completeness and consistency.
5
+ */
6
+ import { z } from "zod";
7
+ import { sessionManager } from "../../state/manager.js";
8
+ import { worldPackManager } from "../../state/worldpacks.js";
9
+ const ValidateWorldPackInput = z.object({
10
+ sessionId: z.string().optional().describe("Session ID (if validating from session)"),
11
+ packId: z.string().optional().describe("Pack ID (if validating saved pack)"),
12
+ });
13
+ /**
14
+ * validate_world_pack tool
15
+ */
16
+ export const validateWorldPackTool = {
17
+ name: "validate_world_pack",
18
+ description: "Check a world pack for completeness, consistency, and broken references.",
19
+ inputSchema: {
20
+ type: "object",
21
+ properties: {
22
+ sessionId: { type: "string", description: "Session ID (if validating from session)" },
23
+ packId: { type: "string", description: "Pack ID (if validating saved pack)" },
24
+ },
25
+ },
26
+ handler: async (args) => {
27
+ const input = ValidateWorldPackInput.parse(args);
28
+ if (!input.sessionId && !input.packId) {
29
+ throw new Error("Either sessionId or packId must be provided");
30
+ }
31
+ let worldPack = null;
32
+ if (input.packId) {
33
+ worldPack = await worldPackManager.get(input.packId);
34
+ if (!worldPack) {
35
+ throw new Error(`World pack not found: ${input.packId}`);
36
+ }
37
+ }
38
+ else if (input.sessionId) {
39
+ const session = await sessionManager.get(input.sessionId);
40
+ if (!session) {
41
+ throw new Error(`Session not found: ${input.sessionId}`);
42
+ }
43
+ if (!session.generation?.worldPackId) {
44
+ throw new Error("No assembled world pack in session. Call assemble_world_pack first.");
45
+ }
46
+ worldPack = await worldPackManager.get(session.generation.worldPackId);
47
+ if (!worldPack) {
48
+ throw new Error(`World pack not found: ${session.generation.worldPackId}`);
49
+ }
50
+ }
51
+ if (!worldPack) {
52
+ throw new Error("Could not load world pack");
53
+ }
54
+ // Validate the world pack
55
+ const result = validatePack(worldPack);
56
+ return {
57
+ packId: worldPack.meta.id,
58
+ name: worldPack.meta.name,
59
+ ...result,
60
+ };
61
+ },
62
+ };
63
+ /**
64
+ * Validate a world pack and return issues
65
+ */
66
+ function validatePack(pack) {
67
+ const issues = [];
68
+ const allIds = new Set();
69
+ const seenIds = new Set();
70
+ let missingReferences = 0;
71
+ let duplicateIds = 0;
72
+ // Collect all IDs
73
+ const collectIds = (record, prefix) => {
74
+ for (const [key, value] of Object.entries(record)) {
75
+ if (seenIds.has(value.id)) {
76
+ duplicateIds++;
77
+ issues.push({
78
+ type: "error",
79
+ path: `${prefix}.${key}`,
80
+ message: `Duplicate ID: ${value.id}`,
81
+ });
82
+ }
83
+ seenIds.add(value.id);
84
+ allIds.add(value.id);
85
+ }
86
+ };
87
+ collectIds(pack.archetypes, "archetypes");
88
+ collectIds(pack.items, "items");
89
+ collectIds(pack.monsters, "monsters");
90
+ collectIds(pack.encounters, "encounters");
91
+ collectIds(pack.conditions, "conditions");
92
+ collectIds(pack.locations, "locations");
93
+ collectIds(pack.npcs, "npcs");
94
+ if (pack.factions) {
95
+ collectIds(pack.factions, "factions");
96
+ }
97
+ if (pack.situations) {
98
+ collectIds(pack.situations, "situations");
99
+ }
100
+ if (pack.arcs) {
101
+ collectIds(pack.arcs, "arcs");
102
+ }
103
+ // Check references
104
+ const checkRef = (ref, context) => {
105
+ if (!allIds.has(ref)) {
106
+ missingReferences++;
107
+ issues.push({
108
+ type: "warning",
109
+ path: context,
110
+ message: `Missing reference: ${ref}`,
111
+ });
112
+ }
113
+ };
114
+ // Check archetype starting items
115
+ for (const [id, archetype] of Object.entries(pack.archetypes)) {
116
+ for (const itemId of archetype.startingItems) {
117
+ checkRef(itemId, `archetypes.${id}.startingItems`);
118
+ }
119
+ }
120
+ // Check encounter monster references
121
+ for (const [id, encounter] of Object.entries(pack.encounters)) {
122
+ if (encounter.combat?.monsters) {
123
+ for (const spawn of encounter.combat.monsters) {
124
+ checkRef(spawn.monsterId, `encounters.${id}.combat.monsters`);
125
+ }
126
+ }
127
+ if (encounter.social?.npcIds) {
128
+ for (const npcId of encounter.social.npcIds) {
129
+ checkRef(npcId, `encounters.${id}.social.npcIds`);
130
+ }
131
+ }
132
+ }
133
+ // Check location references
134
+ for (const [id, location] of Object.entries(pack.locations)) {
135
+ for (const connId of location.connections) {
136
+ checkRef(connId, `locations.${id}.connections`);
137
+ }
138
+ for (const encId of location.encounters) {
139
+ checkRef(encId, `locations.${id}.encounters`);
140
+ }
141
+ for (const npcId of location.npcs) {
142
+ checkRef(npcId, `locations.${id}.npcs`);
143
+ }
144
+ }
145
+ // Check NPC location references
146
+ for (const [id, npc] of Object.entries(pack.npcs)) {
147
+ if (npc.locations) {
148
+ for (const locId of npc.locations) {
149
+ checkRef(locId, `npcs.${id}.locations`);
150
+ }
151
+ }
152
+ }
153
+ // Check minimum content
154
+ if (Object.keys(pack.archetypes).length === 0) {
155
+ issues.push({
156
+ type: "error",
157
+ path: "archetypes",
158
+ message: "No archetypes defined",
159
+ });
160
+ }
161
+ if (Object.keys(pack.locations).length === 0) {
162
+ issues.push({
163
+ type: "warning",
164
+ path: "locations",
165
+ message: "No locations defined",
166
+ });
167
+ }
168
+ if (!pack.narrativeGuidance.openingScenes.length) {
169
+ issues.push({
170
+ type: "warning",
171
+ path: "narrativeGuidance.openingScenes",
172
+ message: "No opening scenes defined",
173
+ });
174
+ }
175
+ // Validate situations if present
176
+ if (pack.situations && Object.keys(pack.situations).length > 0) {
177
+ validateSituationsAndArcs(pack, issues, allIds, checkRef);
178
+ }
179
+ // Calculate totals
180
+ const totalItems = Object.keys(pack.archetypes).length +
181
+ Object.keys(pack.items).length +
182
+ Object.keys(pack.monsters).length +
183
+ Object.keys(pack.encounters).length +
184
+ Object.keys(pack.conditions).length +
185
+ Object.keys(pack.locations).length +
186
+ Object.keys(pack.npcs).length +
187
+ (pack.factions ? Object.keys(pack.factions).length : 0) +
188
+ (pack.situations ? Object.keys(pack.situations).length : 0) +
189
+ (pack.arcs ? Object.keys(pack.arcs).length : 0);
190
+ const errorCount = issues.filter(i => i.type === "error").length;
191
+ return {
192
+ valid: errorCount === 0,
193
+ issues,
194
+ stats: {
195
+ totalItems,
196
+ missingReferences,
197
+ duplicateIds,
198
+ },
199
+ };
200
+ }
201
+ /**
202
+ * Detect cycles in situation lead graph using DFS
203
+ * Returns array of cycle descriptions for reporting
204
+ */
205
+ function detectSituationCycles(situations) {
206
+ const cycles = [];
207
+ const visited = new Set();
208
+ const recursionStack = new Set();
209
+ function dfs(situationId, path) {
210
+ if (recursionStack.has(situationId)) {
211
+ // Found a cycle - extract the cycle path
212
+ const cycleStart = path.indexOf(situationId);
213
+ const cyclePath = [...path.slice(cycleStart), situationId];
214
+ cycles.push(cyclePath.join(" → "));
215
+ return true;
216
+ }
217
+ if (visited.has(situationId)) {
218
+ return false;
219
+ }
220
+ visited.add(situationId);
221
+ recursionStack.add(situationId);
222
+ const situation = situations[situationId];
223
+ if (situation) {
224
+ for (const lead of situation.outgoingLeads) {
225
+ const targetId = lead.targetSituationId;
226
+ if (situations[targetId]) {
227
+ dfs(targetId, [...path, situationId]);
228
+ }
229
+ }
230
+ }
231
+ recursionStack.delete(situationId);
232
+ return false;
233
+ }
234
+ // Run DFS from each unvisited node
235
+ for (const situationId of Object.keys(situations)) {
236
+ if (!visited.has(situationId)) {
237
+ dfs(situationId, []);
238
+ }
239
+ }
240
+ return cycles;
241
+ }
242
+ /**
243
+ * Validate situations and arcs (Alexandrian node-based design)
244
+ */
245
+ function validateSituationsAndArcs(pack, issues, _allIds, checkRef) {
246
+ const situationIds = new Set();
247
+ const allLeadIds = new Set();
248
+ const incomingLeadCounts = new Map();
249
+ // Detect cycles in the situation graph
250
+ if (pack.situations && Object.keys(pack.situations).length > 0) {
251
+ const cycles = detectSituationCycles(pack.situations);
252
+ for (const cycle of cycles) {
253
+ issues.push({
254
+ type: "warning",
255
+ path: "situations",
256
+ message: `Circular lead chain detected: ${cycle}. This may cause infinite loops or confusing navigation.`,
257
+ });
258
+ }
259
+ }
260
+ // Collect situation IDs and validate situations
261
+ for (const [id, situation] of Object.entries(pack.situations || {})) {
262
+ situationIds.add(situation.id);
263
+ // Validate actor references
264
+ for (const actor of situation.actors) {
265
+ if (actor.entityId.startsWith("npc:")) {
266
+ checkRef(actor.entityId, `situations.${id}.actors`);
267
+ }
268
+ }
269
+ // Validate location references
270
+ for (const locId of situation.locations.primary) {
271
+ checkRef(locId, `situations.${id}.locations.primary`);
272
+ }
273
+ if (situation.locations.related) {
274
+ for (const locId of situation.locations.related) {
275
+ checkRef(locId, `situations.${id}.locations.related`);
276
+ }
277
+ }
278
+ // Collect outgoing leads
279
+ for (const lead of situation.outgoingLeads) {
280
+ allLeadIds.add(lead.id);
281
+ // Track incoming leads to target situations
282
+ const targetId = lead.targetSituationId;
283
+ const count = incomingLeadCounts.get(targetId) || 0;
284
+ incomingLeadCounts.set(targetId, count + 1);
285
+ // Validate lead source references
286
+ if (lead.discovery.sourceId) {
287
+ checkRef(lead.discovery.sourceId, `situations.${id}.outgoingLeads.${lead.id}`);
288
+ }
289
+ }
290
+ // Validate incoming lead references
291
+ for (const leadId of situation.entryPoints.incomingLeadIds) {
292
+ if (!allLeadIds.has(leadId)) {
293
+ // Lead might be defined in another situation we haven't processed yet
294
+ // We'll check orphaned leads after processing all situations
295
+ }
296
+ }
297
+ }
298
+ // Three Clue Rule validation
299
+ for (const [id, situation] of Object.entries(pack.situations || {})) {
300
+ const incomingCount = incomingLeadCounts.get(situation.id) || 0;
301
+ const directCount = situation.entryPoints.directDiscovery.length;
302
+ const totalEntryPoints = incomingCount + directCount;
303
+ const target = situation.entryPoints.minimumLeadsTarget || 3;
304
+ if (totalEntryPoints < target) {
305
+ issues.push({
306
+ type: "warning",
307
+ path: `situations.${id}.entryPoints`,
308
+ message: `Three Clue Rule: Situation has ${totalEntryPoints} entry points (target: ${target}). Add more leads or direct discovery methods.`,
309
+ });
310
+ }
311
+ }
312
+ // Check for orphan situations (no entry points at all)
313
+ for (const [id, situation] of Object.entries(pack.situations || {})) {
314
+ const incomingCount = incomingLeadCounts.get(situation.id) || 0;
315
+ const directCount = situation.entryPoints.directDiscovery.length;
316
+ if (incomingCount === 0 && directCount === 0) {
317
+ issues.push({
318
+ type: "warning",
319
+ path: `situations.${id}`,
320
+ message: `Orphan situation: No way to discover this situation. Add leads from other situations or direct discovery methods.`,
321
+ });
322
+ }
323
+ }
324
+ // Validate lead network connectivity
325
+ const leadTargets = new Set();
326
+ for (const [, situation] of Object.entries(pack.situations || {})) {
327
+ for (const lead of situation.outgoingLeads) {
328
+ leadTargets.add(lead.targetSituationId);
329
+ // Validate target situation exists
330
+ if (!situationIds.has(lead.targetSituationId)) {
331
+ issues.push({
332
+ type: "warning",
333
+ path: `situations lead ${lead.id}`,
334
+ message: `Lead points to unknown situation: ${lead.targetSituationId}`,
335
+ });
336
+ }
337
+ }
338
+ }
339
+ // Validate arcs if present
340
+ if (pack.arcs && Object.keys(pack.arcs).length > 0) {
341
+ for (const [id, arc] of Object.entries(pack.arcs)) {
342
+ // Validate situation references
343
+ for (const sitId of arc.situationIds) {
344
+ if (!situationIds.has(sitId)) {
345
+ issues.push({
346
+ type: "warning",
347
+ path: `arcs.${id}.situationIds`,
348
+ message: `Arc references unknown situation: ${sitId}`,
349
+ });
350
+ }
351
+ }
352
+ // Validate structure references
353
+ if (arc.structure.entryPoints) {
354
+ for (const entryId of arc.structure.entryPoints) {
355
+ if (!situationIds.has(entryId)) {
356
+ issues.push({
357
+ type: "warning",
358
+ path: `arcs.${id}.structure.entryPoints`,
359
+ message: `Arc entry point references unknown situation: ${entryId}`,
360
+ });
361
+ }
362
+ }
363
+ }
364
+ if (arc.structure.climax && !situationIds.has(arc.structure.climax)) {
365
+ issues.push({
366
+ type: "warning",
367
+ path: `arcs.${id}.structure.climax`,
368
+ message: `Arc climax references unknown situation: ${arc.structure.climax}`,
369
+ });
370
+ }
371
+ if (arc.structure.hub && !situationIds.has(arc.structure.hub)) {
372
+ issues.push({
373
+ type: "warning",
374
+ path: `arcs.${id}.structure.hub`,
375
+ message: `Arc hub references unknown situation: ${arc.structure.hub}`,
376
+ });
377
+ }
378
+ // Validate GM guidance NPC references
379
+ for (const npcId of arc.gmGuidance.keyNpcs) {
380
+ if (npcId.startsWith("npc:")) {
381
+ checkRef(npcId, `arcs.${id}.gmGuidance.keyNpcs`);
382
+ }
383
+ }
384
+ }
385
+ }
386
+ }
387
+ export const validateTools = [validateWorldPackTool];
388
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/tools/worldpack/validate.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@mythxengine/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for MythX RPG - dice rolling, combat, world generation, and GM tools",
5
+ "type": "module",
6
+ "bin": {
7
+ "mythx-mcp": "./dist/index.js"
8
+ },
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "keywords": [
19
+ "mcp",
20
+ "rpg",
21
+ "tabletop",
22
+ "claude",
23
+ "anthropic",
24
+ "game-master"
25
+ ],
26
+ "author": "Proto Labs AI",
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/proto-labs-ai/rpg-claude-plugin.git",
31
+ "directory": "packages/mcp-server"
32
+ },
33
+ "bugs": {
34
+ "url": "https://github.com/proto-labs-ai/rpg-claude-plugin/issues"
35
+ },
36
+ "homepage": "https://github.com/proto-labs-ai/rpg-claude-plugin#readme",
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.0.0",
39
+ "lodash-es": "^4.17.21",
40
+ "zod": "^3.24.0",
41
+ "@mythxengine/types": "0.1.0",
42
+ "@mythxengine/engine": "0.1.0",
43
+ "@mythxengine/worlds": "0.1.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/lodash-es": "^4.17.12",
47
+ "@types/node": "^22.0.0",
48
+ "typescript": "^5.7.0",
49
+ "vitest": "^2.1.0"
50
+ },
51
+ "scripts": {
52
+ "build": "tsc",
53
+ "dev": "tsc --watch",
54
+ "start": "node dist/index.js",
55
+ "test": "vitest run",
56
+ "test:watch": "vitest",
57
+ "clean": "rm -rf dist"
58
+ }
59
+ }