VICE MCP

Servidor MCP integrado en el emulador VICE de Commodore 64/128/VIC-20/PET, que brinda a los asistentes de IA acceso directo para leer/escribir memoria, establecer puntos de interrupción, inspeccionar registros VIC-II/SID/CIA y depurar ensamblador 6502 en tiempo real con 63 herramientas.

Documentación

VICE MCP - La IA se encuentra con la Commodore 64

VICE MCP es un proyecto de Walker Heavy Industries.

Un servidor MCP integrado directamente dentro de VICE, que brinda a agentes de IA y herramientas modernas control programático completo sobre la computadora de 8 bits más icónica del mundo.

Carga una imagen de disco. Establece puntos de interrupción. Inspecciona sprites. Lee registros SID. Escribe en el teclado. Toma capturas de pantalla. Avanza paso a paso por código 6502. Todo a través de una API JSON-RPC limpia que cualquier cliente MCP puede usar.

Este es VICE — el legendario emulador de Commodore — con un servidor Model Context Protocol integrado en su núcleo. No añadido externamente. No es un envoltorio. ~17,000 líneas de C entretejidas en el propio emulador.

¿Qué Puedes Hacer Con Esto?

Para Agentes de IA

Apunta cualquier cliente compatible con MCP — Claude Desktop, Cursor, tu propio agente — a http://127.0.0.1:6510/mcp y tendrás una Commodore 64 totalmente controlable. Tu agente puede:

  • Cargar y ejecutar software — autoiniciar PRGs e imágenes de disco
  • Depurar código 6502 — puntos de interrupción, puntos de vigilancia, interrupciones condicionales, ejecución paso a paso
  • Inspeccionar todo — registros de CPU, bancos de memoria, gráficos VIC-II, audio SID, temporizadores CIA
  • Ver lo que hay en pantalla — tomar capturas de pantalla, leer mapas de bits de sprites como arte ASCII
  • Interactuar como un humano — escribir texto, presionar teclas, mover joysticks
  • Medir rendimiento — cronómetro de precisión de ciclos, trazado de ejecución, registro de interrupciones
  • Guardar y restaurar estado — gestión completa de instantáneas con metadatos

Para Desarrolladores de C64

Si escribes código para la Commodore 64, esto te brinda un flujo de trabajo de depuración moderno sin salir de tu editor:

  • Establece puntos de interrupción desde tu IDE mientras tu programa se ejecuta
  • Carga archivos de símbolos de KickAssembler o VICE y depura por nombre de etiqueta
  • Busca en memoria patrones de bytes con soporte de comodines
  • Compara regiones de memoria contra instantáneas guardadas para encontrar qué cambió
  • Traza la ejecución con filtrado de rango de PC para enfocarte en tu código
  • Registra interrupciones para entender el tiempo de IRQ/NMI
  • Agrupa puntos de interrupción y actívalos o desactívalos como un conjunto

Para Investigadores y Educadores

  • Automatiza análisis de ROM e ingeniería inversa
  • Construye tutoriales interactivos que controlen una C64 en vivo
  • Captura estados de pantalla para documentación
  • Reproduce y analiza software histórico

61 Herramientas en 13 Categorías

Cada herramienta sigue las convenciones de MCP con validación completa de JSON Schema, errores significativos y nombres de parámetros consistentes.

CategoríaHerramientasQué Hacen
Ejecuciónvice.execution.run vice.execution.pause vice.execution.step vice.frame.advance vice.run_untilControlan la CPU — reanudar, pausar, paso a paso, avanzar fotogramas completos, ejecutar hasta dirección o conteo de ciclos
Registrosvice.registers.get vice.registers.setLeer/escribir todos los registros 6502 (A, X, Y, SP, PC, banderas de estado)
Memoriavice.memory.read vice.memory.write vice.memory.banks vice.memory.search vice.memory.fill vice.memory.compareAcceso completo a memoria con selección de banco, búsqueda de patrones con comodines
Puntos de controlvice.checkpoint.add vice.checkpoint.delete vice.checkpoint.list vice.checkpoint.toggle vice.checkpoint.set_condition vice.checkpoint.set_ignore_count vice.checkpoint.group.*Puntos de interrupción, puntos de vigilancia, puntos de trazado — con condiciones y grupos
Spritesvice.sprite.get vice.sprite.set vice.sprite.inspectLeer/escribir estado de sprites, visualización de mapas de bits como arte ASCII
VIC-IIvice.vicii.get_state vice.vicii.set_stateAcceso completo al chip de video de la C64 — raster, colores, scroll, banco
SIDvice.sid.get_state vice.sid.set_stateEl legendario chip de sonido — voces, filtros, ADSR, formas de onda
CIAvice.cia.get_state vice.cia.set_stateEstado del chip de temporizador y E/S — tanto CIA1 como CIA2
Discovice.disk.attach vice.disk.detach vice.disk.list vice.disk.read_sectorMontar imágenes D64/D71/D81, explorar directorios, leer sectores crudos
Máquinavice.machine.reset vice.machine.config.get vice.machine.config.set vice.autostartReinicio duro/suave, control de recursos (warp, velocidad, modelo), carga de programas
Pantallavice.display.screenshot vice.display.get_dimensionsCaptura de pantalla a archivo o base64, geometría de pantalla
Entradavice.keyboard.type vice.keyboard.petscii vice.keyboard.key_press vice.keyboard.key_release vice.keyboard.restore vice.keyboard.matrix vice.keyboard.chord vice.joystick.set vice.joystick.tapTeclado y joystick — escritura de texto, teclas individuales, matriz directa, RESTORE/NMI
Depuraciónvice.disassemble vice.symbols.load vice.symbols.lookup vice.watch.add vice.backtrace vice.cycles.stopwatchDesensamblado, archivos de símbolos, pila de llamadas, temporización de precisión de ciclos
Instantáneasvice.snapshot.save vice.snapshot.load vice.snapshot.listGuardar/restaurar estado completo del emulador con metadatos JSON

Arquitectura

Esto no es un proceso auxiliar ni un capturador de pantalla. El servidor MCP está compilado directamente dentro de VICE como un subsistema de primera clase — en cada máquina que VICE emula.

Máquinas Soportadas

MáquinaCPUHardware Notable
C64 / C64 SC6510VIC-II, SID, 2×CIA, Sprites
C1288502/Z80VIC-II, VDC 80-col, SID, 2×CIA
SCPU6465816Acelerador SuperCPU
C64 DTV6510 (extendido)Registros específicos de DTV
VIC-206502Video VIC-I, memoria de expansión
Plus/4 y C167501/8501Chip de video+audio TED
PET6502Video CRTC, E/S PIA/VIA
CBM-II6509CRTC, MOS 6526 CIA

El servidor MCP se adapta automáticamente a la máquina en ejecución. Cuando un agente de IA llama a vice.machine.config.get, recibe la configuración de hardware real — qué chips están presentes, qué bancos de memoria existen, rangos de direcciones válidos y recursos disponibles. Un agente depurando un cartucho de VIC-20 obtiene registros VIC-I; el mismo agente depurando un programa de C128 obtiene VIC-II y la pantalla VDC de 80 columnas.

┌─────────────────────────────────────────────────┐
│                   VICE Emulator                  │
│                                                  │
│  ┌──────────┐  ┌──────────┐  ┌──────────────┐  │
│  │   CPU    │  │  Video   │  │    Audio     │  │
│  │ (varies) │  │ (varies) │  │   (varies)   │  │
│  └────┬─────┘  └────┬─────┘  └──────┬───────┘  │
│       │              │               │           │
│       └──────────┬───┴───────────────┘           │
│                  │                                │
│         ┌────────┴────────┐                      │
│         │  MCP Server     │                      │
│         │  (libmcp.a)     │                      │
│         │                 │                      │
│         │  JSON-RPC 2.0   │<---- POST /mcp -----│
│         │  libmicrohttpd  │---- GET /events 501>│
│         │  Trap Dispatch  │                      │
│         └─────────────────┘                      │
│                                                  │
└─────────────────────────────────────────────────┘
        127.0.0.1:6510 by default

Decisiones clave de diseño:

  • Despacho basado en trampas — Las solicitudes HTTP se despachan a través del mecanismo de trampas de VICE, asegurando que toda la lógica de herramientas se ejecute en el hilo principal del emulador. Sin condiciones de carrera, sin sorpresas de bloqueo.
  • Acceso de copia cero — Las herramientas leen directamente de los internos del emulador. Cuando pides estado de VIC-II, obtienes los valores de registro reales, no una aproximación en caché.
  • Respuestas conscientes de la máquina — Las herramientas informan capacidades de hardware, disponibilidad de chips y rangos de memoria válidos para cualquier máquina en ejecución. El agente siempre sabe con qué está trabajando.
  • Integración con monitor — Funciona junto al monitor integrado de VICE. Si el emulador está pausado en el monitor, las solicitudes MCP se ejecutan directamente sin trampas.
  • Endpoint de eventos reservado — GET /events existe pero actualmente devuelve 501 Not Implemented. Consulta el estado a través de /mcp hasta que llegue la transmisión de eventos.

Inicio Rápido

Conectar a VICE

Inicia cualquier máquina VICE con el servidor MCP habilitado:

# C64 (cycle-exact)
x64sc -mcpserver

# C128
x128 -mcpserver

# VIC-20
xvic -mcpserver

# Listen on all network interfaces, port 7000
x64sc -mcpserver -mcpserverhost 0.0.0.0 -mcpserverport 7000

El servidor MCP se inicia en 127.0.0.1:6510 por defecto. Los clientes MCP se conectan a:

http://127.0.0.1:6510/mcp

0.0.0.0 es una dirección de enlace, no una dirección de cliente. Significa "escuchar en cada interfaz". Un cliente en el mismo Mac aún se conecta a 127.0.0.1; un cliente en otra máquina se conecta a la dirección IP LAN del Mac, por ejemplo http://192.168.1.42:6510/mcp.

Recetas de Conexión

Caso de usoIniciar VICE conURL del clienteCabecera de autenticación
Mismo Mac, predeterminadox64sc -mcpserverhttp://127.0.0.1:6510/mcpNinguna
Mismo Mac, puerto personalizadox64sc -mcpserver -mcpserverport 7000http://127.0.0.1:7000/mcpNinguna
Acceso LAN, red confiablex64sc -mcpserver -mcpserverhost 0.0.0.0http://<mac-lan-ip>:6510/mcpNinguna
Acceso LAN con token portadorx64sc -mcpserver -mcpserverhost 0.0.0.0 -mcpservertoken secrethttp://<mac-lan-ip>:6510/mcpAuthorization: Bearer secret
Aplicación de navegador con CORSx64sc -mcpserver -mcpservercorsorigin http://localhost:3000 -mcpservertoken secrethttp://127.0.0.1:6510/mcpAuthorization: Bearer secret

Las reglas de token son intencionalmente simples:

  • Sin token configurado: los clientes MCP que no son de navegador pueden conectarse sin una cabecera Authorization.
  • Token configurado: cada solicitud MCP debe incluir Authorization: Bearer <token>.
  • CORS configurado: se requiere un token. El CORS comodín (*) se rechaza.
  • Vincular a 0.0.0.0 sin token está permitido por compatibilidad hacia atrás, pero VICE registra una advertencia porque clientes remotos pueden controlar el emulador.

Hablar con Él

Todas las solicitudes HTTP van a /mcp, deben usar Content-Type: application/json, y deben enviar Accept: application/json.

# Direct JSON-RPC call
curl -sS http://127.0.0.1:6510/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  --data '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "vice.ping"
}'

# Standard MCP tools/call form, used by Claude Code and other MCP clients
curl -sS http://127.0.0.1:6510/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  --data '{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": { "name": "vice_ping", "arguments": {} }
}'

# Read the BASIC ROM entry point
curl -sS http://127.0.0.1:6510/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  --data '{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "vice_memory_read",
    "arguments": { "address": "0xA000", "size": 16, "encoding": "hex" }
  }
}'

Cuando se configura un token, agrega la cabecera portadora a cada solicitud:

curl -sS http://127.0.0.1:6510/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer secret' \
  --data '{"jsonrpc":"2.0","id":1,"method":"vice.ping"}'

Usar con Claude Desktop

Agrega esto a tu configuración MCP de Claude Desktop:

{
  "mcpServers": {
    "vice": {
      "url": "http://127.0.0.1:6510/mcp"
    }
  }
}

Luego simplemente habla con él: "Carga el juego en la unidad 8 y muéstrame lo que hay en pantalla."

Si VICE se inició con -mcpservertoken, el cliente debe enviar Authorization: Bearer <token> en cada solicitud. Si tu cliente MCP no puede configurar cabeceras HTTP, no uses un token para sesiones 127.0.0.1 solo locales.

Compilar desde el Código Fuente

Requisitos Previos

PlataformaInstalación
Debian/Ubuntuapt install build-essential autoconf automake pkg-config libmicrohttpd-dev libgtk-3-dev libglew-dev libevdev-dev libcurl4-openssl-dev libpulse-dev xa65 flex byacc dos2unix
macOSbrew install autoconf automake pkg-config libmicrohttpd gtk+3 xa lame
Windows (MSYS2)pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-libmicrohttpd mingw-w64-x86_64-gtk3 autoconf automake pkg-config

Compilar

cd vice
./autogen.sh
mkdir build && cd build
../configure --enable-mcp-server --enable-gtk3ui
make -j$(nproc)

Verificar

# MCP flags should appear in help output
src/x64sc -help | grep mcp

# Expected:
# -mcpserver          Enable MCP server
# -mcpserverport <port>  Set MCP server port (default: 6510)
# -mcpserverhost <host>  Set MCP server host (default: 127.0.0.1)

Binarios Precompilados

Los binarios precompilados están disponibles en la página de Lanzamientos.

PlataformaGUISin interfaz gráficaNotas
Linux x86_64SíSíInterfaz GTK3
macOS arm64SíSíInterfaz GTK3 (Apple Silicon)
Windows x86_64NoSíSolo sin interfaz gráfica — compilación cruzada vía MinGW-w64

Windows no incluye una compilación con GUI. La compilación cruzada de GTK3 para Windows no está soportada por el sistema de compilación de VICE. Si necesitas una GUI de Windows, compila desde el código fuente de forma nativa usando MSYS2.

Cliente Python

Se incluye un cliente Python resistente con lógica de reintento, agrupación de conexiones y un método de conveniencia para cada herramienta:

from tools.resilience.vice_mcp_resilient import ViceMCPClient

with ViceMCPClient("http://127.0.0.1:6510") as vice:
    # Load a program
    vice.autostart("/path/to/game.prg")

    # Set a breakpoint at the main loop
    vice.checkpoint_add(start_address=0x0810, stop_address=0x0810)

    # Run until it hits
    vice.execution_run()

    # Read the screen
    regs = vice.registers_get()
    screenshot = vice.display_screenshot(format="base64")

    # Inspect a sprite
    art = vice.sprite_inspect(sprite_number=0)
    print(art)

Suite de Pruebas de Protocolo

167 pruebas en 25 clases de prueba validan cada herramienta, cada parámetro y cada condición de error:

# Requires a running VICE instance with MCP enabled
pytest tools/tests/test_mcp_protocol.py -v

Uso en el Mundo Real

sim6502 — Pruebas Unitarias para Ensamblador 6502

sim6502 es un marco de pruebas unitarias para ensamblador 6502/6510/65C02 que usa VICE MCP como backend de ejecución. Escribe pruebas en un DSL personalizado, ejecútalas contra una instancia VICE en vivo con hardware de precisión de ciclos:

suite "sprite collision" {
    load "game.prg"

    test "player hits enemy" {
        jsr setup_sprites
        poke $d015, #$03          ; enable sprites 0 and 1
        poke $d000, #$80          ; sprite 0 x = 128
        poke $d002, #$80          ; sprite 1 x = 128
        jsr main_loop
        assert $d01e & #$03 != 0  ; collision register set
    }
}

sim6502 se conecta a través de MCP para cargar programas, establecer puntos de interrupción, leer registros, comparar memoria y guardar/restaurar estado entre pruebas — llevando prácticas modernas de CI/CD al desarrollo de computación retro.

Flujos de Trabajo de Agentes de IA

Cualquier cliente compatible con MCP puede controlar VICE directamente:

  • Claude Desktop / Cursor — "Carga esta imagen de disco, encuentra el bucle principal y explica qué hace el manejador de IRQ"
  • Agentes personalizados — Análisis automatizado de ROM, pruebas de regresión, captura de capturas de pantalla
  • Herramientas de investigación — Exploración sistemática del comportamiento de software histórico

Seguridad

El servidor MCP es solo localhost por defecto (127.0.0.1). Con la configuración predeterminada, solo los programas en la misma máquina pueden conectarse.

No tiene TLS. Tiene autenticación opcional de token portador. Está diseñado para desarrollo local primero, y la exposición a la red debe ser deliberada.

Si necesitas acceso remoto, colócalo detrás de un proxy inverso con autenticación adecuada:

nginx/caddy -> auth -> https -> 127.0.0.1:6510

Vincular a 0.0.0.0 está soportado vía -mcpserverhost. Eso hace que VICE escuche en cada interfaz de red. No significa que los clientes se conecten a 0.0.0.0; los clientes remotos se conectan a la dirección IP real del host Mac/Linux/Windows.

Usa esta lista de verificación para sesiones remotas:

  • Inicia VICE con -mcpserverhost 0.0.0.0.
  • Prefiere agregar -mcpservertoken <token> a menos que la red ya sea confiable.
  • Configura la URL del cliente como http://<host-ip>:6510/mcp.
  • Si se configura un token, configura el cliente para enviar Authorization: Bearer <token>.
  • Para clientes basados en navegador, también configura exactamente un -mcpservercorsorigin <origin> y un token. CORS sin token se rechaza.

Relación con VICE Ascendente

Este es un fork del espejo SVN de VICE. El servidor MCP está implementado como un subsistema autocontenido en src/mcp/ — toca los internos de VICE a través de interfaces bien definidas pero no modifica la lógica central de emulación.

La rama main rastrea el VICE ascendente. La rama mcp-server contiene todas las adiciones de MCP. El objetivo es contribuir con este trabajo de vuelta al proyecto VICE. La implementación está estructurada para exportarse limpiamente como diffs unificados para el envío a SVN.

Referencia de Herramientas

Haz clic para expandir la referencia completa de las 61 herramientas

Control de Ejecución

vice.ping

Comprueba si VICE está respondiendo. Sin parámetros.

vice.execution.run

Reanudar la ejecución. Sin parámetros.

vice.execution.pause

Pausar la ejecución. Sin parámetros.

vice.execution.step

Ejecutar una o más instrucciones. En una máquina detenida, la llamada regresa después del paso, con completed: true y el PC. Si un checkpoint detiene la máquina primero, la respuesta lleva stopped_early: true y el PC en ese punto; si el paso no ha terminado después de 2 segundos (un paso sobre una subrutina lenta), la máquina se pausa en el siguiente límite de instrucción y la respuesta lleva timed_out: true. En cualquier caso, el resto del paso se descarta. En una máquina en ejecución, la llamada arma el paso y regresa de inmediato.

ParámetroTipoRequeridoDescripción
countnumberInstrucciones a ejecutar (predeterminado: 1, máximo: 10000)
stepOverbooleanEjecutar paso a paso sobre subrutinas

vice.frame.advance

Ejecutar fotogramas completos desde una máquina detenida y detenerse de nuevo, en el primer límite de instrucción después de la sincronización vertical que termina el último fotograma, con los registros exportados. El estado del joystick y del teclado establecido mientras está detenido se mantiene mientras se ejecutan los fotogramas, lo que permite un bucle de entrada fotograma a fotograma: establecer entrada, avanzar un fotograma, leer memoria, repetir. La máquina ya debe estar detenida (por vice.execution.pause, un checkpoint de detención o vice.execution.step); de lo contrario, la llamada devuelve el error -32001. Si un checkpoint detiene la máquina antes del límite, la respuesta lleva stopped_early: true y el número de fotogramas completos que se ejecutaron. Un fotograma que no ha terminado después de 2 segundos se abandona: la máquina se pausa en el siguiente límite de instrucción y la respuesta también lleva timed_out: true.

ParámetroTipoRequeridoDescripción
framesnumberFotogramas completos a ejecutar antes de detenerse de nuevo (predeterminado: 1, máximo: 1000)

vice.run_until

Ejecutar hasta una dirección o durante N ciclos con tiempo de espera.

ParámetroTipoRequeridoDescripción
addressstringDirección objetivo (hexadecimal, decimal o nombre de símbolo)
cyclesnumberCiclos máximos a ejecutar

Registros

vice.registers.get

Obtener todos los registros de la CPU (A, X, Y, SP, PC, banderas de estado). Sin parámetros.

vice.registers.set

Establecer un valor de registro de la CPU.

ParámetroTipoRequeridoDescripción
registerstringsíNombre del registro: PC A X Y SP N V B D I Z C
valuenumbersíValor a establecer

Memoria

vice.memory.read

Leer un rango de memoria con selección opcional de banco.

ParámetroTipoRequeridoDescripción
addressstringsíDirección: número, hexadecimal ($1000) o nombre de símbolo
sizenumbersíBytes a leer (1-65535)
bankstringNombre del banco de memoria (usa vice.memory.banks para listar)

vice.memory.write

Escribir bytes en la memoria.

ParámetroTipoRequeridoDescripción
addressstringsíDirección: número, hexadecimal ($1000) o nombre de símbolo
datanumber[]síBytes a escribir (0-255 cada uno)

vice.memory.banks

Listar los bancos de memoria disponibles para la máquina actual. Sin parámetros.

vice.memory.search

Buscar patrones de bytes con máscara de comodín opcional.

ParámetroTipoRequeridoDescripción
startstringsíDirección de inicio
endstringsíDirección de fin
patternnumber[]síPatrón de bytes, p. ej. [0x4C, 0x00, 0xA0]
masknumber[]Máscara por byte: 0xFF=exacto, 0x00=comodín
max_resultsnumberMáximo de coincidencias (predeterminado: 100, máximo: 10000)

vice.memory.fill

Rellenar un rango de memoria con un patrón de bytes repetido.

ParámetroTipoRequeridoDescripción
startstringsíDirección de inicio
endstringsíDirección de fin (inclusive)
patternnumber[]síPatrón de bytes a repetir

vice.memory.compare

Comparar dos rangos de memoria o comparar contra una instantánea.

ParámetroTipoRequeridoDescripción
modestringsíranges o snapshot
range1_startstringrangosInicio del primer rango
range1_endstringrangosFin del primer rango
range2_startstringrangosInicio del segundo rango
snapshot_namestringinstantáneaInstantánea contra la que comparar
startstringinstantáneaDirección de inicio para comparar
endstringinstantáneaDirección de fin para comparar
max_differencesnumberMáximo de diferencias a devolver (predeterminado: 100)

Checkpoints y Puntos de Interrupción

vice.checkpoint.add

Añadir un checkpoint (punto de interrupción, punto de vigilancia o punto de rastreo).

ParámetroTipoRequeridoDescripción
startstringsíDirección de inicio
endstringDirección de fin (predeterminado = inicio)
stopbooleanDetener al alcanzar (predeterminado: true)
loadbooleanInterrumpir en lectura de memoria (predeterminado: false)
storebooleanInterrumpir en escritura de memoria (predeterminado: false)
execbooleanInterrumpir en ejecución (predeterminado: true)

vice.checkpoint.delete

Eliminar un checkpoint.

ParámetroTipoRequeridoDescripción
checkpoint_numnumbersíNúmero de checkpoint

vice.checkpoint.list

Listar todos los checkpoints. Sin parámetros.

vice.checkpoint.toggle

Habilitar o deshabilitar un checkpoint.

ParámetroTipoRequeridoDescripción
checkpoint_numnumbersíNúmero de checkpoint
enabledbooleansíHabilitar o deshabilitar

vice.checkpoint.set_condition

Establecer una expresión de condición en un checkpoint.

ParámetroTipoRequeridoDescripción
checkpoint_numnumbersíNúmero de checkpoint
conditionstringsíExpresión, p. ej. A == $42

vice.checkpoint.set_ignore_count

Establecer cuántos aciertos ignorar antes de detenerse.

ParámetroTipoRequeridoDescripción
checkpoint_numnumbersíNúmero de checkpoint
countnumbersíAciertos a ignorar

vice.checkpoint.group.create

Crear un grupo de checkpoints con nombre.

ParámetroTipoRequeridoDescripción
namestringsíNombre del grupo
checkpoint_idsnumber[]IDs iniciales de checkpoint

vice.checkpoint.group.add

Añadir checkpoints a un grupo existente.

ParámetroTipoRequeridoDescripción
groupstringsíNombre del grupo
checkpoint_idsnumber[]síIDs de checkpoint a añadir

vice.checkpoint.group.toggle

Habilitar o deshabilitar todos los checkpoints en un grupo.

ParámetroTipoRequeridoDescripción
groupstringsíNombre del grupo
enabledbooleansíHabilitar o deshabilitar todos

vice.checkpoint.group.list

Listar todos los grupos de checkpoints. Sin parámetros.


Sprites (C64/C128/DTV)

vice.sprite.get

Obtener el estado del sprite.

ParámetroTipoRequeridoDescripción
spritenumberNúmero de sprite 0-7 (omitir para todos)

vice.sprite.set

Establecer propiedades del sprite.

ParámetroTipoRequeridoDescripción
spritenumbersíNúmero de sprite 0-7
xnumberPosición X 0-511
ynumberPosición Y 0-255
enabledbooleanHabilitar sprite
multicolorbooleanModo multicolor
expand_xbooleanDoble ancho
expand_ybooleanDoble alto
priority_foregroundbooleanDibujar sobre el fondo
colornumberColor del sprite 0-15

vice.sprite.inspect

Representación visual en arte ASCII del bitmap de un sprite.

ParámetroTipoRequeridoDescripción
sprite_numbernumbersíNúmero de sprite 0-7
formatstringascii (predeterminado), binary o png_base64

Estado del Chip

vice.vicii.get_state

Obtener el estado interno del VIC-II. Sin parámetros.

vice.vicii.set_state

Establecer registros del VIC-II.

ParámetroTipoRequeridoDescripción
registersobject[]Matriz de {offset, value} (offset 0x00-0x2E)

vice.sid.get_state

Obtener el estado del SID (voces, filtro, ADSR). Sin parámetros.

vice.sid.set_state

Establecer registros del SID.

ParámetroTipoRequeridoDescripción
registersobject[]Matriz de {offset, value} (offset 0x00-0x1C)

vice.cia.get_state

Obtener el estado del CIA (temporizadores, puertos).

ParámetroTipoRequeridoDescripción
cianumberNúmero de CIA: 1 o 2 (omitir para ambos)

vice.cia.set_state

Establecer registros del CIA.

ParámetroTipoRequeridoDescripción
cia1_registersobject[]Matriz de {offset, value} (offset 0x00-0x0F)
cia2_registersobject[]Matriz de {offset, value} (offset 0x00-0x0F)

Gestión de Discos

vice.disk.attach

Adjuntar una imagen de disco a una unidad.

ParámetroTipoRequeridoDescripción
unitnumbersíUnidad (8-11)
pathstringsíRuta a la imagen de disco (.d64, .g64, etc.)

vice.disk.detach

Desadjuntar una imagen de disco.

ParámetroTipoRequeridoDescripción
unitnumbersíUnidad (8-11)

vice.disk.list

Listar el contenido del directorio de un disco adjunto.

ParámetroTipoRequeridoDescripción
unitnumbersíUnidad (8-11)

vice.disk.read_sector

Leer datos de sector en bruto.

ParámetroTipoRequeridoDescripción
unitnumbersíUnidad (8-11)
tracknumbersíNúmero de pista (1-42 para D64)
sectornumbersíNúmero de sector

Control de la Máquina

vice.autostart

Iniciar automáticamente una imagen PRG o de disco.

ParámetroTipoRequeridoDescripción
pathstringsíRuta a .prg, .d64, .g64, etc.
programstringNombre del programa a cargar desde el disco
runbooleanEjecutar después de cargar (predeterminado: true)
indexnumberÍndice del programa en el disco, basado en 0

vice.machine.reset

Reiniciar la máquina.

ParámetroTipoRequeridoDescripción
modestringsoft (predeterminado) o hard (ciclo de encendido)
run_afterbooleanReanudar después del reinicio (predeterminado: true)

vice.machine.config.get

Obtener la configuración de la máquina — chips, mapa de memoria, recursos. Sin parámetros.

vice.machine.config.set

Establecer recursos de la máquina.

ParámetroTipoRequeridoDescripción
resourcesobjectsíPares de nombre/valor de recursos, p. ej. {"WarpMode": 1}

Pantalla

vice.display.screenshot

Capturar la pantalla.

ParámetroTipoRequeridoDescripción
pathstringRuta del archivo para guardar
formatstringPNG (predeterminado) o BMP
return_base64booleanDevolver como URI de datos base64

vice.display.get_dimensions

Obtener las dimensiones de la pantalla. Sin parámetros.


Entrada

vice.keyboard.type

Escribir texto con conversión automática de PETSCII.

ParámetroTipoObligatorioDescripción
textstringsíTexto a escribir (\n para Retorno)
petscii_upperbooleanMapeo de mayúsculas (predeterminado: true)

vice.keyboard.key_press

Pulsar una tecla.

ParámetroTipoObligatorioDescripción
keystringsíNombre de la tecla o un solo carácter
modifiersstring[]shift, control, alt, meta, etc.
hold_framesnumberDuración de pulsación en fotogramas (1-300)
hold_msnumberDuración de pulsación en ms (1-5000)

vice.keyboard.key_release

Soltar una tecla.

ParámetroTipoObligatorioDescripción
keystringsíNombre de la tecla o un solo carácter
modifiersstring[]Modificadores a soltar

vice.keyboard.restore

Pulsar/soltar la tecla RESTORE (activa NMI).

ParámetroTipoObligatorioDescripción
pressedbooleantrue=pulsar, false=soltar (predeterminado: true)

vice.keyboard.matrix

Control directo de la matriz del teclado para juegos.

ParámetroTipoObligatorioDescripción
keystringNombre de la tecla: A-Z, 0-9, SPACE, RETURN, etc.
rownumberFila de la matriz 0-7 (alternativa a la tecla)
colnumberColumna de la matriz 0-7 (alternativa a la tecla)
pressedbooleanEstado de la tecla (predeterminado: true)
hold_framesnumberDuración de pulsación en fotogramas
hold_msnumberDuración de pulsación en ms

vice.joystick.set

Establecer el estado del joystick.

ParámetroTipoObligatorioDescripción
portnumberPuerto 1 o 2 (predeterminado: 1)
directionstringup, down, left, right, center
firebooleanBotón de disparo (predeterminado: false)

vice.joystick.tap

Tocar el joystick.

ParámetroTipoObligatorioDescripción
portnumberPuerto 1 o 2 (predeterminado: 1)
directionstringup, down, left, right, center
firebooleanBotón de disparo (predeterminado: false)
duration_framesnumberDuración del toque en fotogramas (predeterminado: 3)
duration_msnumberDuración del toque en ms (predeterminado: 0)

Depuración avanzada

vice.disassemble

Desensamblar memoria en instrucciones 6502.

ParámetroTipoObligatorioDescripción
addressstringsíDirección de inicio
countnumberInstrucciones a desensamblar (predeterminado: 10, máximo: 100)
show_symbolsbooleanMostrar nombres de símbolos (predeterminado: true)

vice.symbols.load

Cargar un archivo de símbolos/etiquetas.

ParámetroTipoObligatorioDescripción
pathstringsíRuta al archivo .sym o .lbl
formatstringauto, kickasm, vice o simple

vice.symbols.lookup

Buscar un símbolo por nombre o dirección.

ParámetroTipoObligatorioDescripción
namestringNombre del símbolo (devuelve la dirección)
addressnumberDirección (devuelve el nombre del símbolo)

vice.watch.add

Añadir un punto de vigilancia de memoria.

ParámetroTipoObligatorioDescripción
addressstringsíDirección a vigilar
sizenumberBytes a vigilar (predeterminado: 1)
typestringread, write o both (predeterminado: write)
loadbooleanAlternativa a type: vigilar lecturas, como en vice.checkpoint.add
storebooleanAlternativa a type: vigilar escrituras, como en vice.checkpoint.add
stopbooleanDetener al alcanzar (predeterminado: true); false cuenta los aciertos sin detenerse
conditionstringCondición, p. ej. A == $42

vice.backtrace

Mostrar la pila de llamadas desde las direcciones de retorno JSR.

ParámetroTipoObligatorioDescripción
depthnumberMáximo de fotogramas (predeterminado: 16, máximo: 64)

vice.cycles.stopwatch

Medir ciclos de CPU transcurridos.

ParámetroTipoObligatorioDescripción
actionstringsíreset, read o reset_and_read

Instantáneas

vice.snapshot.save

Guardar el estado completo del emulador.

ParámetroTipoObligatorioDescripción
namestringsíNombre de la instantánea (alfanumérico, _, -)
descriptionstringQué captura esta instantánea
include_romsbooleanIncluir ROMs (predeterminado: false)
include_disksbooleanIncluir estado del disco (predeterminado: false)

vice.snapshot.load

Restaurar el estado del emulador desde una instantánea.

ParámetroTipoObligatorioDescripción
namestringsíNombre de la instantánea

vice.snapshot.list

Listar todas las instantáneas con metadatos. Sin parámetros.

Estado del proyecto

Este es software activo y funcional. El servidor MCP compila y se ejecuta en Linux, macOS y Windows. Las 61 herramientas están implementadas y probadas. CI produce binarios para las tres plataformas en cada push.

Lo que es sólido:

  • Suite completa de herramientas: ejecución, memoria, puntos de interrupción, sprites, estado de chips, disco, entrada, depuración
  • Respuestas conscientes de la máquina en todas las plataformas emuladas por VICE
  • Cliente Python con lógica de reintento y cobertura de pruebas completa
  • Compilaciones multiplataforma: Linux x86_64 (GUI + headless), macOS arm64 (GUI + headless), Windows x86_64 (headless)
  • Pipeline CI/CD automatizado con lanzamientos de binarios

Lo que está en progreso:

  • Transmisión de eventos. GET /events está reservado pero devuelve 501 Not Implemented hoy.
  • Trazado de ejecución y enlaces de registro de interrupciones en el núcleo de CPU de VICE

Contribuciones

"Crucen, niños. Todos son bienvenidos. Todos bienvenidos." — Tangina Barrons, hablando a los contribuyentes sobre este repositorio

Este proyecto une dos comunidades que a menudo no se superponen: la informática retro y las herramientas modernas de IA. Las contribuciones de cualquiera de los dos mundos (o ambos) son bienvenidas.

Áreas donde la ayuda sería especialmente apreciada:

  • Internos de VICE: enlazar el trazado de ejecución y el registro de interrupciones en el núcleo de CPU
  • Transporte de transmisión de eventos: añadir notificaciones en tiempo real de puntos de interrupción y cambios de estado
  • Soporte adicional de máquinas: probar y ajustar herramientas para PET, CBM-II, Plus/4
  • Bibliotecas de cliente: clientes TypeScript, Rust, Go
  • Documentación: tutoriales, flujos de trabajo de ejemplo, demostraciones en video
  • Pruebas: ejecutar la suite de pruebas del protocolo contra casos límite

El servidor MCP está completamente contenido en vice/src/mcp/. Empieza ahí.

Versionado y lanzamientos

Este repositorio sigue el Estándar de Compilación y Lanzamiento de Walker Heavy Industries:

  • Conventional Commits son obligatorios. El versionado está automatizado con Cocogitto: feat: incrementa la menor, fix: la de parche, y un !/BREAKING CHANGE incrementa la mayor. Instala el hook de commit local una vez con cog install-hook --all (CI también valida los commits).
  • En cada push a main, CI ejecuta cog bump --auto, que etiqueta la siguiente vX.Y.Z, actualiza CHANGELOG.md y publica un GitHub Release con las notas de changelog generadas.
  • La matriz de compilación multi-OS (Linux/macOS/Windows) adjunta sus artefactos a ese Release. La última etiqueta v / Release es la única fuente de verdad para la versión: no hay compute-version.sh ni prefijo de etiqueta vice-mcp-*.

Licencia

VICE se publica bajo la GNU General Public License v2. Las adiciones del servidor MCP siguen la misma licencia.

Agradecimientos

  • El Equipo VICE por más de 30 años del mejor emulador de 8 bits jamás escrito
  • Anthropic por la especificación del Model Context Protocol
  • La comunidad de Commodore 64: aún fuerte después de cuatro décadas

Parte de la suite

VICE MCP es parte de la cadena de herramientas retro de Walker Heavy Industries: herramientas modernas para el ecosistema retro de 8 y 16 bits.

  • Centro de la casa: https://whi.dev
  • Hermanos: VICE Mac · VICE MCP · FamiForge · NESBasic · Novus · Miggy Draw · NovaVM