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.
- package/LICENSE +21 -0
- package/README.md +324 -0
- package/dist/db-versioning.d.ts +31 -0
- package/dist/db-versioning.d.ts.map +1 -0
- package/dist/db-versioning.js +206 -0
- package/dist/db-versioning.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +202 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/chunker.d.ts +32 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +157 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/crawler.d.ts +28 -0
- package/dist/indexer/crawler.d.ts.map +1 -0
- package/dist/indexer/crawler.js +550 -0
- package/dist/indexer/crawler.js.map +1 -0
- package/dist/indexer/embeddings.d.ts +56 -0
- package/dist/indexer/embeddings.d.ts.map +1 -0
- package/dist/indexer/embeddings.js +200 -0
- package/dist/indexer/embeddings.js.map +1 -0
- package/dist/indexer/sitemap.d.ts +35 -0
- package/dist/indexer/sitemap.d.ts.map +1 -0
- package/dist/indexer/sitemap.js +263 -0
- package/dist/indexer/sitemap.js.map +1 -0
- package/dist/indexer/store.d.ts +237 -0
- package/dist/indexer/store.d.ts.map +1 -0
- package/dist/indexer/store.js +857 -0
- package/dist/indexer/store.js.map +1 -0
- package/dist/indexer/types.d.ts +77 -0
- package/dist/indexer/types.d.ts.map +1 -0
- package/dist/indexer/types.js +2 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/indexer/updater.d.ts +52 -0
- package/dist/indexer/updater.d.ts.map +1 -0
- package/dist/indexer/updater.js +263 -0
- package/dist/indexer/updater.js.map +1 -0
- package/dist/services/concept-service.d.ts +49 -0
- package/dist/services/concept-service.d.ts.map +1 -0
- package/dist/services/concept-service.js +554 -0
- package/dist/services/concept-service.js.map +1 -0
- package/dist/services/example-service.d.ts +52 -0
- package/dist/services/example-service.d.ts.map +1 -0
- package/dist/services/example-service.js +302 -0
- package/dist/services/example-service.js.map +1 -0
- package/dist/services/search-service.d.ts +54 -0
- package/dist/services/search-service.d.ts.map +1 -0
- package/dist/services/search-service.js +519 -0
- package/dist/services/search-service.js.map +1 -0
- package/dist/services/search-utils.d.ts +34 -0
- package/dist/services/search-utils.d.ts.map +1 -0
- package/dist/services/search-utils.js +239 -0
- package/dist/services/search-utils.js.map +1 -0
- package/dist/tools/explainConcept.d.ts +9 -0
- package/dist/tools/explainConcept.d.ts.map +1 -0
- package/dist/tools/explainConcept.js +93 -0
- package/dist/tools/explainConcept.js.map +1 -0
- package/dist/tools/getExample.d.ts +20 -0
- package/dist/tools/getExample.d.ts.map +1 -0
- package/dist/tools/getExample.js +88 -0
- package/dist/tools/getExample.js.map +1 -0
- package/dist/tools/getMinecraftVersion.d.ts +6 -0
- package/dist/tools/getMinecraftVersion.d.ts.map +1 -0
- package/dist/tools/getMinecraftVersion.js +57 -0
- package/dist/tools/getMinecraftVersion.js.map +1 -0
- package/dist/tools/searchDocs.d.ts +15 -0
- package/dist/tools/searchDocs.d.ts.map +1 -0
- package/dist/tools/searchDocs.js +144 -0
- package/dist/tools/searchDocs.js.map +1 -0
- package/package.json +111 -0
- package/scripts/postinstall.js +859 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 OGMatrix
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# mcmodding-mcp
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/mcmodding-mcp)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://github.com/OGMatrix/mcmodding-mcp/actions/workflows/ci.yml)
|
|
6
|
+
|
|
7
|
+
> MCP server providing AI assistants with comprehensive, up-to-date Minecraft modding documentation for Fabric and NeoForge.
|
|
8
|
+
|
|
9
|
+
## What is this?
|
|
10
|
+
|
|
11
|
+
**mcmodding-mcp** is a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that gives AI assistants like Claude direct access to Minecraft modding documentation. Instead of relying on potentially outdated training data, your AI assistant can search real documentation, find code examples, and explain concepts accurately.
|
|
12
|
+
|
|
13
|
+
### Key Benefits
|
|
14
|
+
|
|
15
|
+
- **Always Current** - Documentation is indexed weekly from official sources
|
|
16
|
+
- **Accurate Answers** - AI responses backed by real documentation, not hallucinations
|
|
17
|
+
- **Code Examples** - Searchable code blocks with proper context
|
|
18
|
+
- **Semantic Search** - Understands what you mean, not just keywords
|
|
19
|
+
- **Zero Config** - Works immediately after installation
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
### Installation
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Install globally
|
|
29
|
+
npm install -g mcmodding-mcp
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Configure Your AI Client
|
|
33
|
+
|
|
34
|
+
Add to your MCP client configuration (e.g., Claude Desktop):
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"mcpServers": {
|
|
39
|
+
"mcmodding": {
|
|
40
|
+
"command": "mcmodding-mcp"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
That's it! Your AI assistant now has access to Minecraft modding documentation.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Available Tools
|
|
51
|
+
|
|
52
|
+
The MCP server provides four powerful tools:
|
|
53
|
+
|
|
54
|
+
### `search_fabric_docs`
|
|
55
|
+
|
|
56
|
+
Search documentation with smart filtering.
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// Example: Find information about item registration
|
|
60
|
+
{
|
|
61
|
+
query: "how to register custom items",
|
|
62
|
+
category: "items", // Optional filter
|
|
63
|
+
loader: "fabric", // fabric | neoforge
|
|
64
|
+
minecraft_version: "1.21.4" // Optional version filter
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### `get_example`
|
|
69
|
+
|
|
70
|
+
Get working code examples for any topic.
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// Example: Get block registration code
|
|
74
|
+
{
|
|
75
|
+
topic: "custom block with block entity",
|
|
76
|
+
language: "java",
|
|
77
|
+
loader: "fabric"
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### `explain_fabric_concept`
|
|
82
|
+
|
|
83
|
+
Get detailed explanations of modding concepts with related resources.
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// Example: Understand mixins
|
|
87
|
+
{
|
|
88
|
+
concept: "mixins"
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### `get_minecraft_version`
|
|
93
|
+
|
|
94
|
+
Get current Minecraft version information.
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
// Get latest version
|
|
98
|
+
{ type: "latest" }
|
|
99
|
+
|
|
100
|
+
// Get all indexed versions
|
|
101
|
+
{ type: "all" }
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Features
|
|
107
|
+
|
|
108
|
+
### Hybrid Search Engine
|
|
109
|
+
|
|
110
|
+
Combines multiple search strategies for best results:
|
|
111
|
+
|
|
112
|
+
| Strategy | Purpose |
|
|
113
|
+
|----------|---------|
|
|
114
|
+
| **FTS5 Full-Text** | Fast keyword matching with ranking |
|
|
115
|
+
| **Semantic Embeddings** | Understanding meaning and context |
|
|
116
|
+
| **Section Search** | Finding relevant documentation sections |
|
|
117
|
+
| **Code Search** | Locating specific code patterns |
|
|
118
|
+
|
|
119
|
+
### Auto-Updates
|
|
120
|
+
|
|
121
|
+
The database automatically checks for updates on startup:
|
|
122
|
+
- Compares local version with GitHub releases
|
|
123
|
+
- Downloads new versions with hash verification
|
|
124
|
+
- Creates backups before updating
|
|
125
|
+
- Non-blocking - server starts immediately
|
|
126
|
+
|
|
127
|
+
### Documentation Sources
|
|
128
|
+
|
|
129
|
+
Currently indexes:
|
|
130
|
+
- [wiki.fabricmc.net](https://wiki.fabricmc.net) - Fabric Wiki (226+ pages)
|
|
131
|
+
- [docs.fabricmc.net](https://docs.fabricmc.net) - Official Fabric Docs (266+ pages)
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## For Developers
|
|
136
|
+
|
|
137
|
+
### Development Setup
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# Clone repository
|
|
141
|
+
git clone https://github.com/OGMatrix/mcmodding-mcp.git
|
|
142
|
+
cd mcmodding-mcp
|
|
143
|
+
|
|
144
|
+
# Install dependencies
|
|
145
|
+
npm install
|
|
146
|
+
|
|
147
|
+
# Run in development mode
|
|
148
|
+
npm run dev
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Build Commands
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# Development
|
|
155
|
+
npm run dev # Watch mode with hot reload
|
|
156
|
+
npm run typecheck # TypeScript type checking
|
|
157
|
+
npm run lint # ESLint
|
|
158
|
+
npm run test # Run tests
|
|
159
|
+
npm run format # Prettier formatting
|
|
160
|
+
|
|
161
|
+
# Production
|
|
162
|
+
npm run build # Build TypeScript
|
|
163
|
+
npm run build:prod # Build with fresh documentation index
|
|
164
|
+
npm run index-docs # Index documentation with embeddings
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Project Structure
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
mcmodding-mcp/
|
|
171
|
+
├── src/
|
|
172
|
+
│ ├── index.ts # MCP server entry point
|
|
173
|
+
│ ├── db-versioning.ts # Auto-update system
|
|
174
|
+
│ ├── indexer/
|
|
175
|
+
│ │ ├── crawler.ts # Documentation crawler
|
|
176
|
+
│ │ ├── chunker.ts # Text chunking
|
|
177
|
+
│ │ ├── embeddings.ts # Semantic embeddings
|
|
178
|
+
│ │ ├── store.ts # SQLite database
|
|
179
|
+
│ │ └── sitemap.ts # Sitemap parsing
|
|
180
|
+
│ ├── services/
|
|
181
|
+
│ │ ├── search-service.ts # Search logic
|
|
182
|
+
│ │ └── concept-service.ts # Concept explanations
|
|
183
|
+
│ └── tools/
|
|
184
|
+
│ ├── searchDocs.ts # search_fabric_docs handler
|
|
185
|
+
│ ├── getExample.ts # get_example handler
|
|
186
|
+
│ └── explainConcept.ts # explain_fabric_concept handler
|
|
187
|
+
├── scripts/
|
|
188
|
+
│ └── index-docs.ts # Documentation indexing script
|
|
189
|
+
├── data/
|
|
190
|
+
│ ├── mcmodding-docs.db # SQLite database
|
|
191
|
+
│ └── manifest.json # Version manifest
|
|
192
|
+
└── dist/ # Compiled JavaScript
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Database Schema
|
|
196
|
+
|
|
197
|
+
```sql
|
|
198
|
+
-- Documents: Full documentation pages
|
|
199
|
+
CREATE TABLE documents (
|
|
200
|
+
id INTEGER PRIMARY KEY,
|
|
201
|
+
url TEXT UNIQUE NOT NULL,
|
|
202
|
+
title TEXT NOT NULL,
|
|
203
|
+
content TEXT NOT NULL,
|
|
204
|
+
category TEXT NOT NULL,
|
|
205
|
+
loader TEXT NOT NULL, -- fabric | neoforge | shared
|
|
206
|
+
minecraft_version TEXT,
|
|
207
|
+
hash TEXT NOT NULL -- For change detection
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
-- Chunks: Searchable content units
|
|
211
|
+
CREATE TABLE chunks (
|
|
212
|
+
id TEXT PRIMARY KEY,
|
|
213
|
+
document_id INTEGER NOT NULL,
|
|
214
|
+
chunk_type TEXT NOT NULL, -- title | section | code | full
|
|
215
|
+
content TEXT NOT NULL,
|
|
216
|
+
section_heading TEXT,
|
|
217
|
+
code_language TEXT,
|
|
218
|
+
word_count INTEGER,
|
|
219
|
+
has_code BOOLEAN
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
-- Embeddings: Semantic search vectors
|
|
223
|
+
CREATE TABLE embeddings (
|
|
224
|
+
chunk_id TEXT PRIMARY KEY,
|
|
225
|
+
embedding BLOB NOT NULL, -- 384-dim Float32Array
|
|
226
|
+
dimension INTEGER NOT NULL,
|
|
227
|
+
model TEXT NOT NULL -- Xenova/all-MiniLM-L6-v2
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
-- FTS5 indexes for fast text search
|
|
231
|
+
CREATE VIRTUAL TABLE documents_fts USING fts5(...);
|
|
232
|
+
CREATE VIRTUAL TABLE chunks_fts USING fts5(...);
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Release Workflow
|
|
238
|
+
|
|
239
|
+
This project uses [release-please](https://github.com/googleapis/release-please) for automated releases.
|
|
240
|
+
|
|
241
|
+
### Branch Strategy
|
|
242
|
+
|
|
243
|
+
| Branch | Purpose |
|
|
244
|
+
|--------|---------|
|
|
245
|
+
| `dev` | Active development |
|
|
246
|
+
| `prod` | Production releases |
|
|
247
|
+
|
|
248
|
+
### How It Works
|
|
249
|
+
|
|
250
|
+
1. Push commits to `dev` using [conventional commits](https://www.conventionalcommits.org/)
|
|
251
|
+
2. Release-please maintains a Release PR (`dev` → `prod`)
|
|
252
|
+
3. When merged, automatic release: npm publish + GitHub release + database upload
|
|
253
|
+
4. Changes sync back to `dev`
|
|
254
|
+
|
|
255
|
+
See [RELEASE_WORKFLOW.md](RELEASE_WORKFLOW.md) for complete details.
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Configuration
|
|
260
|
+
|
|
261
|
+
### Environment Variables
|
|
262
|
+
|
|
263
|
+
| Variable | Description | Default |
|
|
264
|
+
|----------|-------------|---------|
|
|
265
|
+
| `DB_PATH` | Custom database path | `./data/mcmodding-docs.db` |
|
|
266
|
+
| `GITHUB_REPO_URL` | Custom repo for updates | Auto-detected |
|
|
267
|
+
| `MCP_DEBUG` | Enable debug logging | `false` |
|
|
268
|
+
|
|
269
|
+
### Disabling Auto-Updates
|
|
270
|
+
|
|
271
|
+
Set `DB_PATH` to a custom location to manage updates manually:
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
DB_PATH=/path/to/my/database.db mcmodding-mcp
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Statistics
|
|
280
|
+
|
|
281
|
+
Typical index contains:
|
|
282
|
+
|
|
283
|
+
| Metric | Count |
|
|
284
|
+
|--------|-------|
|
|
285
|
+
| Documentation pages | 490+ |
|
|
286
|
+
| Searchable sections | 2,000+ |
|
|
287
|
+
| Code examples | 500+ |
|
|
288
|
+
| Semantic embeddings | 5,000+ |
|
|
289
|
+
| Database size | ~50 MB |
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Contributing
|
|
294
|
+
|
|
295
|
+
We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
|
296
|
+
|
|
297
|
+
### Quick Contribution Guide
|
|
298
|
+
|
|
299
|
+
1. Fork the repository
|
|
300
|
+
2. Create a feature branch from `dev`
|
|
301
|
+
3. Make changes with conventional commits
|
|
302
|
+
4. Submit a PR to `dev`
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## License
|
|
307
|
+
|
|
308
|
+
MIT License - see [LICENSE](LICENSE) for details.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Acknowledgments
|
|
313
|
+
|
|
314
|
+
- [Fabric Documentation](https://docs.fabricmc.net/) - Official Fabric documentation
|
|
315
|
+
- [Fabric Wiki](https://wiki.fabricmc.net/) - Community wiki
|
|
316
|
+
- [Model Context Protocol](https://modelcontextprotocol.io/) - MCP specification
|
|
317
|
+
- [Transformers.js](https://huggingface.co/docs/transformers.js) - Local ML embeddings
|
|
318
|
+
- [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) - Fast SQLite bindings
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
<p align="center">
|
|
323
|
+
<strong>Built with care for the Minecraft modding community</strong>
|
|
324
|
+
</p>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface DbVersionManifest {
|
|
2
|
+
version: string;
|
|
3
|
+
timestamp: string;
|
|
4
|
+
type: 'incremental' | 'full';
|
|
5
|
+
hash: string;
|
|
6
|
+
size: number;
|
|
7
|
+
downloadUrl: string;
|
|
8
|
+
changelog: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class DbVersioning {
|
|
11
|
+
private localManifestPath;
|
|
12
|
+
private dbPath;
|
|
13
|
+
private dataDir;
|
|
14
|
+
private remoteRepoUrl;
|
|
15
|
+
constructor(dbPath?: string);
|
|
16
|
+
getLocalManifest(): DbVersionManifest | null;
|
|
17
|
+
getRemoteManifest(): Promise<DbVersionManifest | null>;
|
|
18
|
+
compareVersions(local: string, remote: string): number;
|
|
19
|
+
calculateFileHash(filePath: string): Promise<string>;
|
|
20
|
+
isUpdateAvailable(): Promise<boolean>;
|
|
21
|
+
downloadDatabase(manifest: DbVersionManifest): Promise<boolean>;
|
|
22
|
+
saveManifest(manifest: DbVersionManifest): void;
|
|
23
|
+
createManifest(version: string, type: 'incremental' | 'full', changelog: string): Promise<DbVersionManifest>;
|
|
24
|
+
autoUpdate(): Promise<boolean>;
|
|
25
|
+
getVersionInfo(): {
|
|
26
|
+
local: string;
|
|
27
|
+
remote: string | null;
|
|
28
|
+
upToDate: boolean;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=db-versioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-versioning.d.ts","sourceRoot":"","sources":["../src/db-versioning.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAS;gBAElB,MAAM,CAAC,EAAE,MAAM;IAY3B,gBAAgB,IAAI,iBAAiB,GAAG,IAAI;IAgBtC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IA+C5D,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAgBhD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcpD,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IA8BrC,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IA8CrE,YAAY,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAgBzC,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,GAAG,MAAM,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC;IA+BvB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA8BpC,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE;CAQ9E"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
export class DbVersioning {
|
|
5
|
+
localManifestPath;
|
|
6
|
+
dbPath;
|
|
7
|
+
dataDir;
|
|
8
|
+
remoteRepoUrl;
|
|
9
|
+
constructor(dbPath) {
|
|
10
|
+
this.dbPath = dbPath || path.join(process.cwd(), 'data', 'mcmodding-docs.db');
|
|
11
|
+
this.dataDir = path.dirname(this.dbPath);
|
|
12
|
+
this.localManifestPath = path.join(this.dataDir, 'manifest.json');
|
|
13
|
+
this.remoteRepoUrl =
|
|
14
|
+
process.env.GITHUB_REPO_URL || 'https://api.github.com/repos/OGMatrix/mcmodding-mcp';
|
|
15
|
+
}
|
|
16
|
+
getLocalManifest() {
|
|
17
|
+
try {
|
|
18
|
+
if (!fs.existsSync(this.localManifestPath)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const content = fs.readFileSync(this.localManifestPath, 'utf-8');
|
|
22
|
+
return JSON.parse(content);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error('[DbVersioning] Error reading local manifest:', error);
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async getRemoteManifest() {
|
|
30
|
+
try {
|
|
31
|
+
const releaseUrl = `${this.remoteRepoUrl}/releases/latest`;
|
|
32
|
+
const response = await fetch(releaseUrl, {
|
|
33
|
+
headers: {
|
|
34
|
+
Accept: 'application/vnd.github.v3+json',
|
|
35
|
+
'User-Agent': 'mcmodding-mcp',
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
console.error(`[DbVersioning] Failed to fetch releases: ${response.status}`);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const release = (await response.json());
|
|
43
|
+
const manifestAsset = release.assets.find((a) => a.name === 'db-manifest.json');
|
|
44
|
+
if (!manifestAsset) {
|
|
45
|
+
console.error('[DbVersioning] No manifest found in release');
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const manifestResponse = await fetch(manifestAsset.browser_download_url);
|
|
49
|
+
if (!manifestResponse.ok) {
|
|
50
|
+
console.error('[DbVersioning] Failed to fetch manifest from release');
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return (await manifestResponse.json());
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error('[DbVersioning] Error fetching remote manifest:', error);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
compareVersions(local, remote) {
|
|
61
|
+
const localParts = local.split('.').map((p) => parseInt(p, 10));
|
|
62
|
+
const remoteParts = remote.split('.').map((p) => parseInt(p, 10));
|
|
63
|
+
for (let i = 0; i < 3; i++) {
|
|
64
|
+
const l = localParts[i] ?? 0;
|
|
65
|
+
const r = remoteParts[i] ?? 0;
|
|
66
|
+
if (r > l)
|
|
67
|
+
return 1;
|
|
68
|
+
if (l > r)
|
|
69
|
+
return -1;
|
|
70
|
+
}
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
async calculateFileHash(filePath) {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
const hash = crypto.createHash('sha256');
|
|
76
|
+
const stream = fs.createReadStream(filePath);
|
|
77
|
+
stream.on('data', (data) => hash.update(data));
|
|
78
|
+
stream.on('end', () => resolve(hash.digest('hex')));
|
|
79
|
+
stream.on('error', reject);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async isUpdateAvailable() {
|
|
83
|
+
try {
|
|
84
|
+
const local = this.getLocalManifest();
|
|
85
|
+
if (!local) {
|
|
86
|
+
console.info('[DbVersioning] No local manifest found, update available');
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
const remote = await this.getRemoteManifest();
|
|
90
|
+
if (!remote) {
|
|
91
|
+
console.info('[DbVersioning] Could not fetch remote manifest');
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const comparison = this.compareVersions(local.version, remote.version);
|
|
95
|
+
if (comparison < 0) {
|
|
96
|
+
console.info(`[DbVersioning] Update available: ${local.version} -> ${remote.version}`);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error('[DbVersioning] Error checking for updates:', error);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async downloadDatabase(manifest) {
|
|
107
|
+
try {
|
|
108
|
+
console.info(`[DbVersioning] Downloading database version ${manifest.version}...`);
|
|
109
|
+
const response = await fetch(manifest.downloadUrl);
|
|
110
|
+
if (!response.ok) {
|
|
111
|
+
console.error(`[DbVersioning] Failed to download: ${response.status}`);
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (fs.existsSync(this.dbPath)) {
|
|
115
|
+
const backupPath = `${this.dbPath}.backup`;
|
|
116
|
+
fs.copyFileSync(this.dbPath, backupPath);
|
|
117
|
+
console.info(`[DbVersioning] Created backup at ${backupPath}`);
|
|
118
|
+
}
|
|
119
|
+
const buffer = await response.arrayBuffer();
|
|
120
|
+
const tempPath = `${this.dbPath}.tmp`;
|
|
121
|
+
fs.writeFileSync(tempPath, Buffer.from(buffer));
|
|
122
|
+
const downloadedHash = await this.calculateFileHash(tempPath);
|
|
123
|
+
if (downloadedHash !== manifest.hash) {
|
|
124
|
+
console.error(`[DbVersioning] Hash mismatch: expected ${manifest.hash}, got ${downloadedHash}`);
|
|
125
|
+
fs.unlinkSync(tempPath);
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
fs.renameSync(tempPath, this.dbPath);
|
|
129
|
+
console.info(`[DbVersioning] Successfully updated database to version ${manifest.version}`);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error('[DbVersioning] Error downloading database:', error);
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
saveManifest(manifest) {
|
|
138
|
+
try {
|
|
139
|
+
if (!fs.existsSync(this.dataDir)) {
|
|
140
|
+
fs.mkdirSync(this.dataDir, { recursive: true });
|
|
141
|
+
}
|
|
142
|
+
fs.writeFileSync(this.localManifestPath, JSON.stringify(manifest, null, 2));
|
|
143
|
+
console.info(`[DbVersioning] Saved manifest version ${manifest.version}`);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('[DbVersioning] Error saving manifest:', error);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async createManifest(version, type, changelog) {
|
|
150
|
+
try {
|
|
151
|
+
if (!fs.existsSync(this.dbPath)) {
|
|
152
|
+
throw new Error('Database file not found');
|
|
153
|
+
}
|
|
154
|
+
const hash = await this.calculateFileHash(this.dbPath);
|
|
155
|
+
const stats = fs.statSync(this.dbPath);
|
|
156
|
+
const manifest = {
|
|
157
|
+
version,
|
|
158
|
+
timestamp: new Date().toISOString(),
|
|
159
|
+
type,
|
|
160
|
+
hash,
|
|
161
|
+
size: stats.size,
|
|
162
|
+
downloadUrl: `https://github.com/OGMatrix/mcmodding-mcp/releases/download/db-v${version}/mcmodding-docs.db`,
|
|
163
|
+
changelog,
|
|
164
|
+
};
|
|
165
|
+
this.saveManifest(manifest);
|
|
166
|
+
return manifest;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error('[DbVersioning] Error creating manifest:', error);
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async autoUpdate() {
|
|
174
|
+
try {
|
|
175
|
+
const hasUpdate = await this.isUpdateAvailable();
|
|
176
|
+
if (!hasUpdate) {
|
|
177
|
+
console.info('[DbVersioning] Database is up to date');
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
const remote = await this.getRemoteManifest();
|
|
181
|
+
if (!remote) {
|
|
182
|
+
console.info('[DbVersioning] Could not fetch remote manifest for update');
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
const success = await this.downloadDatabase(remote);
|
|
186
|
+
if (success) {
|
|
187
|
+
this.saveManifest(remote);
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error('[DbVersioning] Error during auto-update:', error);
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
getVersionInfo() {
|
|
198
|
+
const local = this.getLocalManifest();
|
|
199
|
+
return {
|
|
200
|
+
local: local?.version ?? 'unknown',
|
|
201
|
+
remote: null,
|
|
202
|
+
upToDate: true,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=db-versioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-versioning.js","sourceRoot":"","sources":["../src/db-versioning.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|