muninn-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@muninn-mcpcheck the server status and online players"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
muninn-mcp
Read-only Model Context Protocol server for one Muninn Minecraft backend.
One process always represents exactly one game backend. It has one Muninn base
URL, one backend bearer token, and one discovered server_id. Run a separate
process for each backend because installed plugins and capabilities can differ.
The default MCP transport is the official stateful Streamable HTTP transport from the MCP TypeScript SDK. Stdio remains available as a fallback.
Requirements
Node.js 20 or newer
a reachable Muninn plugin HTTP API
the backend bearer token from
plugins/Muninn/config.yml
This implementation targets Muninn plugin API 0.1.0 at plugin commit
6ef77aafb1cb0f634020d48ca5621885bb103940.
Related MCP server: Discord Message Finder MCP
HTTP-first start
npm ci
npm run build
MUNINN_BASE_URL=http://127.0.0.1:8781 \
MUNINN_AUTH_TOKEN='<Muninn backend token>' \
MUNINN_EXPECTED_SERVER_ID=survival \
MUNINN_MCP_AUTH_TOKEN='<separate MCP client token>' \
npm startDefaults:
transport:
httpbind:
127.0.0.1port:
3000MCP endpoint:
http://127.0.0.1:3000/mcpreadiness endpoint:
http://127.0.0.1:3000/healthz
The incoming MUNINN_MCP_AUTH_TOKEN is deliberately separate from
MUNINN_AUTH_TOKEN. The first protects MCP clients → this process; the second
protects this process → the Minecraft backend. Never reuse them.
An HTTP MCP client connects to the URL and supplies the static token:
{
"mcpServers": {
"muninn-survival": {
"url": "http://127.0.0.1:3000/mcp",
"headers": {
"Authorization": "Bearer <MUNINN_MCP_AUTH_TOKEN>"
}
}
}
}The exact client configuration envelope is client-specific; the URL, standard
Authorization header, and Streamable HTTP protocol are not.
Readiness needs no token and exposes no configuration secrets:
curl http://127.0.0.1:3000/healthzThe process first discovers the backend through /health and /capabilities.
It only starts listening after backend identity and capabilities have passed
fail-fast validation.
Stdio fallback
MUNINN_TRANSPORT=stdio \
MUNINN_BASE_URL=http://127.0.0.1:8781 \
MUNINN_AUTH_TOKEN='<Muninn backend token>' \
MUNINN_EXPECTED_SERVER_ID=survival \
npm startExample stdio client entry:
{
"mcpServers": {
"muninn-survival": {
"command": "node",
"args": ["/absolute/path/to/muninn-mcp/dist/index.js"],
"env": {
"MUNINN_TRANSPORT": "stdio",
"MUNINN_BASE_URL": "http://127.0.0.1:8781",
"MUNINN_AUTH_TOKEN": "<Muninn backend token>",
"MUNINN_EXPECTED_SERVER_ID": "survival"
}
}
}
}Configuration
MCP transport
Variable | Default | Meaning |
|
|
|
|
| HTTP listener hostname or IP. |
|
| HTTP listener port, 1–65535. |
|
| Exact Streamable HTTP endpoint path. |
| unset | Incoming static bearer. Optional only on loopback; required for every non-loopback HTTP bind. |
| loopback hosts | Comma-separated hostnames without ports. Required for wildcard binds such as |
| none | Exact comma-separated browser origins allowed for CORS. Browser Origin requests are rejected by default. |
For a private-network listener:
MUNINN_MCP_BIND=0.0.0.0 \
MUNINN_MCP_ALLOWED_HOSTS=minecraft-admin.internal,192.0.2.20 \
MUNINN_MCP_AUTH_TOKEN='<high-entropy token>' \
npm startThe built-in listener is plain HTTP. Do not expose it directly to the public internet. Keep it on loopback/private networking or place TLS and appropriate network controls in front of it.
Muninn backend
Variable | Required | Default | Meaning |
| yes | — | Backend origin or API root. A bare origin gets |
| yes | — | Bearer token accepted by the Muninn plugin. |
| no | — | Fail-fast backend identity pin; strongly recommended. |
| no |
| Per-request timeout, 100–120000 ms. |
| no |
| Explicit default for paginated tools. |
| no |
| MCP-side page cap, maximum 1000. |
| no |
| MCP-side CoreProtect time-window cap. |
| no |
| MCP-side CoreProtect radius cap. |
Backend limits remain authoritative and may be stricter.
HTTP security and lifecycle
Host validation is port-independent and deny-by-default.
Browser requests with an
Originheader are denied unless the exact origin is allowlisted. CORS never uses*and never enables credentials.Incoming auth uses constant-time comparison of SHA-256 token digests.
Request bodies are parsed only after MCP authentication and are capped at 256 KiB.
Neither backend nor incoming bearer values are logged or returned in errors, including nested backend payloads.
Each initialize request gets a cryptographically random stateful MCP session, its own official
StreamableHTTPServerTransport, and its ownMcpServer.Subsequent POST/GET/DELETE requests require a valid
Mcp-Session-Id.HTTP DELETE terminates a session.
SIGINT/SIGTERMstop accepting requests, close all active transports/SSE streams, and close the HTTP server.Sessions are in memory and are not resumable across process restarts; clients initialize again after a restart.
Capability-aware tools
Only tools whose endpoint is present in an enabled module's capability report
are registered. CoreProtect tools also require the corresponding feature flag.
Restart the process after backend plugin/capability changes to refresh
tools/list.
All tools are annotated read-only, non-destructive, and idempotent. The Paper batch endpoint uses HTTP POST but does not mutate game state.
Core and composite
server_statusinvestigate_block— bounded Paper/CoreProtect/WorldGuard context with independent probe results
CoreProtect primitives
coreprotect_block_lookupcoreprotect_container_lookupcoreprotect_item_lookupcoreprotect_inventory_lookupcoreprotect_chat_lookupcoreprotect_command_lookupcoreprotect_session_lookupcoreprotect_sign_lookupcoreprotect_username_lookupcoreprotect_queue_lookup
Paper primitives
paper_get_containerpaper_batch_containers(1–64 locations)paper_get_player_inventorypaper_get_player_ender_chestpaper_get_player_statepaper_get_player_statspaper_list_playerspaper_get_server_infopaper_list_entitiespaper_get_block
CMI primitives
cmi_list_playerscmi_get_playercmi_get_player_homescmi_list_warpscmi_list_jails
WorldGuard primitives
worldguard_list_regionsworldguard_get_regionworldguard_regions_atworldguard_flags_at
Paginated tools always send explicit bounded offset/limit values and return
the backend's has_more marker for deliberate follow-up.
Errors
Muninn envelopes become readable MCP tool errors with stable codes, safe
details, HTTP status, backend ID, guidance, and retryability where applicable:
UNAUTHORIZED, NOT_FOUND, BAD_REQUEST, SYNC_TIMEOUT,
MODULE_DISABLED, FEATURE_UNAVAILABLE, LIMIT_EXCEEDED,
PLAYER_OFFLINE, and INTERNAL.
Transport-side errors include TIMEOUT, NETWORK_ERROR, CANCELLED,
INVALID_RESPONSE, and SERVER_ID_MISMATCH.
HTTP routing/auth errors use bounded JSON/JSON-RPC bodies and never echo Host, Origin, authorization values, request bodies, or internal exceptions.
Verification
npm ci
npm run check
npm testThe suite covers:
HTTP-default and stdio process startup/shutdown;
official
StreamableHTTPClientTransportinitialize, initialized notification,tools/list,tools/call, SSE, and DELETE lifecycle;incoming auth 401, Host/Origin/CORS policy, invalid methods and sessions;
non-zero invalid configuration;
recursive secret redaction;
all 29 atomic tool-to-endpoint mappings and capability filtering.
Real plugin Docker harness
The cross-project test starts the adjacent real
Paper+CoreProtect+CMI+WorldGuard fixture, starts the built HTTP MCP process,
connects through the official Streamable HTTP client, calls
paper_get_server_info, and removes all temporary processes/containers:
npm run test:e2e:harnessBy default the plugin checkout is expected at ../muninn-plugin:
MUNINN_PLUGIN_DIR=/absolute/path/to/muninn-plugin npm run test:e2e:harnessAn already-running backend can be tested directly:
MUNINN_E2E_BASE_URL=http://127.0.0.1:8781 \
MUNINN_E2E_AUTH_TOKEN='<backend token>' \
MUNINN_E2E_SERVER_ID=survival \
npm run test:e2eThe stdio fallback remains covered by the normal test suite.
Releases and npm publication
Release Please watches conventional commits on main, maintains a release PR,
updates CHANGELOG.md, package.json, package-lock.json, and the release
manifest, then creates a vX.Y.Z GitHub Release when that release PR is merged.
The same workflow checks and tests the released commit before publishing
@vanilla-game/muninn-mcp as a public npm package with provenance.
The package is not published yet, so the first release needs a short-lived npm
granular access token with permission to create packages in the vanilla-game
scope. Store it as the NPM_TOKEN GitHub Actions secret. After the bootstrap
publish succeeds, configure npm Trusted Publishing for:
GitHub organization:
Vanilla-Gamerepository:
muninn-mcpworkflow filename:
release-please.ymlallowed action:
npm publish
Then remove the NPM_TOKEN repository secret. Future releases use GitHub OIDC
through the workflow's id-token: write permission instead of a long-lived npm
credential. The npm package's repository URL must continue to match this GitHub
repository exactly.
By default Release Please uses the workflow's GITHUB_TOKEN. An optional
RELEASE_PLEASE_TOKEN GitHub secret can supply a GitHub App or fine-grained PAT
when repository policy requires release PR events to trigger other workflows.
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityBmaintenanceThe most complete open-source MCP server for Discord — 80+ tools, dual-mode: integrated (plugin) or standalone2410MIT
- FlicenseAqualityCmaintenanceRead-only MCP server for finding Discord messages. It enables searching guild messages, locating messages from jump URLs, and reading context around results.71
- FlicenseCqualityCmaintenanceAn MCP server that exposes Discord bot actions as tools for LLM clients.4291
- Alicense-qualityAmaintenanceA local MCP server that reads Discord servers and channels and optionally sends messages with explicit allowlists, read-only by default.44MIT
Related MCP Connectors
Scans MCP servers for tool poisoning, prompt injection and supply chain risks.
An MCP server for deep research or task groups
Security scanner for MCP servers. Detect vulnerabilities, prompt injection, and tool poisoning.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Vanilla-Game/muninn-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server