itemscore-helper 1.0.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 +84 -0
- package/bin/cli.js +143 -0
- package/bin/mcp.js +133 -0
- package/data/itemscore-api.json +5847 -0
- package/lib/manifest.js +234 -0
- package/package.json +45 -0
- package/skill/ITEM_FORMAT.md +193 -0
- package/skill/SKILL.md +118 -0
- package/skill/examples/healers_touch.item +23 -0
- package/skill/examples/storm_blade.item +19 -0
- package/skill/mcp.json +8 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 TastyCake
|
|
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,84 @@
|
|
|
1
|
+
# itemscore-helper
|
|
2
|
+
|
|
3
|
+
Set up **any** AI assistant to build and edit custom Minecraft items for the [ItemsCore](https://www.coredevelopment.shop/plugins/items-core) plugin. Works with Claude, Codex, Cursor, Gemini, and anything else that supports MCP or custom instructions. You do not need to know how to code.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx itemscore-helper
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
That command drops the ItemsCore skill into a folder and prints exactly what to paste into your AI tool. Then you can ask things like *"make me a sword that calls lightning on left-click"* and your AI produces a ready-to-import item file.
|
|
10
|
+
|
|
11
|
+
## What it sets up
|
|
12
|
+
|
|
13
|
+
1. **The skill** (`SKILL.md`) - the instructions your AI follows to author correct ItemsCore items.
|
|
14
|
+
2. **A local MCP server** - runs on your machine (no account, no hosting, works offline) so your AI can look up the exact methods, triggers, and item schema and validate an item before you use it.
|
|
15
|
+
|
|
16
|
+
The MCP server is `npx -y itemscore-helper serve`. It speaks the standard stdio MCP transport, which every MCP client supports.
|
|
17
|
+
|
|
18
|
+
## Commands
|
|
19
|
+
|
|
20
|
+
| Command | What it does |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `npx itemscore-helper` | Install the skill files into `./itemscore-helper/` and print setup steps |
|
|
23
|
+
| `npx itemscore-helper --dir DIR` | Install into a custom folder |
|
|
24
|
+
| `npx itemscore-helper serve` | Run the local MCP server (this is what your AI runs) |
|
|
25
|
+
| `npx itemscore-helper print` | Print the skill instructions to stdout |
|
|
26
|
+
| `npx itemscore-helper mcp` | Print the MCP server config |
|
|
27
|
+
| `npx itemscore-helper help` | Show help |
|
|
28
|
+
|
|
29
|
+
## Connecting your AI (any provider)
|
|
30
|
+
|
|
31
|
+
Add the local MCP server. The config is the same everywhere: run `npx -y itemscore-helper serve`.
|
|
32
|
+
|
|
33
|
+
**Cursor** - `.cursor/mcp.json`
|
|
34
|
+
```json
|
|
35
|
+
{ "mcpServers": { "itemscore": { "command": "npx", "args": ["-y", "itemscore-helper", "serve"] } } }
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Claude Code** - `.mcp.json` in your project (or `claude_desktop_config.json` for Claude Desktop)
|
|
39
|
+
```json
|
|
40
|
+
{ "mcpServers": { "itemscore": { "command": "npx", "args": ["-y", "itemscore-helper", "serve"] } } }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Gemini CLI** - `~/.gemini/settings.json`
|
|
44
|
+
```json
|
|
45
|
+
{ "mcpServers": { "itemscore": { "command": "npx", "args": ["-y", "itemscore-helper", "serve"] } } }
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Codex** - `~/.codex/config.toml`
|
|
49
|
+
```toml
|
|
50
|
+
[mcp_servers.itemscore]
|
|
51
|
+
command = "npx"
|
|
52
|
+
args = ["-y", "itemscore-helper", "serve"]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Use your server's exact API (optional)
|
|
56
|
+
|
|
57
|
+
By default the server ships with a snapshot of the standard ItemsCore API. If you use addons that add methods, run `/ic exportapi` in-game and point the server at the generated file so it knows your exact API:
|
|
58
|
+
|
|
59
|
+
- set an env var `ITEMSCORE_API=/path/to/plugins/ItemsCore/itemscore-api.json`, or
|
|
60
|
+
- add `"--manifest", "/path/to/itemscore-api.json"` to the `args`.
|
|
61
|
+
|
|
62
|
+
### Prefer not to install anything?
|
|
63
|
+
|
|
64
|
+
A hosted copy of the same server is also available (no install): `https://www.coredevelopment.shop/api/mcp` (Streamable HTTP), with `https://www.coredevelopment.shop/llms.txt` as a plain-text guide.
|
|
65
|
+
|
|
66
|
+
After connecting, give your AI the `SKILL.md` file as its instructions (paste it into the chat, or add it to `.cursorrules` / `CLAUDE.md` / `AGENTS.md` / `GEMINI.md`).
|
|
67
|
+
|
|
68
|
+
## How you use it
|
|
69
|
+
|
|
70
|
+
1. Ask your AI for an item.
|
|
71
|
+
2. It writes a small `.item` (JSON) file and validates it.
|
|
72
|
+
3. Put that file in `plugins/ItemsCore/imports/` on your server.
|
|
73
|
+
4. Run `/ic import <name>` in-game. The item is live and stays editable in the in-game editor.
|
|
74
|
+
|
|
75
|
+
To edit an existing item, run `/ic export <name>`, share the exported file with your AI, and re-import the result.
|
|
76
|
+
|
|
77
|
+
## Links
|
|
78
|
+
|
|
79
|
+
- Documentation: https://www.coredevelopment.shop/docs/items-core
|
|
80
|
+
- Plugin page: https://www.coredevelopment.shop/plugins/items-core
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
|
|
84
|
+
MIT
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict"
|
|
3
|
+
|
|
4
|
+
const fs = require("fs")
|
|
5
|
+
const path = require("path")
|
|
6
|
+
|
|
7
|
+
const HOSTED_URL = "https://www.coredevelopment.shop/api/mcp"
|
|
8
|
+
const LLMS_URL = "https://www.coredevelopment.shop/llms.txt"
|
|
9
|
+
const DOCS_URL = "https://www.coredevelopment.shop/docs/items-core"
|
|
10
|
+
const SKILL_DIR = path.join(__dirname, "..", "skill")
|
|
11
|
+
|
|
12
|
+
function copyDir(src, dest) {
|
|
13
|
+
fs.mkdirSync(dest, { recursive: true })
|
|
14
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
15
|
+
const s = path.join(src, entry.name)
|
|
16
|
+
const d = path.join(dest, entry.name)
|
|
17
|
+
if (entry.isDirectory()) copyDir(s, d)
|
|
18
|
+
else fs.copyFileSync(s, d)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function parseArgs(argv) {
|
|
23
|
+
const out = { cmd: "install", dir: "itemscore-helper" }
|
|
24
|
+
const rest = []
|
|
25
|
+
for (let i = 0; i < argv.length; i++) {
|
|
26
|
+
const a = argv[i]
|
|
27
|
+
if (a === "--dir") out.dir = argv[++i]
|
|
28
|
+
else if (a === "-h" || a === "--help") out.cmd = "help"
|
|
29
|
+
else rest.push(a)
|
|
30
|
+
}
|
|
31
|
+
if (rest[0]) out.cmd = rest[0]
|
|
32
|
+
return out
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function printHelp() {
|
|
36
|
+
console.log([
|
|
37
|
+
"",
|
|
38
|
+
"itemscore-helper - set up any AI to build ItemsCore items",
|
|
39
|
+
"",
|
|
40
|
+
"Usage",
|
|
41
|
+
" npx itemscore-helper Install the skill files here and print setup steps",
|
|
42
|
+
" npx itemscore-helper install Same as above",
|
|
43
|
+
" npx itemscore-helper --dir DIR Install into a custom folder (default: itemscore-helper)",
|
|
44
|
+
" npx itemscore-helper serve Run the local MCP server (this is what your AI runs)",
|
|
45
|
+
" npx itemscore-helper print Print the skill instructions (SKILL.md) to stdout",
|
|
46
|
+
" npx itemscore-helper mcp Print the MCP server config",
|
|
47
|
+
" npx itemscore-helper help Show this help",
|
|
48
|
+
"",
|
|
49
|
+
"The MCP server runs locally on your machine over stdio. Works with Claude, Codex, Cursor,",
|
|
50
|
+
"Gemini, and any other AI that supports MCP.",
|
|
51
|
+
"Docs: " + DOCS_URL,
|
|
52
|
+
"",
|
|
53
|
+
].join("\n"))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function printMcp() {
|
|
57
|
+
console.log(
|
|
58
|
+
JSON.stringify(
|
|
59
|
+
{ mcpServers: { itemscore: { command: "npx", args: ["-y", "itemscore-helper", "serve"] } } },
|
|
60
|
+
null,
|
|
61
|
+
2
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function printSkill() {
|
|
67
|
+
process.stdout.write(fs.readFileSync(path.join(SKILL_DIR, "SKILL.md"), "utf8"))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function printGuide(targetDir) {
|
|
71
|
+
const skillPath = path.join(targetDir, "SKILL.md")
|
|
72
|
+
console.log([
|
|
73
|
+
"",
|
|
74
|
+
"ItemsCore helper installed.",
|
|
75
|
+
"",
|
|
76
|
+
"Files written to " + targetDir + ":",
|
|
77
|
+
" SKILL.md the instructions to give your AI",
|
|
78
|
+
" ITEM_FORMAT.md the full item format reference",
|
|
79
|
+
" mcp.json the MCP server config",
|
|
80
|
+
" examples/ ready-made example items",
|
|
81
|
+
"",
|
|
82
|
+
"Two things to set up in your AI:",
|
|
83
|
+
"",
|
|
84
|
+
"1) Add the local ItemsCore MCP server (runs on your machine over stdio)",
|
|
85
|
+
" Same config for every client - command npx, args [-y, itemscore-helper, serve]:",
|
|
86
|
+
"",
|
|
87
|
+
" Cursor .cursor/mcp.json",
|
|
88
|
+
' {"mcpServers":{"itemscore":{"command":"npx","args":["-y","itemscore-helper","serve"]}}}',
|
|
89
|
+
"",
|
|
90
|
+
" Claude Code .mcp.json in your project (or claude_desktop_config.json for Desktop)",
|
|
91
|
+
' {"mcpServers":{"itemscore":{"command":"npx","args":["-y","itemscore-helper","serve"]}}}',
|
|
92
|
+
"",
|
|
93
|
+
" Gemini CLI ~/.gemini/settings.json",
|
|
94
|
+
' {"mcpServers":{"itemscore":{"command":"npx","args":["-y","itemscore-helper","serve"]}}}',
|
|
95
|
+
"",
|
|
96
|
+
" Codex ~/.codex/config.toml",
|
|
97
|
+
" [mcp_servers.itemscore]",
|
|
98
|
+
' command = "npx"',
|
|
99
|
+
' args = ["-y","itemscore-helper","serve"]',
|
|
100
|
+
"",
|
|
101
|
+
" To match YOUR server's exact API (including addon methods), run /ic exportapi in-game",
|
|
102
|
+
" and point the server at the generated file, either with the env var:",
|
|
103
|
+
" ITEMSCORE_API=/path/to/plugins/ItemsCore/itemscore-api.json",
|
|
104
|
+
' or by adding "--manifest","/path/to/itemscore-api.json" to the args. Otherwise it uses',
|
|
105
|
+
" a bundled snapshot of the standard API.",
|
|
106
|
+
"",
|
|
107
|
+
" No MCP support at all? An online copy also exists at " + HOSTED_URL,
|
|
108
|
+
" and a plain-text guide at " + LLMS_URL,
|
|
109
|
+
"",
|
|
110
|
+
"2) Give your AI the skill",
|
|
111
|
+
" Load " + skillPath + " as the AI's instructions / rules:",
|
|
112
|
+
" Cursor copy SKILL.md into .cursor/rules/itemscore.md (or .cursorrules)",
|
|
113
|
+
" Claude Code copy SKILL.md into .claude/skills/ or append it to CLAUDE.md",
|
|
114
|
+
" Codex append SKILL.md to AGENTS.md",
|
|
115
|
+
" Gemini CLI append SKILL.md to GEMINI.md",
|
|
116
|
+
" Anything else paste SKILL.md into the chat or system prompt",
|
|
117
|
+
"",
|
|
118
|
+
'Then just ask: "make me a sword that calls lightning on left-click".',
|
|
119
|
+
"Your AI writes a .item file; drop it in plugins/ItemsCore/imports/ and run /ic import <name>.",
|
|
120
|
+
"",
|
|
121
|
+
].join("\n"))
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function main() {
|
|
125
|
+
const args = parseArgs(process.argv.slice(2))
|
|
126
|
+
if (args.cmd === "serve") {
|
|
127
|
+
require("./mcp.js")
|
|
128
|
+
return
|
|
129
|
+
}
|
|
130
|
+
if (args.cmd === "help") return printHelp()
|
|
131
|
+
if (args.cmd === "mcp") return printMcp()
|
|
132
|
+
if (args.cmd === "print") return printSkill()
|
|
133
|
+
if (args.cmd !== "install") {
|
|
134
|
+
console.error("Unknown command: " + args.cmd + "\nRun: npx itemscore-helper help")
|
|
135
|
+
process.exitCode = 1
|
|
136
|
+
return
|
|
137
|
+
}
|
|
138
|
+
const targetDir = path.resolve(process.cwd(), args.dir)
|
|
139
|
+
copyDir(SKILL_DIR, targetDir)
|
|
140
|
+
printGuide(targetDir)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
main()
|
package/bin/mcp.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict"
|
|
3
|
+
|
|
4
|
+
const { McpServer } = require("@modelcontextprotocol/sdk/server/mcp.js")
|
|
5
|
+
const { StdioServerTransport } = require("@modelcontextprotocol/sdk/server/stdio.js")
|
|
6
|
+
const { z } = require("zod")
|
|
7
|
+
const M = require("../lib/manifest.js")
|
|
8
|
+
|
|
9
|
+
function getManifestArg() {
|
|
10
|
+
const argv = process.argv.slice(2)
|
|
11
|
+
const i = argv.indexOf("--manifest")
|
|
12
|
+
if (i !== -1 && argv[i + 1]) return argv[i + 1]
|
|
13
|
+
return undefined
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function jsonResult(data) {
|
|
17
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function main() {
|
|
21
|
+
const idx = M.buildIndex(M.loadManifest(getManifestArg()))
|
|
22
|
+
|
|
23
|
+
const server = new McpServer(
|
|
24
|
+
{ name: "itemscore", version: String(idx.manifest.pluginVersion || "1") },
|
|
25
|
+
{
|
|
26
|
+
instructions:
|
|
27
|
+
"ItemsCore is a Minecraft (Bukkit/Spigot) plugin that lets server owners build custom RPG items with no Java. Use these tools to look up the scripting API, then author a clean item JSON (get_item_schema / generate_item_template), validate it (validate_item), and tell the user to drop it in plugins/ItemsCore/imports/ and run /ic import <file>. Items authored this way stay editable in the in-game GUI." +
|
|
28
|
+
(idx.isBundled
|
|
29
|
+
? " (Using the bundled API snapshot. To match this server's exact API including addon methods, run /ic exportapi and point this server at the generated plugins/ItemsCore/itemscore-api.json via --manifest or the ITEMSCORE_API env var.)"
|
|
30
|
+
: " (Using the live API manifest at " + idx.source + ".)"),
|
|
31
|
+
}
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
server.registerTool(
|
|
35
|
+
"search_methods",
|
|
36
|
+
{
|
|
37
|
+
title: "Search ItemsCore methods",
|
|
38
|
+
description:
|
|
39
|
+
"Search the ItemsCore scripting API for methods by name, category, signature, or description. Returns matching methods across the core, particles, values and api bindings.",
|
|
40
|
+
inputSchema: {
|
|
41
|
+
query: z.string().describe("Text to search for, e.g. 'teleport', 'message', 'damage'"),
|
|
42
|
+
binding: z.enum(["core", "particles", "values", "api"]).optional().describe("Restrict to a single binding"),
|
|
43
|
+
includeUseless: z.boolean().optional().describe("Include methods flagged useless (Object-inherited or no-op)"),
|
|
44
|
+
limit: z.number().int().positive().max(200).optional(),
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
async ({ query, binding, includeUseless, limit }) => {
|
|
48
|
+
const hits = M.searchMethods(idx, { query, binding, includeUseless, limit })
|
|
49
|
+
return jsonResult({ count: hits.length, methods: hits })
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
server.registerTool(
|
|
54
|
+
"get_method",
|
|
55
|
+
{
|
|
56
|
+
title: "Get an ItemsCore method",
|
|
57
|
+
description:
|
|
58
|
+
"Get the full details (signature, params, return, description, example) of a specific method. Accepts 'core.teleport' or just 'teleport'.",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
name: z.string().describe("Method name, optionally prefixed with its binding, e.g. 'core.teleport'"),
|
|
61
|
+
binding: z.enum(["core", "particles", "values", "api"]).optional(),
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
async ({ name, binding }) => {
|
|
65
|
+
const found = M.getMethod(idx, name, binding)
|
|
66
|
+
if (found.length === 0) return jsonResult({ found: false, message: 'No method named "' + name + '" was found.' })
|
|
67
|
+
return jsonResult({ found: true, matches: found })
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
server.registerTool(
|
|
72
|
+
"list_triggers",
|
|
73
|
+
{
|
|
74
|
+
title: "List ItemsCore triggers",
|
|
75
|
+
description:
|
|
76
|
+
"List every action trigger (when an item's actions can run, e.g. leftAction, rightAction) and the variables available inside each.",
|
|
77
|
+
inputSchema: {},
|
|
78
|
+
},
|
|
79
|
+
async () => jsonResult({ count: idx.triggers.length, triggers: idx.triggers })
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
server.registerTool(
|
|
83
|
+
"list_events",
|
|
84
|
+
{
|
|
85
|
+
title: "List ItemsCore events and variables",
|
|
86
|
+
description:
|
|
87
|
+
"List the custom events and the global scripting variables (player, event, core, particles, etc.) available when writing item actions.",
|
|
88
|
+
inputSchema: {},
|
|
89
|
+
},
|
|
90
|
+
async () => jsonResult({ events: idx.events, variables: idx.variables, bindings: idx.BINDING_NAMES })
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
server.registerTool(
|
|
94
|
+
"get_item_schema",
|
|
95
|
+
{
|
|
96
|
+
title: "Get the ItemsCore item JSON schema",
|
|
97
|
+
description:
|
|
98
|
+
"Get the full schema and field reference for the clean item JSON that ItemsCore imports. Read this before authoring or editing an item.",
|
|
99
|
+
inputSchema: {},
|
|
100
|
+
},
|
|
101
|
+
async () => jsonResult(M.itemSchema(idx))
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
server.registerTool(
|
|
105
|
+
"validate_item",
|
|
106
|
+
{
|
|
107
|
+
title: "Validate an ItemsCore item",
|
|
108
|
+
description:
|
|
109
|
+
"Validate a clean item JSON object against the ItemsCore schema. Reports errors (must fix) and warnings (likely fine). Run this before giving the user a .item file.",
|
|
110
|
+
inputSchema: { item: z.unknown().describe("The clean item JSON object to validate") },
|
|
111
|
+
},
|
|
112
|
+
async ({ item }) => jsonResult(M.validateItem(idx, item))
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
server.registerTool(
|
|
116
|
+
"generate_item_template",
|
|
117
|
+
{
|
|
118
|
+
title: "Generate an ItemsCore item template",
|
|
119
|
+
description:
|
|
120
|
+
"Return a valid starter item JSON to build from. kind can be 'basic' (a sword that greets the server on left-click) or 'ability' (a wand triggered on right-click).",
|
|
121
|
+
inputSchema: { kind: z.enum(["basic", "ability"]).optional() },
|
|
122
|
+
},
|
|
123
|
+
async ({ kind }) => jsonResult(M.generateItemTemplate(kind))
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
const transport = new StdioServerTransport()
|
|
127
|
+
await server.connect(transport)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
main().catch((e) => {
|
|
131
|
+
process.stderr.write("itemscore-helper MCP server failed to start: " + (e && e.stack ? e.stack : e) + "\n")
|
|
132
|
+
process.exit(1)
|
|
133
|
+
})
|