@qihuang02/world-book-mcp 0.0.3

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 (245) hide show
  1. package/README.md +187 -0
  2. package/dist/core/capability-matrix.d.ts +17 -0
  3. package/dist/core/capability-matrix.js +133 -0
  4. package/dist/core/capability-matrix.js.map +1 -0
  5. package/dist/core/chapter-extraction.d.ts +12 -0
  6. package/dist/core/chapter-extraction.js +65 -0
  7. package/dist/core/chapter-extraction.js.map +1 -0
  8. package/dist/core/character-card-builder.d.ts +76 -0
  9. package/dist/core/character-card-builder.js +112 -0
  10. package/dist/core/character-card-builder.js.map +1 -0
  11. package/dist/core/character-card-query.d.ts +5 -0
  12. package/dist/core/character-card-query.js +30 -0
  13. package/dist/core/character-card-query.js.map +1 -0
  14. package/dist/core/character-card-validator.d.ts +17 -0
  15. package/dist/core/character-card-validator.js +42 -0
  16. package/dist/core/character-card-validator.js.map +1 -0
  17. package/dist/core/character-templates.d.ts +29 -0
  18. package/dist/core/character-templates.js +60 -0
  19. package/dist/core/character-templates.js.map +1 -0
  20. package/dist/core/clarification.d.ts +24 -0
  21. package/dist/core/clarification.js +433 -0
  22. package/dist/core/clarification.js.map +1 -0
  23. package/dist/core/config-explainer.d.ts +2 -0
  24. package/dist/core/config-explainer.js +44 -0
  25. package/dist/core/config-explainer.js.map +1 -0
  26. package/dist/core/content-lint.d.ts +15 -0
  27. package/dist/core/content-lint.js +90 -0
  28. package/dist/core/content-lint.js.map +1 -0
  29. package/dist/core/decision-prompts.d.ts +45 -0
  30. package/dist/core/decision-prompts.js +93 -0
  31. package/dist/core/decision-prompts.js.map +1 -0
  32. package/dist/core/delivery-checklist.d.ts +21 -0
  33. package/dist/core/delivery-checklist.js +63 -0
  34. package/dist/core/delivery-checklist.js.map +1 -0
  35. package/dist/core/derivative-outline.d.ts +19 -0
  36. package/dist/core/derivative-outline.js +107 -0
  37. package/dist/core/derivative-outline.js.map +1 -0
  38. package/dist/core/draft-template.d.ts +2 -0
  39. package/dist/core/draft-template.js +19 -0
  40. package/dist/core/draft-template.js.map +1 -0
  41. package/dist/core/draft-update.d.ts +5 -0
  42. package/dist/core/draft-update.js +34 -0
  43. package/dist/core/draft-update.js.map +1 -0
  44. package/dist/core/ejs-entries.d.ts +5 -0
  45. package/dist/core/ejs-entries.js +22 -0
  46. package/dist/core/ejs-entries.js.map +1 -0
  47. package/dist/core/ejs-phase-plan.d.ts +27 -0
  48. package/dist/core/ejs-phase-plan.js +77 -0
  49. package/dist/core/ejs-phase-plan.js.map +1 -0
  50. package/dist/core/ejs-template.d.ts +10 -0
  51. package/dist/core/ejs-template.js +70 -0
  52. package/dist/core/ejs-template.js.map +1 -0
  53. package/dist/core/ejs-validator.d.ts +18 -0
  54. package/dist/core/ejs-validator.js +60 -0
  55. package/dist/core/ejs-validator.js.map +1 -0
  56. package/dist/core/entry-planner.d.ts +8 -0
  57. package/dist/core/entry-planner.js +79 -0
  58. package/dist/core/entry-planner.js.map +1 -0
  59. package/dist/core/entry-templates.d.ts +7 -0
  60. package/dist/core/entry-templates.js +66 -0
  61. package/dist/core/entry-templates.js.map +1 -0
  62. package/dist/core/extraction-outline.d.ts +2 -0
  63. package/dist/core/extraction-outline.js +46 -0
  64. package/dist/core/extraction-outline.js.map +1 -0
  65. package/dist/core/final-review.d.ts +13 -0
  66. package/dist/core/final-review.js +80 -0
  67. package/dist/core/final-review.js.map +1 -0
  68. package/dist/core/greeting-validator.d.ts +17 -0
  69. package/dist/core/greeting-validator.js +79 -0
  70. package/dist/core/greeting-validator.js.map +1 -0
  71. package/dist/core/html-beautify-assets.d.ts +6 -0
  72. package/dist/core/html-beautify-assets.js +59 -0
  73. package/dist/core/html-beautify-assets.js.map +1 -0
  74. package/dist/core/html-beautify-template.d.ts +8 -0
  75. package/dist/core/html-beautify-template.js +46 -0
  76. package/dist/core/html-beautify-template.js.map +1 -0
  77. package/dist/core/html-beautify-validator.d.ts +21 -0
  78. package/dist/core/html-beautify-validator.js +66 -0
  79. package/dist/core/html-beautify-validator.js.map +1 -0
  80. package/dist/core/html-regex-pair.d.ts +18 -0
  81. package/dist/core/html-regex-pair.js +77 -0
  82. package/dist/core/html-regex-pair.js.map +1 -0
  83. package/dist/core/item-entry-validator.d.ts +10 -0
  84. package/dist/core/item-entry-validator.js +27 -0
  85. package/dist/core/item-entry-validator.js.map +1 -0
  86. package/dist/core/mvu-assets.d.ts +44 -0
  87. package/dist/core/mvu-assets.js +140 -0
  88. package/dist/core/mvu-assets.js.map +1 -0
  89. package/dist/core/mvu-template.d.ts +8 -0
  90. package/dist/core/mvu-template.js +45 -0
  91. package/dist/core/mvu-template.js.map +1 -0
  92. package/dist/core/mvu-validator.d.ts +18 -0
  93. package/dist/core/mvu-validator.js +75 -0
  94. package/dist/core/mvu-validator.js.map +1 -0
  95. package/dist/core/position-map.d.ts +5 -0
  96. package/dist/core/position-map.js +27 -0
  97. package/dist/core/position-map.js.map +1 -0
  98. package/dist/core/project-lint.d.ts +15 -0
  99. package/dist/core/project-lint.js +54 -0
  100. package/dist/core/project-lint.js.map +1 -0
  101. package/dist/core/regex-validator.d.ts +13 -0
  102. package/dist/core/regex-validator.js +41 -0
  103. package/dist/core/regex-validator.js.map +1 -0
  104. package/dist/core/style-extraction.d.ts +12 -0
  105. package/dist/core/style-extraction.js +87 -0
  106. package/dist/core/style-extraction.js.map +1 -0
  107. package/dist/core/task-classifier.d.ts +17 -0
  108. package/dist/core/task-classifier.js +107 -0
  109. package/dist/core/task-classifier.js.map +1 -0
  110. package/dist/core/tool-usage-guide.d.ts +13 -0
  111. package/dist/core/tool-usage-guide.js +198 -0
  112. package/dist/core/tool-usage-guide.js.map +1 -0
  113. package/dist/core/workflow.d.ts +12 -0
  114. package/dist/core/workflow.js +129 -0
  115. package/dist/core/workflow.js.map +1 -0
  116. package/dist/core/worldbook-builder.d.ts +6 -0
  117. package/dist/core/worldbook-builder.js +60 -0
  118. package/dist/core/worldbook-builder.js.map +1 -0
  119. package/dist/core/worldbook-importer.d.ts +7 -0
  120. package/dist/core/worldbook-importer.js +50 -0
  121. package/dist/core/worldbook-importer.js.map +1 -0
  122. package/dist/core/worldbook-patch.d.ts +23 -0
  123. package/dist/core/worldbook-patch.js +100 -0
  124. package/dist/core/worldbook-patch.js.map +1 -0
  125. package/dist/core/worldbook-planning.d.ts +41 -0
  126. package/dist/core/worldbook-planning.js +74 -0
  127. package/dist/core/worldbook-planning.js.map +1 -0
  128. package/dist/core/worldbook-query.d.ts +7 -0
  129. package/dist/core/worldbook-query.js +58 -0
  130. package/dist/core/worldbook-query.js.map +1 -0
  131. package/dist/core/worldbook-validator.d.ts +19 -0
  132. package/dist/core/worldbook-validator.js +116 -0
  133. package/dist/core/worldbook-validator.js.map +1 -0
  134. package/dist/core/worldbuilding.d.ts +80 -0
  135. package/dist/core/worldbuilding.js +134 -0
  136. package/dist/core/worldbuilding.js.map +1 -0
  137. package/dist/core/writing-optimization-report.d.ts +19 -0
  138. package/dist/core/writing-optimization-report.js +25 -0
  139. package/dist/core/writing-optimization-report.js.map +1 -0
  140. package/dist/index.d.ts +2 -0
  141. package/dist/index.js +15 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/prompts/register.d.ts +2 -0
  144. package/dist/prompts/register.js +37 -0
  145. package/dist/prompts/register.js.map +1 -0
  146. package/dist/resources/usage-resources.d.ts +2 -0
  147. package/dist/resources/usage-resources.js +15 -0
  148. package/dist/resources/usage-resources.js.map +1 -0
  149. package/dist/schemas/chapter-outline.d.ts +28 -0
  150. package/dist/schemas/chapter-outline.js +17 -0
  151. package/dist/schemas/chapter-outline.js.map +1 -0
  152. package/dist/schemas/character-card.d.ts +124 -0
  153. package/dist/schemas/character-card.js +49 -0
  154. package/dist/schemas/character-card.js.map +1 -0
  155. package/dist/schemas/decision.d.ts +50 -0
  156. package/dist/schemas/decision.js +37 -0
  157. package/dist/schemas/decision.js.map +1 -0
  158. package/dist/schemas/derivative-outline.d.ts +204 -0
  159. package/dist/schemas/derivative-outline.js +55 -0
  160. package/dist/schemas/derivative-outline.js.map +1 -0
  161. package/dist/schemas/ejs.d.ts +189 -0
  162. package/dist/schemas/ejs.js +40 -0
  163. package/dist/schemas/ejs.js.map +1 -0
  164. package/dist/schemas/extraction.d.ts +219 -0
  165. package/dist/schemas/extraction.js +51 -0
  166. package/dist/schemas/extraction.js.map +1 -0
  167. package/dist/schemas/html-beautify.d.ts +159 -0
  168. package/dist/schemas/html-beautify.js +42 -0
  169. package/dist/schemas/html-beautify.js.map +1 -0
  170. package/dist/schemas/mvu.d.ts +60 -0
  171. package/dist/schemas/mvu.js +30 -0
  172. package/dist/schemas/mvu.js.map +1 -0
  173. package/dist/schemas/project.d.ts +579 -0
  174. package/dist/schemas/project.js +50 -0
  175. package/dist/schemas/project.js.map +1 -0
  176. package/dist/schemas/research.d.ts +56 -0
  177. package/dist/schemas/research.js +21 -0
  178. package/dist/schemas/research.js.map +1 -0
  179. package/dist/schemas/sillytavern-worldbook.d.ts +104 -0
  180. package/dist/schemas/sillytavern-worldbook.js +55 -0
  181. package/dist/schemas/sillytavern-worldbook.js.map +1 -0
  182. package/dist/schemas/source.d.ts +40 -0
  183. package/dist/schemas/source.js +20 -0
  184. package/dist/schemas/source.js.map +1 -0
  185. package/dist/schemas/style-profile.d.ts +35 -0
  186. package/dist/schemas/style-profile.js +16 -0
  187. package/dist/schemas/style-profile.js.map +1 -0
  188. package/dist/schemas/worldbook-draft.d.ts +236 -0
  189. package/dist/schemas/worldbook-draft.js +89 -0
  190. package/dist/schemas/worldbook-draft.js.map +1 -0
  191. package/dist/schemas/worldbook-patch.d.ts +423 -0
  192. package/dist/schemas/worldbook-patch.js +78 -0
  193. package/dist/schemas/worldbook-patch.js.map +1 -0
  194. package/dist/server.d.ts +2 -0
  195. package/dist/server.js +15 -0
  196. package/dist/server.js.map +1 -0
  197. package/dist/storage/path-policy.d.ts +13 -0
  198. package/dist/storage/path-policy.js +44 -0
  199. package/dist/storage/path-policy.js.map +1 -0
  200. package/dist/storage/project-store.d.ts +8 -0
  201. package/dist/storage/project-store.js +113 -0
  202. package/dist/storage/project-store.js.map +1 -0
  203. package/dist/tools/character-card-tools.d.ts +2 -0
  204. package/dist/tools/character-card-tools.js +118 -0
  205. package/dist/tools/character-card-tools.js.map +1 -0
  206. package/dist/tools/decision-tools.d.ts +2 -0
  207. package/dist/tools/decision-tools.js +55 -0
  208. package/dist/tools/decision-tools.js.map +1 -0
  209. package/dist/tools/extraction-tools.d.ts +2 -0
  210. package/dist/tools/extraction-tools.js +57 -0
  211. package/dist/tools/extraction-tools.js.map +1 -0
  212. package/dist/tools/helpers.d.ts +9 -0
  213. package/dist/tools/helpers.js +14 -0
  214. package/dist/tools/helpers.js.map +1 -0
  215. package/dist/tools/lint-review-tools.d.ts +2 -0
  216. package/dist/tools/lint-review-tools.js +30 -0
  217. package/dist/tools/lint-review-tools.js.map +1 -0
  218. package/dist/tools/mvu-html-ejs-tools.d.ts +2 -0
  219. package/dist/tools/mvu-html-ejs-tools.js +153 -0
  220. package/dist/tools/mvu-html-ejs-tools.js.map +1 -0
  221. package/dist/tools/project-tools.d.ts +2 -0
  222. package/dist/tools/project-tools.js +39 -0
  223. package/dist/tools/project-tools.js.map +1 -0
  224. package/dist/tools/register.d.ts +2 -0
  225. package/dist/tools/register.js +23 -0
  226. package/dist/tools/register.js.map +1 -0
  227. package/dist/tools/style-chapter-tools.d.ts +2 -0
  228. package/dist/tools/style-chapter-tools.js +40 -0
  229. package/dist/tools/style-chapter-tools.js.map +1 -0
  230. package/dist/tools/workflow-tools.d.ts +2 -0
  231. package/dist/tools/workflow-tools.js +60 -0
  232. package/dist/tools/workflow-tools.js.map +1 -0
  233. package/dist/tools/worldbook-tools.d.ts +2 -0
  234. package/dist/tools/worldbook-tools.js +180 -0
  235. package/dist/tools/worldbook-tools.js.map +1 -0
  236. package/dist/tools/worldbuilding-tools.d.ts +2 -0
  237. package/dist/tools/worldbuilding-tools.js +40 -0
  238. package/dist/tools/worldbuilding-tools.js.map +1 -0
  239. package/dist/utils/ids.d.ts +2 -0
  240. package/dist/utils/ids.js +8 -0
  241. package/dist/utils/ids.js.map +1 -0
  242. package/dist/utils/json.d.ts +2 -0
  243. package/dist/utils/json.js +7 -0
  244. package/dist/utils/json.js.map +1 -0
  245. package/package.json +32 -0
@@ -0,0 +1,44 @@
1
+ import path from "node:path";
2
+ export const ROOT_DIR = process.cwd();
3
+ export const OUTPUT_DIR = path.resolve(ROOT_DIR, "output");
4
+ export const PROJECTS_DIR = path.resolve(OUTPUT_DIR, "projects");
5
+ export const EXPORTS_DIR = path.resolve(OUTPUT_DIR, "exports");
6
+ export const BACKUPS_DIR = path.resolve(EXPORTS_DIR, "backups");
7
+ export const CARDS_DIR = path.resolve(EXPORTS_DIR, "cards");
8
+ export function assertInside(baseDir, candidate) {
9
+ const resolvedBase = path.resolve(baseDir);
10
+ const resolvedCandidate = path.resolve(candidate);
11
+ const relative = path.relative(resolvedBase, resolvedCandidate);
12
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
13
+ throw new Error(`路径不允许越界: ${candidate}`);
14
+ }
15
+ return resolvedCandidate;
16
+ }
17
+ export function resolveExportPath(outputPath, fallbackName) {
18
+ const filename = outputPath?.trim() || `${sanitizeFilename(fallbackName)}.json`;
19
+ const resolved = path.isAbsolute(filename) ? filename : path.resolve(EXPORTS_DIR, filename);
20
+ return assertInside(EXPORTS_DIR, resolved);
21
+ }
22
+ export function resolveReadableWorldbookPath(inputPath) {
23
+ const resolved = path.isAbsolute(inputPath) ? inputPath : path.resolve(EXPORTS_DIR, inputPath);
24
+ return assertInside(EXPORTS_DIR, resolved);
25
+ }
26
+ export function resolveBackupPath(originalPath, timestamp = new Date()) {
27
+ const parsed = path.parse(originalPath);
28
+ const safeBase = sanitizeFilename(parsed.name || "worldbook");
29
+ const stamp = timestamp.toISOString().replace(/[:.]/g, "-");
30
+ return assertInside(BACKUPS_DIR, path.resolve(BACKUPS_DIR, `${safeBase}.${stamp}.bak.json`));
31
+ }
32
+ export function resolveCardExportPath(outputPath, fallbackName) {
33
+ const filename = outputPath?.trim() || `${sanitizeFilename(fallbackName)}.json`;
34
+ const resolved = path.isAbsolute(filename) ? filename : path.resolve(CARDS_DIR, filename);
35
+ return assertInside(CARDS_DIR, resolved);
36
+ }
37
+ export function resolveReadableCardPath(inputPath) {
38
+ const resolved = path.isAbsolute(inputPath) ? inputPath : path.resolve(CARDS_DIR, inputPath);
39
+ return assertInside(CARDS_DIR, resolved);
40
+ }
41
+ export function sanitizeFilename(name) {
42
+ return name.replace(/[<>:"/\\|?*\u0000-\u001F]/g, "_").trim() || "worldbook";
43
+ }
44
+ //# sourceMappingURL=path-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-policy.js","sourceRoot":"","sources":["../../src/storage/path-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type Project } from "../schemas/project.js";
2
+ export declare function ensureStorage(): Promise<void>;
3
+ export declare function createProject(name: string): Promise<Project>;
4
+ export declare function loadProject(projectId: string): Promise<Project>;
5
+ export declare function saveProject(project: Project): Promise<Project>;
6
+ export declare function loadOrCreateProject(projectId: string | undefined, fallbackName: string): Promise<Project>;
7
+ export declare function listProjects(): Promise<Project[]>;
8
+ export declare function summarizeProject(project: Project, includeContent?: boolean): unknown;
@@ -0,0 +1,113 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { ProjectSchema } from "../schemas/project.js";
4
+ import { createId, nowIso } from "../utils/ids.js";
5
+ import { safeJsonParse, toPrettyJson } from "../utils/json.js";
6
+ import { PROJECTS_DIR } from "./path-policy.js";
7
+ export async function ensureStorage() {
8
+ await fs.mkdir(PROJECTS_DIR, { recursive: true });
9
+ }
10
+ function projectPath(projectId) {
11
+ return path.join(PROJECTS_DIR, `${projectId}.json`);
12
+ }
13
+ export async function createProject(name) {
14
+ await ensureStorage();
15
+ const timestamp = nowIso();
16
+ const project = {
17
+ id: createId("project"),
18
+ name,
19
+ sources: [],
20
+ research: [],
21
+ patches: [],
22
+ pendingDecisions: [],
23
+ recordedDecisions: [],
24
+ createdAt: timestamp,
25
+ updatedAt: timestamp,
26
+ };
27
+ await saveProject(project);
28
+ return project;
29
+ }
30
+ export async function loadProject(projectId) {
31
+ await ensureStorage();
32
+ const text = await fs.readFile(projectPath(projectId), "utf8");
33
+ return ProjectSchema.parse(safeJsonParse(text));
34
+ }
35
+ export async function saveProject(project) {
36
+ await ensureStorage();
37
+ const updated = { ...project, updatedAt: nowIso() };
38
+ await fs.writeFile(projectPath(updated.id), toPrettyJson(updated), "utf8");
39
+ return updated;
40
+ }
41
+ export async function loadOrCreateProject(projectId, fallbackName) {
42
+ if (projectId) {
43
+ return loadProject(projectId);
44
+ }
45
+ return createProject(fallbackName);
46
+ }
47
+ export async function listProjects() {
48
+ await ensureStorage();
49
+ const files = await fs.readdir(PROJECTS_DIR);
50
+ const projects = [];
51
+ for (const file of files) {
52
+ if (!file.endsWith(".json"))
53
+ continue;
54
+ const text = await fs.readFile(path.join(PROJECTS_DIR, file), "utf8");
55
+ projects.push(ProjectSchema.parse(safeJsonParse(text)));
56
+ }
57
+ return projects.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
58
+ }
59
+ export function summarizeProject(project, includeContent = false) {
60
+ return {
61
+ id: project.id,
62
+ name: project.name,
63
+ sources: includeContent ? project.sources : project.sources.map((source) => ({
64
+ id: source.id,
65
+ title: source.title,
66
+ sourceType: source.sourceType,
67
+ sourceUrl: source.sourceUrl,
68
+ tags: source.tags,
69
+ characters: source.content.length,
70
+ createdAt: source.createdAt,
71
+ })),
72
+ research: project.research.map((bundle) => ({
73
+ id: bundle.id,
74
+ topic: bundle.topic,
75
+ item_count: bundle.items.length,
76
+ items: includeContent ? bundle.items : undefined,
77
+ createdAt: bundle.createdAt,
78
+ })),
79
+ has_extraction: Boolean(project.extraction),
80
+ extraction_summary: project.extraction ? {
81
+ title: project.extraction.title,
82
+ character_count: project.extraction.characters.length,
83
+ world_fact_count: project.extraction.world.length,
84
+ item_count: project.extraction.items.length,
85
+ event_count: project.extraction.events.length,
86
+ } : undefined,
87
+ has_worldbuilding_summary: Boolean(project.worldbuildingSummary),
88
+ worldbuilding_summary: includeContent ? project.worldbuildingSummary : undefined,
89
+ plan_count: project.plan?.length ?? 0,
90
+ draft_count: project.draft?.length ?? 0,
91
+ importedWorldbookPath: project.importedWorldbookPath,
92
+ patch_count: project.patches?.length ?? 0,
93
+ patches: includeContent ? project.patches : project.patches?.map((patch) => ({ id: patch.id, operation_count: patch.operations.length, createdAt: patch.createdAt })),
94
+ has_character_card_config: Boolean(project.characterCardConfig),
95
+ character_card_name: project.characterCardConfig?.card.name,
96
+ has_mvu_config: Boolean(project.mvuConfig),
97
+ mvu_enabled: project.mvuConfig?.enabled,
98
+ has_html_beautify_config: Boolean(project.htmlBeautifyConfig),
99
+ html_beautify_enabled: project.htmlBeautifyConfig?.enabled,
100
+ html_beautify_target: project.htmlBeautifyConfig?.target,
101
+ has_ejs_config: Boolean(project.ejsConfig),
102
+ ejs_enabled: project.ejsConfig?.enabled,
103
+ ejs_template_type: project.ejsConfig?.template_type,
104
+ characterCardConfig: includeContent ? project.characterCardConfig : undefined,
105
+ mvuConfig: includeContent ? project.mvuConfig : undefined,
106
+ htmlBeautifyConfig: includeContent ? project.htmlBeautifyConfig : undefined,
107
+ ejsConfig: includeContent ? project.ejsConfig : undefined,
108
+ draft: includeContent ? project.draft : undefined,
109
+ createdAt: project.createdAt,
110
+ updatedAt: project.updatedAt,
111
+ };
112
+ }
113
+ //# sourceMappingURL=project-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-store.js","sourceRoot":"","sources":["../../src/storage/project-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerCharacterCardTools(server: McpServer): void;
@@ -0,0 +1,118 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { buildCharacterCardJson } from "../core/character-card-builder.js";
5
+ import { queryCharacterCard } from "../core/character-card-query.js";
6
+ import { validateCharacterCardConfig } from "../core/character-card-validator.js";
7
+ import { createDeliveryChecklist } from "../core/delivery-checklist.js";
8
+ import { buildEjsEntries } from "../core/ejs-entries.js";
9
+ import { validateEjsConfig } from "../core/ejs-validator.js";
10
+ import { validateGreetings } from "../core/greeting-validator.js";
11
+ import { buildHtmlBeautifyAssets } from "../core/html-beautify-assets.js";
12
+ import { validateHtmlBeautifyConfig } from "../core/html-beautify-validator.js";
13
+ import { buildMvuAssets } from "../core/mvu-assets.js";
14
+ import { validateMvuConfig } from "../core/mvu-validator.js";
15
+ import { CharacterCardConfigSchema, CreateCharacterCardTemplateInputSchema, GenerateCharacterCardJsonInputSchema, QueryCharacterCardInputSchema, SubmitCharacterCardConfigInputSchema, ValidateCharacterCardConfigInputSchema } from "../schemas/character-card.js";
16
+ import { resolveCardExportPath } from "../storage/path-policy.js";
17
+ import { loadProject, saveProject } from "../storage/project-store.js";
18
+ import { toPrettyJson } from "../utils/json.js";
19
+ import { toolText } from "./helpers.js";
20
+ export function registerCharacterCardTools(server) {
21
+ server.tool("create_character_card_template", CreateCharacterCardTemplateInputSchema.shape, async (input) => {
22
+ const parsed = CreateCharacterCardTemplateInputSchema.parse(input);
23
+ const alternateGreetings = Array.from({ length: parsed.greeting_count }, () => "");
24
+ const config = CharacterCardConfigSchema.parse({
25
+ card: {
26
+ name: parsed.name,
27
+ description: "",
28
+ personality: "",
29
+ scenario: "",
30
+ first_mes: "",
31
+ alternate_greetings: alternateGreetings,
32
+ creator_notes: "",
33
+ system_prompt: "",
34
+ post_history_instructions: "",
35
+ tags: [],
36
+ creator: "",
37
+ character_version: "1.0",
38
+ talkativeness: "0.5",
39
+ },
40
+ worldbook: { source: parsed.include_worldbook ? "project_draft" : "none", name: parsed.name },
41
+ });
42
+ return toolText({ project_id: parsed.project_id, config, recommended_next_tool: "submit_character_card_config" });
43
+ });
44
+ server.tool("submit_character_card_config", SubmitCharacterCardConfigInputSchema.shape, async (input) => {
45
+ const parsed = SubmitCharacterCardConfigInputSchema.parse(input);
46
+ const project = await loadProject(parsed.project_id);
47
+ const saved = await saveProject({ ...project, characterCardConfig: parsed.config });
48
+ const validation = validateCharacterCardConfig({ config: parsed.config, draft: saved.draft, mvuEnabled: saved.mvuConfig?.enabled });
49
+ return toolText({ project_id: saved.id, validation, recommended_next_tool: validation.valid ? "generate_character_card_json" : "validate_character_card_config" });
50
+ });
51
+ server.tool("validate_character_card_config", ValidateCharacterCardConfigInputSchema.shape, async (input) => {
52
+ const parsed = ValidateCharacterCardConfigInputSchema.parse(input);
53
+ const project = await loadProject(parsed.project_id);
54
+ const config = parsed.config ?? project.characterCardConfig;
55
+ if (!config)
56
+ throw new Error("项目尚未保存 character card config");
57
+ return toolText(validateCharacterCardConfig({ config, draft: project.draft, mvuEnabled: project.mvuConfig?.enabled }));
58
+ });
59
+ server.tool("validate_greetings", { project_id: z.string(), config: CharacterCardConfigSchema.optional(), mvu_enabled: z.boolean().optional() }, async (input) => {
60
+ const project = await loadProject(input.project_id);
61
+ const config = input.config ?? project.characterCardConfig;
62
+ if (!config)
63
+ throw new Error("项目尚未保存 character card config");
64
+ return toolText(validateGreetings({ config, mvu_enabled: input.mvu_enabled ?? project.mvuConfig?.enabled }));
65
+ });
66
+ server.tool("generate_character_card_json", GenerateCharacterCardJsonInputSchema.shape, async (input) => {
67
+ const parsed = GenerateCharacterCardJsonInputSchema.parse(input);
68
+ const project = await loadProject(parsed.project_id);
69
+ if (!project.characterCardConfig)
70
+ throw new Error("项目尚未保存 character card config");
71
+ const validation = validateCharacterCardConfig({ config: project.characterCardConfig, draft: project.draft, mvuEnabled: project.mvuConfig?.enabled });
72
+ if (!validation.valid)
73
+ return toolText({ ok: false, validation });
74
+ const mvuValidation = project.mvuConfig?.enabled ? validateMvuConfig({ mvu: project.mvuConfig, characterCardConfig: project.characterCardConfig }) : undefined;
75
+ if (mvuValidation && !mvuValidation.valid)
76
+ return toolText({ ok: false, validation: mvuValidation });
77
+ const mvuAssets = project.mvuConfig?.enabled ? buildMvuAssets(project.mvuConfig) : undefined;
78
+ const htmlValidation = project.htmlBeautifyConfig?.enabled ? validateHtmlBeautifyConfig({ html: project.htmlBeautifyConfig, mvu: project.mvuConfig, characterCardConfig: project.characterCardConfig }) : undefined;
79
+ if (htmlValidation && !htmlValidation.valid)
80
+ return toolText({ ok: false, validation: htmlValidation });
81
+ const htmlAssets = project.htmlBeautifyConfig?.enabled ? buildHtmlBeautifyAssets(project.htmlBeautifyConfig) : undefined;
82
+ const ejsValidation = project.ejsConfig?.enabled ? validateEjsConfig({ ejs: project.ejsConfig, mvu: project.mvuConfig }) : undefined;
83
+ if (ejsValidation && !ejsValidation.valid)
84
+ return toolText({ ok: false, validation: ejsValidation });
85
+ const ejsEntries = project.ejsConfig?.enabled ? buildEjsEntries(project.ejsConfig).worldbookEntries : undefined;
86
+ if (parsed.strict_review) {
87
+ const checklist = createDeliveryChecklist({ project, export_target: "character_card" });
88
+ if (!checklist.ready_to_export)
89
+ return toolText({ ok: false, error: "strict_review 未通过", checklist });
90
+ }
91
+ const card = buildCharacterCardJson({
92
+ config: project.characterCardConfig,
93
+ worldbookEntries: project.draft,
94
+ worldbookName: project.characterCardConfig.worldbook.name ?? project.name,
95
+ mvuAssets,
96
+ htmlAssets,
97
+ ejsEntries,
98
+ });
99
+ const outputPath = resolveCardExportPath(parsed.output_path, project.characterCardConfig.card.name);
100
+ if (!parsed.overwrite) {
101
+ try {
102
+ await fs.access(outputPath);
103
+ return toolText({ ok: false, error: "文件已存在,如需覆盖请设置 overwrite=true", path: outputPath });
104
+ }
105
+ catch {
106
+ // 文件不存在,可以写入
107
+ }
108
+ }
109
+ await fs.mkdir(path.dirname(outputPath), { recursive: true });
110
+ await fs.writeFile(outputPath, toPrettyJson(card), "utf8");
111
+ return toolText({ ok: true, path: outputPath, name: card.name, worldbook_entry_count: card.data.character_book.entries.length });
112
+ });
113
+ server.tool("query_character_card", QueryCharacterCardInputSchema.shape, async (input) => {
114
+ const parsed = QueryCharacterCardInputSchema.parse(input);
115
+ return toolText(await queryCharacterCard(parsed));
116
+ });
117
+ }
118
+ //# sourceMappingURL=character-card-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character-card-tools.js","sourceRoot":"","sources":["../../src/tools/character-card-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDecisionTools(server: McpServer): void;
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { clearUserDecision, listUserDecisions, recordUserDecision, requestUserDecision } from "../core/decision-prompts.js";
3
+ import { DecisionOptionSchema } from "../schemas/decision.js";
4
+ import { loadProject, saveProject } from "../storage/project-store.js";
5
+ import { toolText } from "./helpers.js";
6
+ export function registerDecisionTools(server) {
7
+ server.tool("request_user_decision", {
8
+ project_id: z.string(),
9
+ id: z.string().min(1),
10
+ question: z.string().min(1),
11
+ context: z.string().optional(),
12
+ source_tool: z.string().optional(),
13
+ options: z.array(DecisionOptionSchema).optional(),
14
+ allow_custom: z.boolean().optional(),
15
+ multiple: z.boolean().optional(),
16
+ default_value: z.string().optional(),
17
+ }, async (input) => {
18
+ const project = await loadProject(input.project_id);
19
+ const result = requestUserDecision(project, input);
20
+ await saveProject(result.project);
21
+ return toolText({
22
+ project_id: result.project.id,
23
+ decision: result.decision,
24
+ prompt_text: result.prompt_text,
25
+ recorded_already: result.recorded_already,
26
+ recommended_next_tool: "record_user_decision",
27
+ });
28
+ });
29
+ server.tool("record_user_decision", {
30
+ project_id: z.string(),
31
+ id: z.string().min(1),
32
+ selected_values: z.array(z.string()).default([]),
33
+ custom_text: z.string().optional(),
34
+ }, async (input) => {
35
+ const project = await loadProject(input.project_id);
36
+ const result = recordUserDecision(project, input);
37
+ await saveProject(result.project);
38
+ return toolText({ project_id: result.project.id, recorded: result.recorded, recommended_next_tool: result.recommended_next_tool });
39
+ });
40
+ server.tool("list_user_decisions", {
41
+ project_id: z.string(),
42
+ only_pending: z.boolean().optional(),
43
+ only_recorded: z.boolean().optional(),
44
+ }, async (input) => {
45
+ const project = await loadProject(input.project_id);
46
+ return toolText(listUserDecisions(project, { only_pending: input.only_pending, only_recorded: input.only_recorded }));
47
+ });
48
+ server.tool("clear_user_decision", { project_id: z.string(), id: z.string().min(1) }, async (input) => {
49
+ const project = await loadProject(input.project_id);
50
+ const result = clearUserDecision(project, input.id);
51
+ await saveProject(result.project);
52
+ return toolText({ project_id: result.project.id, cleared_pending: result.cleared_pending, cleared_recorded: result.cleared_recorded });
53
+ });
54
+ }
55
+ //# sourceMappingURL=decision-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-tools.js","sourceRoot":"","sources":["../../src/tools/decision-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerExtractionTools(server: McpServer): void;
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ import { createDerivativeExtractionTemplate, derivativeOutlineToExtraction, validateDerivativeExtractionOutline } from "../core/derivative-outline.js";
3
+ import { createExtractionOutline } from "../core/extraction-outline.js";
4
+ import { planEntries } from "../core/entry-planner.js";
5
+ import { DerivativeExtractionOutlineSchema, DerivativeFocusSchema, DerivativeSourceKindSchema } from "../schemas/derivative-outline.js";
6
+ import { SubmitExtractionResultInputSchema } from "../schemas/extraction.js";
7
+ import { loadProject, saveProject } from "../storage/project-store.js";
8
+ import { toolText } from "./helpers.js";
9
+ export function registerExtractionTools(server) {
10
+ server.tool("create_extraction_outline", { project_id: z.string().optional(), focus: z.array(z.enum(["characters", "world", "items", "events"])).optional() }, async (input) => {
11
+ const outline = createExtractionOutline(input.focus);
12
+ return toolText({ project_id: input.project_id, ...outline });
13
+ });
14
+ server.tool("submit_extraction_result", SubmitExtractionResultInputSchema.shape, async (input) => {
15
+ const parsed = SubmitExtractionResultInputSchema.parse(input);
16
+ const project = await loadProject(parsed.project_id);
17
+ const extraction = {
18
+ projectId: parsed.project_id,
19
+ title: parsed.title,
20
+ characters: parsed.characters,
21
+ world: parsed.world,
22
+ items: parsed.items,
23
+ events: parsed.events,
24
+ sourceRefs: parsed.sourceRefs,
25
+ };
26
+ await saveProject({ ...project, extraction });
27
+ return toolText({ project_id: parsed.project_id, character_count: extraction.characters.length, world_fact_count: extraction.world.length, item_count: extraction.items.length, event_count: extraction.events.length, recommended_next_tool: "plan_worldbook_entries" });
28
+ });
29
+ server.tool("plan_worldbook_entries", { project_id: z.string() }, async (input) => {
30
+ const project = await loadProject(input.project_id);
31
+ if (!project.extraction)
32
+ throw new Error("项目尚未提交 extraction result");
33
+ const result = planEntries(project.extraction);
34
+ await saveProject({ ...project, plan: result.entries_plan });
35
+ return toolText({ project_id: project.id, ...result, recommended_next_tool: "draft_worldbook_entries" });
36
+ });
37
+ server.tool("create_derivative_extraction_template", {
38
+ project_id: z.string().optional(),
39
+ title: z.string().optional(),
40
+ source_kind: DerivativeSourceKindSchema.optional(),
41
+ focus: z.array(DerivativeFocusSchema).optional(),
42
+ }, async (input) => toolText({ project_id: input.project_id, outline: createDerivativeExtractionTemplate(input), recommended_next_tool: "submit_derivative_extraction_outline" }));
43
+ server.tool("submit_derivative_extraction_outline", { project_id: z.string(), outline: DerivativeExtractionOutlineSchema, sync_extraction: z.boolean().default(true) }, async (input) => {
44
+ const project = await loadProject(input.project_id);
45
+ const validation = validateDerivativeExtractionOutline(input.outline);
46
+ const extraction = input.sync_extraction ? derivativeOutlineToExtraction(input.project_id, input.outline) : project.extraction;
47
+ await saveProject({ ...project, derivativeOutline: input.outline, extraction });
48
+ return toolText({ project_id: input.project_id, validation, synced_extraction: input.sync_extraction, recommended_next_tool: validation.valid ? "create_worldbook_entry_plan" : "validate_derivative_extraction_outline" });
49
+ });
50
+ server.tool("validate_derivative_extraction_outline", { project_id: z.string().optional(), outline: DerivativeExtractionOutlineSchema.optional() }, async (input) => {
51
+ const outline = input.outline ?? (input.project_id ? (await loadProject(input.project_id)).derivativeOutline : undefined);
52
+ if (!outline)
53
+ throw new Error("需要传入 outline 或提供已有 derivativeOutline 的 project_id");
54
+ return toolText(validateDerivativeExtractionOutline(outline));
55
+ });
56
+ }
57
+ //# sourceMappingURL=extraction-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-tools.js","sourceRoot":"","sources":["../../src/tools/extraction-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { z, type ZodTypeAny } from "zod";
2
+ export declare function toolText(value: unknown): {
3
+ content: {
4
+ type: "text";
5
+ text: string;
6
+ }[];
7
+ };
8
+ export declare function zodToShape<T extends z.ZodRawShape>(schema: z.ZodObject<T>): T;
9
+ export type AnySchema = ZodTypeAny;
@@ -0,0 +1,14 @@
1
+ export function toolText(value) {
2
+ return {
3
+ content: [
4
+ {
5
+ type: "text",
6
+ text: typeof value === "string" ? value : JSON.stringify(value, null, 2),
7
+ },
8
+ ],
9
+ };
10
+ }
11
+ export function zodToShape(schema) {
12
+ return schema.shape;
13
+ }
14
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACzE;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAA0B,MAAsB;IACxE,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerLintReviewTools(server: McpServer): void;
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { lintContent } from "../core/content-lint.js";
3
+ import { createDeliveryChecklist } from "../core/delivery-checklist.js";
4
+ import { createFinalReviewReport } from "../core/final-review.js";
5
+ import { lintProjectContent } from "../core/project-lint.js";
6
+ import { createWritingOptimizationReport } from "../core/writing-optimization-report.js";
7
+ import { loadProject } from "../storage/project-store.js";
8
+ import { toolText } from "./helpers.js";
9
+ export function registerLintReviewTools(server) {
10
+ server.tool("lint_worldbook_content", { content: z.string().min(1) }, async (input) => toolText(lintContent(input.content)));
11
+ server.tool("lint_project_content", { project_id: z.string() }, async (input) => {
12
+ const project = await loadProject(input.project_id);
13
+ return toolText(lintProjectContent(project));
14
+ });
15
+ server.tool("create_writing_optimization_report", { content: z.string().optional(), project_id: z.string().optional() }, async (input) => {
16
+ const project = input.project_id ? await loadProject(input.project_id) : undefined;
17
+ if (!input.content && !project)
18
+ throw new Error("需要提供 content 或 project_id");
19
+ return toolText(createWritingOptimizationReport({ content: input.content, project }));
20
+ });
21
+ server.tool("create_final_review_report", { project_id: z.string() }, async (input) => {
22
+ const project = await loadProject(input.project_id);
23
+ return toolText(createFinalReviewReport(project));
24
+ });
25
+ server.tool("create_delivery_checklist", { project_id: z.string(), export_target: z.enum(["worldbook", "character_card"]) }, async (input) => {
26
+ const project = await loadProject(input.project_id);
27
+ return toolText(createDeliveryChecklist({ project, export_target: input.export_target }));
28
+ });
29
+ }
30
+ //# sourceMappingURL=lint-review-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-review-tools.js","sourceRoot":"","sources":["../../src/tools/lint-review-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,wCAAwC,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE7H,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9E,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACvI,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC7E,OAAO,QAAQ,CAAC,+BAA+B,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACpF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC3I,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerMvuHtmlEjsTools(server: McpServer): void;