@adhisang/minecraft-modding-mcp 1.1.0 → 1.2.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.
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { createError, ERROR_CODES } from "../errors.js";
2
3
  import { log } from "../logger.js";
3
4
  function buildCursor(sortKey) {
4
5
  return Buffer.from(JSON.stringify({ sortKey }), "utf8").toString("base64");
@@ -11,13 +12,26 @@ function parseCursor(cursor) {
11
12
  const decoded = Buffer.from(cursor, "base64").toString("utf8");
12
13
  const parsed = JSON.parse(decoded);
13
14
  if (typeof parsed.sortKey !== "string") {
14
- return undefined;
15
+ throw createError({
16
+ code: ERROR_CODES.INVALID_INPUT,
17
+ message: "Invalid pagination cursor.",
18
+ details: {
19
+ nextAction: "Omit the cursor parameter to start from the first page, or use a cursor value from a previous response."
20
+ }
21
+ });
15
22
  }
16
23
  return parsed;
17
24
  }
18
- catch {
19
- log("warn", "storage.files.invalid_list_cursor", { cursor });
20
- return undefined;
25
+ catch (err) {
26
+ if (err instanceof Error && "code" in err)
27
+ throw err;
28
+ throw createError({
29
+ code: ERROR_CODES.INVALID_INPUT,
30
+ message: "Invalid pagination cursor.",
31
+ details: {
32
+ nextAction: "Omit the cursor parameter to start from the first page, or use a cursor value from a previous response."
33
+ }
34
+ });
21
35
  }
22
36
  }
23
37
  function buildSearchCursor(score, filePath) {
@@ -31,13 +45,26 @@ function parseSearchCursor(cursor) {
31
45
  const decoded = Buffer.from(cursor, "base64").toString("utf8");
32
46
  const parsed = JSON.parse(decoded);
33
47
  if (typeof parsed.score !== "number" || typeof parsed.filePath !== "string") {
34
- return undefined;
48
+ throw createError({
49
+ code: ERROR_CODES.INVALID_INPUT,
50
+ message: "Invalid pagination cursor.",
51
+ details: {
52
+ nextAction: "Omit the cursor parameter to start from the first page, or use a cursor value from a previous response."
53
+ }
54
+ });
35
55
  }
36
56
  return parsed;
37
57
  }
38
- catch {
39
- log("warn", "storage.files.invalid_search_cursor", { cursor });
40
- return undefined;
58
+ catch (err) {
59
+ if (err instanceof Error && "code" in err)
60
+ throw err;
61
+ throw createError({
62
+ code: ERROR_CODES.INVALID_INPUT,
63
+ message: "Invalid pagination cursor.",
64
+ details: {
65
+ nextAction: "Omit the cursor parameter to start from the first page, or use a cursor value from a previous response."
66
+ }
67
+ });
41
68
  }
42
69
  }
43
70
  function nextCursorFromRows(rows) {
package/dist/types.d.ts CHANGED
@@ -2,6 +2,7 @@ export type SourceOrigin = "local-jar" | "local-m2" | "remote-repo" | "decompile
2
2
  export type SourceMapping = "official" | "mojang" | "intermediary" | "yarn";
3
3
  export type MappingSourcePriority = "loom-first" | "maven-first";
4
4
  export type ArtifactTargetKind = "version" | "jar" | "coordinate";
5
+ export type ArtifactScope = "vanilla" | "merged" | "loader";
5
6
  export interface SourceTargetInput {
6
7
  kind: ArtifactTargetKind;
7
8
  value: string;
@@ -21,7 +21,11 @@ function ensureVersionDetail(value, version) {
21
21
  throw createError({
22
22
  code: ERROR_CODES.VERSION_NOT_FOUND,
23
23
  message: `Version metadata for "${version}" is invalid.`,
24
- details: { version }
24
+ details: {
25
+ version,
26
+ nextAction: "Use list-versions to see available Minecraft versions.",
27
+ suggestedCall: { tool: "list-versions", params: {} }
28
+ }
25
29
  });
26
30
  }
27
31
  return value;
@@ -105,7 +109,11 @@ export class VersionService {
105
109
  throw createError({
106
110
  code: ERROR_CODES.VERSION_NOT_FOUND,
107
111
  message: `Minecraft version "${normalizedVersion}" was not found in version manifest.`,
108
- details: { version: normalizedVersion }
112
+ details: {
113
+ version: normalizedVersion,
114
+ nextAction: "Use list-versions to see available Minecraft versions.",
115
+ suggestedCall: { tool: "list-versions", params: {} }
116
+ }
109
117
  });
110
118
  }
111
119
  const details = await this.fetchVersionDetails(versionEntry.url, normalizedVersion);
@@ -133,7 +141,11 @@ export class VersionService {
133
141
  throw createError({
134
142
  code: ERROR_CODES.VERSION_NOT_FOUND,
135
143
  message: `Minecraft version "${normalizedVersion}" was not found in version manifest.`,
136
- details: { version: normalizedVersion }
144
+ details: {
145
+ version: normalizedVersion,
146
+ nextAction: "Use list-versions to see available Minecraft versions.",
147
+ suggestedCall: { tool: "list-versions", params: {} }
148
+ }
137
149
  });
138
150
  }
139
151
  const details = await this.fetchVersionDetails(versionEntry.url, normalizedVersion);
@@ -142,7 +154,11 @@ export class VersionService {
142
154
  throw createError({
143
155
  code: ERROR_CODES.VERSION_NOT_FOUND,
144
156
  message: `Minecraft version "${normalizedVersion}" does not expose a server download URL.`,
145
- details: { version: normalizedVersion }
157
+ details: {
158
+ version: normalizedVersion,
159
+ nextAction: "Use list-versions to see available Minecraft versions.",
160
+ suggestedCall: { tool: "list-versions", params: {} }
161
+ }
146
162
  });
147
163
  }
148
164
  const destinationPath = defaultDownloadPath(this.config.cacheDir, serverJarUrl);
@@ -230,7 +246,11 @@ export class VersionService {
230
246
  throw createError({
231
247
  code: ERROR_CODES.VERSION_NOT_FOUND,
232
248
  message: `Minecraft version "${normalizedVersion}" was not found in version manifest.`,
233
- details: { version: normalizedVersion }
249
+ details: {
250
+ version: normalizedVersion,
251
+ nextAction: "Use list-versions to see available Minecraft versions.",
252
+ suggestedCall: { tool: "list-versions", params: {} }
253
+ }
234
254
  });
235
255
  }
236
256
  const details = await this.fetchVersionDetails(versionEntry.url, normalizedVersion);
@@ -239,7 +259,11 @@ export class VersionService {
239
259
  throw createError({
240
260
  code: ERROR_CODES.VERSION_NOT_FOUND,
241
261
  message: `Minecraft version "${normalizedVersion}" does not expose a client download URL.`,
242
- details: { version: normalizedVersion }
262
+ details: {
263
+ version: normalizedVersion,
264
+ nextAction: "Use list-versions to see available Minecraft versions.",
265
+ suggestedCall: { tool: "list-versions", params: {} }
266
+ }
243
267
  });
244
268
  }
245
269
  const destinationPath = defaultDownloadPath(this.config.cacheDir, clientJarUrl);
@@ -15,4 +15,5 @@ export type WorkspaceCompileMappingOutput = {
15
15
  };
16
16
  export declare class WorkspaceMappingService {
17
17
  detectCompileMapping(input: WorkspaceCompileMappingInput): Promise<WorkspaceCompileMappingOutput>;
18
+ detectProjectMinecraftVersion(projectPath: string): Promise<string | undefined>;
18
19
  }
@@ -85,5 +85,29 @@ export class WorkspaceMappingService {
85
85
  warnings: []
86
86
  };
87
87
  }
88
+ async detectProjectMinecraftVersion(projectPath) {
89
+ const root = resolve(projectPath);
90
+ const propsPath = resolve(root, "gradle.properties");
91
+ let content;
92
+ try {
93
+ content = await readFile(propsPath, "utf8");
94
+ }
95
+ catch {
96
+ return undefined;
97
+ }
98
+ // Search for common MC version property patterns
99
+ const patterns = [
100
+ /^minecraft_version\s*=\s*(.+)$/m,
101
+ /^mc_version\s*=\s*(.+)$/m,
102
+ /^minecraftVersion\s*=\s*(.+)$/m
103
+ ];
104
+ for (const pattern of patterns) {
105
+ const match = content.match(pattern);
106
+ if (match?.[1]?.trim()) {
107
+ return match[1].trim();
108
+ }
109
+ }
110
+ return undefined;
111
+ }
88
112
  }
89
113
  //# sourceMappingURL=workspace-mapping-service.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adhisang/minecraft-modding-mcp",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "MCP server with utilities for Minecraft modding workflows",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",