HMCL MCP Server
MCP server that lets AI agents drive HMCL (Hello Minecraft! Launcher) programmatically to install Minecraft versions, search/download/import modpacks from Modrinth/CurseForge, and launch/stop the game.
README
HMCL MCP Server
MCP (Model Context Protocol) server that lets AI agents drive HMCL (Hello Minecraft! Launcher, https://hmcl.huangyuhui.net) programmatically: install Minecraft versions, search/download/import modpacks (Modrinth + CurseForge), and launch/stop the game.
HMCL has no command line interface (no --launch, no --import, no headless mode), so this project injects a small javaagent into a headless HMCL JVM and drives HMCL's core classes directly. Modpack search/download/install all run through HMCL's own addon repositories inside the agent (Modrinth, and CurseForge with HMCL's embedded API key — no user key needed); listing installed versions/modpacks is a local filesystem scan.
Architecture
┌──────────────────────────────┐ stdio (JSON-RPC only) ┌────────────────────────────────┐
│ MCP client / AI agent │ ◀────────────────────────▶ │ Node MCP server (this repo) │
└──────────────────────────────┘ └───────────────┬────────────────┘
filesystem scans │ HTTP JSON API
<workdir>/versions/, │ 127.0.0.1:<port>
mcpacks/ (search/download) │ X-HMCL-Agent-Token
▼
┌────────────────────────────────┐
│ Headless HMCL JVM │
│ java -javaagent:hmcl-agent.jar │
│ -Dhmcl.gameDir=<workdir> … │
│ -cp HMCL.jar;javafx-*.jar │
│ hmcl.agent.AgentMain │
└────────────────────────────────┘
- Node MCP server (
src/, TypeScript, stdio transport): registers 13 tools, drives HMCL's own Modrinth/CurseForge modpack repositories for search/download/install, scans<workdir>/versions/on disk for installed versions and modpacks, and talks to the agent over loopback HTTP. - Java agent (
agent/, compiled bynpm run build:agent): injected into HMCL with-javaagent; initializes HMCL core headlessly (SettingsManager.init()→DownloadProviders.init()→Accounts.init()) and exposes a loopback HTTP JSON API (/status,/versions/install,/modpack/install,/launch,/launch/stop,/shutdown) on127.0.0.1:<port>. A non-daemon HTTP thread keeps the JVM alive. - No launcher GUI: the HMCL window never opens. When you launch the game, the game window itself opens normally (the game is a separate child process).
HMCL-compatible directory layout inside the workdir: versions/<id>/, libraries/, assets/, mcpacks/ (downloaded pack files), hmcl/ (HMCL.jar + hmcl-agent.jar + javafx jars), .hmcl/ (HMCL 3.16+ workspace config).
Requirements
- Node.js 18+ (24 recommended) — MCP SDK 1.30.0,
npm install - JDK 17+ with
javac(21 recommended) — HMCL itself requires Java 17;javacis needed to compile the agent jar - Internet access on first run (HMCL jar, javafx jars, Minecraft versions/libraries/assets)
Tools (13)
| Tool | Args | Description |
|---|---|---|
check_environment |
— | Java path + version, workdir, hmcl dir contents (HMCL.jar / hmcl-agent.jar / javafx jars), agent running status, version/modpack counts |
install_hmcl |
— | Download latest HMCL jar into <hmclDir>/HMCL.jar if missing, then build the agent jar (node agent/build.mjs, needs javac) and copy hmcl-agent.jar + javafx jars into <hmclDir>/ |
start_hmcl |
— | Start the headless HMCL JVM with the agent (no-op if already running) and return agent /status |
stop_hmcl |
— | Stop the headless HMCL JVM (agent /shutdown) and confirm it is down |
list_versions |
— | Scan <workdir>/versions/; a dir counts as a version when it contains <id>/<id>.json → [{id, path, hasJar}] |
install_version |
mc_version (string) |
Install a vanilla Minecraft version through the agent's HMCL download pipeline |
search_modpacks |
query (string), source (modrinth|curseforge, optional), limit (number, optional) |
Search modpacks via HMCL's own repositories (CurseForge uses HMCL's embedded key — no user key needed) |
get_modpack |
id (string), source (optional) |
Project details + latest version for one modpack (id = Modrinth slug or CurseForge numeric id) |
download_modpack |
id (string), versionId (string, optional), source (optional) |
Download the pack file into <workdir>/mcpacks/ (sha1-verified); versionId picks a specific version, defaults to latest |
install_modpack |
id (string, optional), versionId (string, optional), path (string, optional), name (string, optional), source (optional) |
Download (if id given, or path to a local file) then agent-install the pack as an instance under <workdir>/versions/<name>/ |
list_modpacks |
— | Scan <workdir>/versions/*/modpack.json → [{name, path, format, gameVersion?, modLoader?}] (format: mrpack / curseforge / hmcl) |
launch_game |
version (string), username (string, default Steve), maxMemory (number, MB), javaPath (string), extraArgs (string[]) |
Launch an instance as an offline account; the game opens as a child process |
stop_game |
— | Stop the running game process (agent /launch/stop) |
All handlers return structured data on success and an error message on failure (MCP isError result) — they never crash the server.
Quick start
npm install # install dependencies
npm run build # compile the MCP server → dist/
npm run build:agent # download javafx jars + compile agent/build/hmcl-agent.jar (javac required)
Register the server in your MCP client:
{
"mcpServers": {
"hmcl-mcp": {
"command": "node",
"args": ["D:/ProjectDir/AgentFarm/HMCL-MCP/dist/index.js"]
}
}
}
Environment variables can be set in the client's env object, in your shell, or via a .env file — see .env.example and docs/setup.md.
Environment variables
| Variable | Default | Description |
|---|---|---|
HMCL_MCP_WORKDIR |
~/.hmcl-mcp |
HMCL working directory (game root + user data): versions/, libraries/, assets/, mcpacks/, .hmcl/ |
HMCL_MCP_HMCL_DIR |
<workdir>/hmcl |
Directory holding HMCL.jar, hmcl-agent.jar and the javafx jars |
HMCL_MCP_JAVA |
java on PATH |
Java binary used to launch the headless HMCL JVM |
HMCL_MCP_CURSEFORGE_API_KEY |
(none) | Optional CurseForge API key override, passed to HMCL as -Dhmcl.curseforge.apikey; without it search/install still work via HMCL's embedded key |
HMCL_MCP_AGENT_PORT |
28501 |
Agent HTTP port on 127.0.0.1 |
HMCL_MCP_AGENT_TOKEN |
hmcl-mcp |
Shared token, sent as the X-HMCL-Agent-Token header |
Typical agent workflows
-
Modpack: search → install → launch
search_modpacks(query: "fabulously optimized")→get_modpack(id: "fabulously-optimized")→install_modpack(id: "fabulously-optimized", name: "fabulously-optimized")(downloads and installs in one step, all through HMCL) →launch_game(version: "fabulously-optimized", username: "Steve")— note:launch_game'sversionis the instance name frominstall_modpack/list_modpacks, not the Minecraft version number -
Vanilla: install a version → launch
install_version(mc_version: "1.21.4")→launch_game(version: "1.21.4", username: "Steve") -
First run / fresh setup
check_environment(verify java + hmcl dir) →install_hmcl(downloads HMCL.jar, builds the agent jar) →start_hmcl(boots the headless JVM, agent responds on/status) -
Cleanup
stop_game(stop the running game) →stop_hmcl(stop the headless JVM)
Troubleshooting
javac not found/ java missing: installing a JDK is the user's responsibility — install JDK 17+ (21 recommended) and make sure bothjavaandjavacare on PATH (or setHMCL_MCP_JAVA).- First run downloads:
install_hmcldownloads HMCL.jar (~10 MB) from GitHub releases andnpm run build:agentdownloadsjavafx-base/javafx-graphicsfrom Maven Central — both need internet and can take a minute. install_hmclfails with HTTP 403/429: GitHub API rate limit — downloadHMCL-<version>.jarmanually and place it at<hmclDir>/HMCL.jar(seedocs/setup.md), then re-run.- CurseForge errors (403): missing/invalid API key — CurseForge is optional; use Modrinth (keyless) for search/install.
- Headless means no launcher window: only the game window appears, on
launch_game. - Port conflict: change
HMCL_MCP_AGENT_PORTand restart; the agent binds127.0.0.1only. - Paths containing
!: HMCL refuses to run when the working directory or jar path contains!— use a path without it.
Docs
docs/setup.md— manual HMCL install, workdir layout, reusing an existing game directory, security notesdocs/research/— research notes (MCP SDK, HMCL Java API, HMCL CLI/modpack formats, Modrinth/CurseForge APIs)src/types.ts— the shared contract (tools, types, cross-module interfaces)
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.