ro-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., "@ro-mcpLog in, create a character, and walk to Prontera to talk to the NPC test quest."
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.
ro-mcp
An MCP server that drives a real Ragnarok Online client session against a local rAthena server, so an agent can log in, walk around, talk to NPCs and fight — and therefore test server content end to end instead of reading log files.
The client is OpenKore, driven through
a small control plugin (openkore-plugin/mcpbridge.pl) that exposes a
line-oriented JSON socket.
Claude ⇄ MCP server (stdio)
⇄ JSON over TCP :24390
OpenKore + mcpbridge plugin
⇄ RO protocol (plaintext)
rAthena login:6900 char:6121 map:5121Why OpenKore rather than a hand-rolled client
OpenKore ships an exact match for the packet version this server speaks —
RagexeRE_2021_11_03 exists in its Send and Receive trees plus a matching
recvpackets table — and it already handles pathfinding, reconnects, map
changes and inventory. Reimplementing that was the alternative; reusing it
was not close.
Packet obfuscation is a non-issue here: rAthena resolves PACKETVER > 20180307
to zero obfuscation keys, which makes the XOR an identity operation. The
server confirms this at boot with
Packet Obfuscation: Enabled. Keys: 0x00000000, 0x00000000, 0x00000000.
Related MCP server: Roblox Executor MCP
Requirements
Requirement | Notes |
Perl 5.34+ | macOS system Perl is fine |
GNU readline |
|
Xcode Command Line Tools | Perl's C headers live inside the SDK on modern macOS |
Python 3 | only to run OpenKore's bundled SCons |
Node.js 18+ | the MCP server itself |
Setup
./setup.sh # clone OpenKore, patch, build XSTools, install config + pluginsetup.sh is idempotent. It does four things the stock OpenKore build cannot
do unattended on Apple Silicon:
Points SConstruct at the
/opt/homebrewreadline prefix (it only knows the Intel/usr/localone).Points it at Perl's headers inside the macOS SDK, since
Config.pmreports a bare/System/Librarypath that no longer holds them.Shims
python→python3for the bundled SCons.Installs our server entry, config overrides and the
mcpbridgeplugin — including addingmcpbridgetoloadPlugins_list, without which the control socket never opens.
Server-side prerequisites
The rAthena instance needs three settings for unattended login:
File | Setting | Why |
|
| lets |
|
| the PIN prompt blocks OpenKore's main loop, which stalls the control socket |
|
| character creation |
The bridge protocol
Newline-delimited JSON, both directions, on 127.0.0.1:24390 (loopback only —
this grants full control of a game session).
// requests
{"id": 1, "op": "ping"}
{"id": 2, "op": "state"}
{"id": 3, "op": "run", "cmd": "move 155 180"}
// responses
{"id": 1, "ok": true, "pong": 1}
{"id": 3, "ok": false, "error": "unknown or rejected command: ..."}
// events, pushed as they happen
{"event": "npc_talk", "name": "TS Lab", "msg": "Welcome to the V8 smoke test."}
{"event": "npc_talk_responses", "responses": ["Mob spawn", "Reputation", "Cancel"]}
{"event": "map_changed", "map": "prontera"}op: run forwards to OpenKore's own command layer rather than reimplementing
movement or NPC logic — OpenKore already knows how to path, retry and recover,
and duplicating that here would only rot.
Usage
npm install && npm run build
node scripts/smoke.mjs # end-to-end check against a running serverRegister with an MCP client by pointing it at dist/index.js:
{ "mcpServers": { "ro": { "command": "node", "args": ["/path/to/ro-mcp/dist/index.js"] } } }RO_MCP_KORE_DIR and RO_MCP_PORT override the OpenKore location and bridge port.
Tools
Tool | Purpose |
| launch / shut down the session |
| map, position, HP/SP, level, zeny, nearby NPCs and monsters |
| inspect and answer OpenKore's interactive questions |
| character creation and selection |
| move within a map / travel to another map |
| talk to an NPC, returning its dialog text and menu options |
| drive a conversation |
| attack a nearby monster |
| read console output / escape hatch |
A note on prompts
OpenKore asks some questions on stdin — character creation, character
selection, password retry. Those are blocking reads inside its main loop,
so while one is pending the loop is stopped and the control socket cannot
answer. The MCP server therefore owns the child process's stdin as well as
the socket; ro_prompt surfaces a pending question and ro_answer replies
to it. If a tool ever times out, check ro_prompt first.
Status
Verified end to end against a live server (scripts/smoke.mjs):
account auto-creation, login, character creation and selection
ro_statereporting map, position, HP/SP, level, zeny and nearby actorsro_walkmoving the character and confirming arrivalunreachable destinations rejected in ~30ms with the reason, rather than burning the full timeout — OpenKore reports these only on the console, so the arrival poll is raced against that message
a full NPC conversation against TypeScript-scripted content (
scripts/npc-test.mjs): reading dialog, parsing menu options, choosing a branch and reading the reply
Not yet exercised: ro_attack.
Two async traps worth knowing
Actor lists populate after map entry. A ro_state taken immediately
after login legitimately reports no nearby NPCs; poll until they appear.
A dialog's last message arrives as it closes. Scripts commonly answer
and then close in one go, so treat npc_talk_done as "mark closed", never
as "discard the buffer" — otherwise the end of a conversation, usually the
part being asserted on, is exactly the part lost.
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
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to automate Windows desktop applications through window manipulation, image recognition, OCR, keyboard/mouse simulation, and memory operations via the MCP protocol.MIT
- AlicenseAqualityBmaintenanceEnables agents to interact with a running Roblox game client, execute Lua code, inspect scripts, spy on remotes, and more.21143MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to interact with a running Roblox game client to execute Lua code, inspect scripts, spy on remotes, and more.143216MIT
- AlicenseAqualityBmaintenanceEnables AI agents to execute Lua code, inspect scripts, spy on remotes, and interact with a running Roblox game client through an MCP interface.8221431MIT
Related MCP Connectors
Eyes and hands on real Windows PCs — observe, click, type via Glasswarp API.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
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/Danil0v3s/rathena-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server