mcmodding-mcp 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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +324 -0
  3. package/dist/db-versioning.d.ts +31 -0
  4. package/dist/db-versioning.d.ts.map +1 -0
  5. package/dist/db-versioning.js +206 -0
  6. package/dist/db-versioning.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +202 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/indexer/chunker.d.ts +32 -0
  12. package/dist/indexer/chunker.d.ts.map +1 -0
  13. package/dist/indexer/chunker.js +157 -0
  14. package/dist/indexer/chunker.js.map +1 -0
  15. package/dist/indexer/crawler.d.ts +28 -0
  16. package/dist/indexer/crawler.d.ts.map +1 -0
  17. package/dist/indexer/crawler.js +550 -0
  18. package/dist/indexer/crawler.js.map +1 -0
  19. package/dist/indexer/embeddings.d.ts +56 -0
  20. package/dist/indexer/embeddings.d.ts.map +1 -0
  21. package/dist/indexer/embeddings.js +200 -0
  22. package/dist/indexer/embeddings.js.map +1 -0
  23. package/dist/indexer/sitemap.d.ts +35 -0
  24. package/dist/indexer/sitemap.d.ts.map +1 -0
  25. package/dist/indexer/sitemap.js +263 -0
  26. package/dist/indexer/sitemap.js.map +1 -0
  27. package/dist/indexer/store.d.ts +237 -0
  28. package/dist/indexer/store.d.ts.map +1 -0
  29. package/dist/indexer/store.js +857 -0
  30. package/dist/indexer/store.js.map +1 -0
  31. package/dist/indexer/types.d.ts +77 -0
  32. package/dist/indexer/types.d.ts.map +1 -0
  33. package/dist/indexer/types.js +2 -0
  34. package/dist/indexer/types.js.map +1 -0
  35. package/dist/indexer/updater.d.ts +52 -0
  36. package/dist/indexer/updater.d.ts.map +1 -0
  37. package/dist/indexer/updater.js +263 -0
  38. package/dist/indexer/updater.js.map +1 -0
  39. package/dist/services/concept-service.d.ts +49 -0
  40. package/dist/services/concept-service.d.ts.map +1 -0
  41. package/dist/services/concept-service.js +554 -0
  42. package/dist/services/concept-service.js.map +1 -0
  43. package/dist/services/example-service.d.ts +52 -0
  44. package/dist/services/example-service.d.ts.map +1 -0
  45. package/dist/services/example-service.js +302 -0
  46. package/dist/services/example-service.js.map +1 -0
  47. package/dist/services/search-service.d.ts +54 -0
  48. package/dist/services/search-service.d.ts.map +1 -0
  49. package/dist/services/search-service.js +519 -0
  50. package/dist/services/search-service.js.map +1 -0
  51. package/dist/services/search-utils.d.ts +34 -0
  52. package/dist/services/search-utils.d.ts.map +1 -0
  53. package/dist/services/search-utils.js +239 -0
  54. package/dist/services/search-utils.js.map +1 -0
  55. package/dist/tools/explainConcept.d.ts +9 -0
  56. package/dist/tools/explainConcept.d.ts.map +1 -0
  57. package/dist/tools/explainConcept.js +93 -0
  58. package/dist/tools/explainConcept.js.map +1 -0
  59. package/dist/tools/getExample.d.ts +20 -0
  60. package/dist/tools/getExample.d.ts.map +1 -0
  61. package/dist/tools/getExample.js +88 -0
  62. package/dist/tools/getExample.js.map +1 -0
  63. package/dist/tools/getMinecraftVersion.d.ts +6 -0
  64. package/dist/tools/getMinecraftVersion.d.ts.map +1 -0
  65. package/dist/tools/getMinecraftVersion.js +57 -0
  66. package/dist/tools/getMinecraftVersion.js.map +1 -0
  67. package/dist/tools/searchDocs.d.ts +15 -0
  68. package/dist/tools/searchDocs.d.ts.map +1 -0
  69. package/dist/tools/searchDocs.js +144 -0
  70. package/dist/tools/searchDocs.js.map +1 -0
  71. package/package.json +111 -0
  72. package/scripts/postinstall.js +859 -0
package/dist/index.js ADDED
@@ -0,0 +1,202 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { handleGetExample } from './tools/getExample.js';
6
+ import { handleGetMinecraftVersion } from './tools/getMinecraftVersion.js';
7
+ import { handleSearchDocs } from './tools/searchDocs.js';
8
+ import { handleExplainConcept } from './tools/explainConcept.js';
9
+ import { DbVersioning } from './db-versioning.js';
10
+ const server = new Server({
11
+ name: 'mcmodding-mcp',
12
+ version: '0.1.0',
13
+ }, {
14
+ capabilities: {
15
+ tools: {},
16
+ resources: {},
17
+ },
18
+ });
19
+ server.setRequestHandler(ListToolsRequestSchema, () => {
20
+ return {
21
+ tools: [
22
+ {
23
+ name: 'search_fabric_docs',
24
+ description: 'Search Fabric modding documentation for guides and API information. Use this when you need to find documentation about Fabric modding features, APIs, or tutorials.',
25
+ inputSchema: {
26
+ type: 'object',
27
+ properties: {
28
+ query: {
29
+ type: 'string',
30
+ description: "Search query (e.g., 'how to register items', 'mixin tutorial', 'networking'). Be specific for best results. Especially useful for finding guides and API references.",
31
+ },
32
+ category: {
33
+ type: 'string',
34
+ enum: [
35
+ 'getting-started',
36
+ 'items',
37
+ 'blocks',
38
+ 'entities',
39
+ 'rendering',
40
+ 'networking',
41
+ 'data-generation',
42
+ 'all',
43
+ ],
44
+ description: 'Documentation category to search within (default: all)',
45
+ default: 'all',
46
+ },
47
+ },
48
+ required: ['query'],
49
+ },
50
+ },
51
+ {
52
+ name: 'get_example',
53
+ description: 'Get code examples for Minecraft modding topics. Returns complete, working code snippets with full context including explanations, source documentation, and metadata. Use this when you need concrete code examples for implementing features.',
54
+ inputSchema: {
55
+ type: 'object',
56
+ properties: {
57
+ topic: {
58
+ type: 'string',
59
+ description: "Topic or pattern to get examples for (e.g., 'register item', 'block entity', 'mixin', 'networking', 'custom armor'). Can be free-form text.",
60
+ },
61
+ language: {
62
+ type: 'string',
63
+ description: "Programming language (e.g., 'java', 'json', 'groovy')",
64
+ default: 'java',
65
+ },
66
+ loader: {
67
+ type: 'string',
68
+ enum: ['fabric', 'neoforge', 'shared'],
69
+ description: 'Mod loader to filter by',
70
+ },
71
+ minecraft_version: {
72
+ type: 'string',
73
+ description: "Target Minecraft version (e.g., '1.21.4', '1.21.10'). Latest: use 'latest'",
74
+ },
75
+ category: {
76
+ type: 'string',
77
+ enum: [
78
+ 'getting-started',
79
+ 'items',
80
+ 'blocks',
81
+ 'entities',
82
+ 'rendering',
83
+ 'networking',
84
+ 'data-generation',
85
+ 'commands',
86
+ 'sounds',
87
+ ],
88
+ description: 'Documentation category to filter by',
89
+ },
90
+ limit: {
91
+ type: 'number',
92
+ description: 'Maximum number of examples to return (1-10)',
93
+ default: 5,
94
+ minimum: 1,
95
+ maximum: 10,
96
+ },
97
+ },
98
+ required: ['topic'],
99
+ },
100
+ },
101
+ {
102
+ name: 'explain_fabric_concept',
103
+ description: 'Get detailed explanation of a Fabric or Minecraft modding concept. Use this to understand fundamental concepts, terminology, or architectural patterns.',
104
+ inputSchema: {
105
+ type: 'object',
106
+ properties: {
107
+ concept: {
108
+ type: 'string',
109
+ description: "Concept to explain (e.g., 'mixins', 'registries', 'sided logic', 'fabric.mod.json', 'events')",
110
+ },
111
+ },
112
+ required: ['concept'],
113
+ },
114
+ },
115
+ {
116
+ name: 'get_minecraft_version',
117
+ description: 'Get Minecraft version information from the indexed documentation. Returns either the latest version or all available versions.',
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {
121
+ type: {
122
+ type: 'string',
123
+ enum: ['latest', 'all'],
124
+ description: "Type of version info: 'latest' for newest version, 'all' for complete list",
125
+ default: 'latest',
126
+ },
127
+ },
128
+ },
129
+ },
130
+ ],
131
+ };
132
+ });
133
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
134
+ const { name, arguments: args } = request.params;
135
+ switch (name) {
136
+ case 'search_fabric_docs': {
137
+ return handleSearchDocs({
138
+ query: args?.query || '',
139
+ category: args?.category,
140
+ loader: args?.loader,
141
+ minecraftVersion: args?.minecraft_version,
142
+ includeCode: args?.include_code,
143
+ limit: args?.limit,
144
+ });
145
+ }
146
+ case 'get_example': {
147
+ return handleGetExample({
148
+ topic: args?.topic || '',
149
+ language: args?.language,
150
+ loader: args?.loader,
151
+ minecraftVersion: args?.minecraft_version,
152
+ category: args?.category,
153
+ limit: args?.limit,
154
+ });
155
+ }
156
+ case 'explain_fabric_concept': {
157
+ return await handleExplainConcept({
158
+ concept: args?.concept || '',
159
+ });
160
+ }
161
+ case 'get_minecraft_version': {
162
+ return handleGetMinecraftVersion({
163
+ type: args?.type || 'latest',
164
+ });
165
+ }
166
+ default:
167
+ throw new Error(`Unknown tool: ${name}`);
168
+ }
169
+ });
170
+ server.setRequestHandler(ListResourcesRequestSchema, () => {
171
+ return {
172
+ resources: [],
173
+ };
174
+ });
175
+ server.setRequestHandler(ReadResourceRequestSchema, (request) => {
176
+ const { uri } = request.params;
177
+ throw new Error(`Resource not found: ${uri}`);
178
+ });
179
+ async function main() {
180
+ try {
181
+ console.error('[DbVersioning] Checking for database updates...');
182
+ const versioning = new DbVersioning();
183
+ const updated = await versioning.autoUpdate();
184
+ if (updated) {
185
+ console.error('[DbVersioning] Database updated. Restart recommended for best results.');
186
+ }
187
+ else {
188
+ console.error('[DbVersioning] Database is up to date');
189
+ }
190
+ }
191
+ catch (error) {
192
+ console.error('[DbVersioning] Error checking for updates:', error);
193
+ }
194
+ const transport = new StdioServerTransport();
195
+ await server.connect(transport);
196
+ console.error('Minecraft Modding MCP Server running on stdio');
197
+ }
198
+ main().catch((error) => {
199
+ console.error('Server error:', error);
200
+ process.exit(1);
201
+ });
202
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { DocumentPage, ChunkOptions } from './types.js';
2
+ export interface DocumentChunk {
3
+ id: string;
4
+ documentUrl: string;
5
+ title: string;
6
+ category: string;
7
+ loader: string;
8
+ chunkType: 'title' | 'section' | 'code' | 'full';
9
+ content: string;
10
+ codeLanguage?: string;
11
+ sectionHeading?: string;
12
+ sectionLevel?: number;
13
+ order: number;
14
+ metadata: {
15
+ hasCode: boolean;
16
+ wordCount: number;
17
+ difficulty?: string;
18
+ tags: string[];
19
+ };
20
+ }
21
+ export declare class DocumentChunker {
22
+ private options;
23
+ constructor(options?: Partial<ChunkOptions>);
24
+ chunkDocument(doc: DocumentPage): DocumentChunk[];
25
+ private createTitleChunk;
26
+ private createFullDocChunk;
27
+ private chunkSection;
28
+ private splitText;
29
+ private countWords;
30
+ private hashString;
31
+ }
32
+ //# sourceMappingURL=chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/indexer/chunker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAmB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM;IAa/C,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,EAAE;IAyBjD,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,YAAY;IAiEpB,OAAO,CAAC,SAAS;IA2CjB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,UAAU;CASnB"}
@@ -0,0 +1,157 @@
1
+ export class DocumentChunker {
2
+ options;
3
+ constructor(options = {}) {
4
+ this.options = {
5
+ maxChunkSize: 1000,
6
+ overlapSize: 100,
7
+ preserveCodeBlocks: true,
8
+ minChunkSize: 50,
9
+ ...options,
10
+ };
11
+ }
12
+ chunkDocument(doc) {
13
+ const chunks = [];
14
+ let order = 0;
15
+ chunks.push(this.createTitleChunk(doc, order++));
16
+ for (const section of doc.sections) {
17
+ const sectionChunks = this.chunkSection(doc, section, order);
18
+ chunks.push(...sectionChunks);
19
+ order += sectionChunks.length;
20
+ }
21
+ if (doc.sections.length === 0 && doc.content.length > 0) {
22
+ chunks.push(this.createFullDocChunk(doc, order++));
23
+ }
24
+ return chunks;
25
+ }
26
+ createTitleChunk(doc, order) {
27
+ const intro = doc.content.substring(0, this.options.maxChunkSize);
28
+ return {
29
+ id: `${this.hashString(doc.url)}-title`,
30
+ documentUrl: doc.url,
31
+ title: doc.title,
32
+ category: doc.category,
33
+ loader: doc.loader,
34
+ chunkType: 'title',
35
+ content: `${doc.title}\n\n${intro}`,
36
+ order,
37
+ metadata: {
38
+ hasCode: false,
39
+ wordCount: this.countWords(intro),
40
+ difficulty: doc.metadata.difficulty,
41
+ tags: doc.metadata.tags,
42
+ },
43
+ };
44
+ }
45
+ createFullDocChunk(doc, order) {
46
+ return {
47
+ id: `${this.hashString(doc.url)}-full`,
48
+ documentUrl: doc.url,
49
+ title: doc.title,
50
+ category: doc.category,
51
+ loader: doc.loader,
52
+ chunkType: 'full',
53
+ content: doc.content,
54
+ order,
55
+ metadata: {
56
+ hasCode: false,
57
+ wordCount: this.countWords(doc.content),
58
+ difficulty: doc.metadata.difficulty,
59
+ tags: doc.metadata.tags,
60
+ },
61
+ };
62
+ }
63
+ chunkSection(doc, section, startOrder) {
64
+ const chunks = [];
65
+ let order = startOrder;
66
+ if (this.options.preserveCodeBlocks && section.codeBlocks.length > 0) {
67
+ for (const codeBlock of section.codeBlocks) {
68
+ chunks.push({
69
+ id: `${this.hashString(doc.url)}-${order}`,
70
+ documentUrl: doc.url,
71
+ title: doc.title,
72
+ category: doc.category,
73
+ loader: doc.loader,
74
+ chunkType: 'code',
75
+ content: `${section.heading}\n\n${codeBlock.caption || ''}\n\n${codeBlock.code}`,
76
+ codeLanguage: codeBlock.language,
77
+ sectionHeading: section.heading,
78
+ sectionLevel: section.level,
79
+ order: order++,
80
+ metadata: {
81
+ hasCode: true,
82
+ wordCount: this.countWords(codeBlock.code),
83
+ difficulty: doc.metadata.difficulty,
84
+ tags: doc.metadata.tags,
85
+ },
86
+ });
87
+ }
88
+ }
89
+ if (section.content.trim().length >= this.options.minChunkSize) {
90
+ const textChunks = this.splitText(section.content);
91
+ for (const textChunk of textChunks) {
92
+ chunks.push({
93
+ id: `${this.hashString(doc.url)}-${order}`,
94
+ documentUrl: doc.url,
95
+ title: doc.title,
96
+ category: doc.category,
97
+ loader: doc.loader,
98
+ chunkType: 'section',
99
+ content: `${section.heading}\n\n${textChunk}`,
100
+ sectionHeading: section.heading,
101
+ sectionLevel: section.level,
102
+ order: order++,
103
+ metadata: {
104
+ hasCode: section.codeBlocks.length > 0,
105
+ wordCount: this.countWords(textChunk),
106
+ difficulty: doc.metadata.difficulty,
107
+ tags: doc.metadata.tags,
108
+ },
109
+ });
110
+ }
111
+ }
112
+ return chunks;
113
+ }
114
+ splitText(text) {
115
+ if (text.length <= this.options.maxChunkSize) {
116
+ return [text];
117
+ }
118
+ const chunks = [];
119
+ let start = 0;
120
+ while (start < text.length) {
121
+ let end = Math.min(start + this.options.maxChunkSize, text.length);
122
+ if (end < text.length) {
123
+ const sentenceEnd = text.lastIndexOf('.', end);
124
+ const newlineEnd = text.lastIndexOf('\n', end);
125
+ const breakPoint = Math.max(sentenceEnd, newlineEnd);
126
+ if (breakPoint > start + this.options.minChunkSize) {
127
+ end = breakPoint + 1;
128
+ }
129
+ }
130
+ const chunk = text.substring(start, end).trim();
131
+ if (chunk.length > 0) {
132
+ chunks.push(chunk);
133
+ }
134
+ const prevStart = start;
135
+ start = end - this.options.overlapSize;
136
+ if (start <= prevStart) {
137
+ start = Math.min(prevStart + 1, text.length);
138
+ }
139
+ if (start >= text.length)
140
+ break;
141
+ }
142
+ return chunks;
143
+ }
144
+ countWords(text) {
145
+ return text.trim().split(/\s+/).length;
146
+ }
147
+ hashString(str) {
148
+ let hash = 0;
149
+ for (let i = 0; i < str.length; i++) {
150
+ const char = str.charCodeAt(i);
151
+ hash = (hash << 5) - hash + char;
152
+ hash = hash & hash;
153
+ }
154
+ return Math.abs(hash).toString(36);
155
+ }
156
+ }
157
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/indexer/chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { DocumentPage, CrawlerOptions, IndexerProgress } from './types.js';
2
+ export declare class DocumentCrawler {
3
+ private options;
4
+ private progress;
5
+ private queue;
6
+ private activeRequests;
7
+ private onProgress?;
8
+ constructor(options?: Partial<CrawlerOptions>);
9
+ setProgressCallback(callback: (progress: IndexerProgress) => void): void;
10
+ crawlAll(urls: string[]): Promise<DocumentPage[]>;
11
+ private worker;
12
+ private crawlWithRetry;
13
+ crawlPage(url: string): Promise<DocumentPage>;
14
+ private parsePage;
15
+ private extractTitle;
16
+ private extractCategory;
17
+ private extractSections;
18
+ private extractCodeBlocks;
19
+ private extractContent;
20
+ private extractTags;
21
+ private detectDifficulty;
22
+ private calculateHash;
23
+ private updateProgress;
24
+ private detectLoader;
25
+ private sleep;
26
+ }
27
+ export declare function getFabricDocumentationUrls(): string[];
28
+ //# sourceMappingURL=crawler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawler.d.ts","sourceRoot":"","sources":["../../src/indexer/crawler.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,YAAY,EAGZ,cAAc,EACd,eAAe,EAChB,MAAM,YAAY,CAAC;AA0IpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAsC;gBAE7C,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM;IAuBjD,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI;IAO3D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAuBzC,MAAM;YA+BN,cAAc;IAqBtB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BnD,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,eAAe;IAmLvB,OAAO,CAAC,iBAAiB;IAwFzB,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,KAAK;CAGd;AAKD,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CA6DrD"}