ro-mcp
ro-mcp
Un servidor MCP que controla una sesión real de cliente de Ragnarok Online contra un servidor local rAthena, de modo que un agente pueda iniciar sesión, caminar, hablar con NPCs y luchar — y por tanto probar el contenido del servidor de extremo a extremo en lugar de leer archivos de registro.
El cliente es OpenKore, controlado mediante un pequeño plugin de control (openkore-plugin/mcpbridge.pl) que expone un socket JSON orientado a líneas.
Claude ⇄ MCP server (stdio)
⇄ JSON over TCP :24390
OpenKore + mcpbridge plugin
⇄ RO protocol (plaintext)
rAthena login:6900 char:6121 map:5121Por qué OpenKore y no un cliente hecho a medida
OpenKore incluye una coincidencia exacta para la versión de paquetes que habla este servidor — RagexeRE_2021_11_03 existe en sus árboles Send y Receive, además de una tabla recvpackets correspondiente — y ya gestiona pathfinding, reconexiones, cambios de mapa e inventario. La alternativa era reimplementar todo eso; reutilizarlo no estaba ni cerca.
La ofuscación de paquetes no es ningún problema aquí: rAthena resuelve PACKETVER > 20180307 a cero claves de ofuscación, lo que hace que el XOR sea una operación identidad. El servidor lo confirma al arrancar con Packet Obfuscation: Enabled. Keys: 0x00000000, 0x00000000, 0x00000000.
Related MCP server: Roblox Executor MCP
Requisitos
Requisito | Notas |
Perl 5.34+ | El Perl del sistema en macOS es suficiente |
GNU readline |
|
Xcode Command Line Tools | Las cabeceras C de Perl se encuentran dentro del SDK en macOS moderno |
Python 3 | solo para ejecutar el SCons incluido con OpenKore |
Node.js 18+ | el propio servidor MCP |
Configuración
./setup.sh # clone OpenKore, patch, build XSTools, install config + pluginsetup.sh es idempotente. Hace cuatro cosas que la compilación estándar de OpenKore no puede hacer sin supervisión en Apple Silicon:
Apunta SConstruct al prefijo de readline de
/opt/homebrew(solo conoce el de Intel/usr/local).Lo apunta a las cabeceras de Perl dentro del SDK de macOS, ya que
Config.pmdevuelve una ruta/System/Librarysin prefijo que ya no las contiene.Añade un shim de
python→python3para el SCons incluido.Instala nuestra entrada de servidor, las sobrescrituras de configuración y el plugin
mcpbridge— incluido añadirmcpbridgealoadPlugins_list, sin lo cual el socket de control nunca se abre.
Requisitos previos del lado del servidor
La instancia de rAthena necesita tres ajustes para el inicio de sesión sin supervisión:
Archivo | Ajuste | Por qué |
|
| permite que |
|
| el aviso de PIN bloquea el bucle principal de OpenKore, lo que detiene el socket de control |
|
| creación de personajes |
El protocolo del puente
JSON delimitado por saltos de línea, en ambas direcciones, en 127.0.0.1:24390 (solo loopback — esto otorga control total de una sesión de juego).
// 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 reenvía a la propia capa de comandos de OpenKore en lugar de reimplementar el movimiento o la lógica de NPC — OpenKore ya sabe trazar rutas, reintentar y recuperarse, y duplicar eso aquí solo acabaría pudriéndose.
Uso
npm install && npm run build
node scripts/smoke.mjs # end-to-end check against a running serverRegístralo en un cliente MCP apuntándolo a dist/index.js:
{ "mcpServers": { "ro": { "command": "node", "args": ["/path/to/ro-mcp/dist/index.js"] } } }RO_MCP_KORE_DIR y RO_MCP_PORT sobrescriben la ubicación de OpenKore y el puerto del puente.
Herramientas
Herramienta | Propósito |
| iniciar / detener la sesión |
| mapa, posición, HP/SP, nivel, zeny, NPCs y monstruos cercanos |
| inspeccionar y responder a las preguntas interactivas de OpenKore |
| creación y selección de personajes |
| moverse dentro de un mapa / viajar a otro mapa |
| hablar con un NPC, devolviendo el texto de su diálogo y las opciones de menú |
| conducir una conversación |
| atacar a un monstruo cercano |
| leer la salida de consola / vía de escape |
Una nota sobre los prompts
OpenKore hace algunas preguntas por stdin — creación de personajes, selección de personaje, reintento de contraseña. Son lecturas bloqueantes dentro de su bucle principal, por lo que mientras una esté pendiente, el bucle se detiene y el socket de control no puede responder. El servidor MCP es, por tanto, el dueño tanto del stdin del proceso hijo como del socket; ro_prompt expone una pregunta pendiente y ro_answer responde a ella. Si alguna herramienta agota el tiempo de espera, comprueba ro_prompt primero.
Estado
Verificado de extremo a extremo contra un servidor real (scripts/smoke.mjs):
creación automática de cuentas, inicio de sesión, creación y selección de personajes
ro_stateinformando de mapa, posición, HP/SP, nivel, zeny y actores cercanosro_walkmoviendo al personaje y confirmando la llegadadestinos inalcanzables rechazados en ~30ms con el motivo, en lugar de agotar el tiempo de espera completo — OpenKore solo los notifica por consola, así que la comprobación de llegada compite con ese mensaje
una conversación completa con un NPC contra contenido escrito en TypeScript (
scripts/npc-test.mjs): leer el diálogo, parsear las opciones de menú, elegir una rama y leer la respuesta
Aún no probado: ro_attack.
Dos trampas asíncronas que conviene conocer
Las listas de actores se rellenan después de entrar en el mapa. Es normal que un ro_state tomado inmediatamente después del inicio de sesión no reporte NPCs cercanos; sondea hasta que aparezcan.
El último mensaje de un diálogo llega cuando se cierra. Los scripts normalmente responden y cierran de una sola vez, así que trata npc_talk_done como "marcar como cerrado", nunca como "descartar el búfer" — de lo contrario, el final de una conversación, normalmente la parte que se está comprobando, es exactamente la parte que se pierde.
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