Skip to content

Releases: derfsss/MCP-AmigaOS4

2.0 — Tracked jobs, sandboxed commands, and the mcp 2 SDK

Choose a tag to compare

@derfsss derfsss released this 23 Oct 15:32
2ed20cb

2.0 is a major version because the host server moved to the mcp 2.x Python SDK; tools, parameters and config files carry over.

On the daemon, every command now runs as a tracked job that can be followed, read and stopped after the call that started it has returned. MCPd's connection workers now run above ordinary programs, so a busy program can no longer starve the daemon. A job can also run under SandboxVM, so a crashing program is contained and its trap reported. And a command that outlived its timeout is no longer run a second time: the host reports it as still running and never resends a request that may already have run.

143 tools in 15 namespaces, 8 resources, 64 daemon methods. v1.4 was never tagged; its changes are included here.

Highlights

  • exec.status / exec.output / exec.kill / exec.list. A timed-out exec_cmd returns state: "running" with its job_id.
  • Job priority defaults to -2 and is capped at 0 (priority, [defaults] exec_priority). Workers run at +1.
  • exec_cmd sandbox=true returns a sandbox block with end_reason and the trap report. exec_kill force=true needs SandboxVM 1.1.
  • input.key handles F11/F12; input.scroll sends native AmigaOS 4 wheel events.
  • Board detection uses GetMachineInfo; qemu.stop always flushes the guest's filesystem.
  • qemu-runner is a package dependency (v1.3.1, MIT). git must be on PATH to install.

The full list is in CHANGELOG.md.

Assets

  • MCPd-2.0.lha: use this one. It was built on AmigaOS, so the protection bits survive. Unpack with LhA x MCPd-2.0.lha, then run MCPd-Install.
  • MCPd-2.0: the bare daemon ELF, for host-side installers that set the bits themselves.

Verified on QEMU (pegasos2, AmigaOne) and on a real AmigaOne X5000.

https://claude.ai/code/session_01NoRoaz2uRizs5YeGbLXNqr

v1.3 — Sandboxed iteration, screen capture, and input injection

Choose a tag to compare

@derfsss derfsss released this 10 Sep 23:29
ed6887b

Fourth release. The headline is input.* — keyboard and mouse
injection on the target — plus the sandbox.* namespace, on-Amiga
screen capture, and the kernel debug ring as a first-class primitive.

121 → 137 tools, 12 → 14 namespaces. Wire protocol stays at 1.0:
every addition is additive and proto.capabilities derives its method
list dynamically, so an older host talks to a 1.3 daemon fine and an
older daemon simply reports no input capability.

input.* — and it is off by default

input.state, type, key, mouse_move, click, drag, scroll,
driving input.device IND_WRITEEVENT from MCPd, so it works on real
PowerPC hardware as well as QEMU — not just QMP-driven guests.

This is the only surface in the project that writes to a machine's
UI: it types and clicks as the logged-in user, into whatever window has
focus. So it is disabled at the daemon and returns -32003 until an
operator either starts MCPd with --enable-input or creates
SYS:System/MCPd/ENABLE-INPUT on the target and restarts.

  • The gate is read once at startup into a read-only static, so no
    RPC method can switch it on — enabling needs filesystem access to the
    machine itself.
  • The sentinel file is the primary mechanism because MCPd-Watchdog
    relaunches MCPd with no arguments; a CLI-flag-only gate would be
    silently dropped on the first restart, which is the worst failure mode
    for a security control.
  • proto.capabilities reports input.enabled, and the methods stay
    advertised when the gate is shut, so a client can tell "switched off"
    from "old daemon".
  • The host-side [targets.<name>.input] enabled flag is a wrong-target
    guard, not access control — anything that can reach TCP 4322
    bypasses the host.

Typing is layout-correct: characters map through the target's own
keymap.library MapANSI, dead-key sequences included, with a built-in
US table as fallback. confirm: true is required on the operations that
commit an action, and ctrl+lamiga+ramiga additionally needs
confirm_reset: true because it reboots the machine. Every handler
releases held modifiers and mouse buttons before returning, including on
the abort path, so a truncated drag cannot leave a stuck button.

Read SECURITY.md before enabling it on anything.

Also new

  • sandbox.* — driver and program iteration on top of
    SandboxVM, so a guest segfault
    no longer costs a power cycle.
  • wb.screenshot — captures an AmigaOS screen to PNG on the target
    and brings it back; works on real X5000 / A1222, unlike the QMP-only
    qemu.screenshot.
  • sys.debug_ring — reads the kernel debug ring via
    c:DumpDebugBuffer.
  • installer.* no longer needs a host-side diskimage-bootstrap/
    directory, and bundles AmiDock prefs.

Verified

QEMU pegasos2 (sm501 RTG) 27/27 and a real AmigaOne X5000 23/27
via the new scripts/validate_input.py, which drives the whole gate
cycle: shut by default → sentinel → restart → open → inject → sentinel
removed → restart → shut.

Echo café >… typed into a Shell produced exactly b'caf\xe9' on both
machines — four bytes, correct ISO-8859-1. The X5000's four non-passes
are debug-ring assertions that machine cannot satisfy: the AmigaOS
kernel debug buffer does not wrap, and a verbose graphics driver fills
all 80 KB of it during boot, before MCPd starts. proto.capabilities is
the authoritative gate reading; see the note in COMMANDS.md.

Assets

MCPd-1.3.lha — start here. The daemon plus all five install
scripts and a README, packaged on AmigaOS so every file already
carries the right protection bits. AmigaOS protection bits are part of
the file rather than the byte stream, so a raw ELF copied onto an Amiga
over SMB, a USB stick, or a browser download arrives with the
executable bit protected and simply refuses to run. Unpack this and
everything is runnable as-is:

LhA x MCPd-1.3.lha
Execute MCPd/MCPd-Install

sha256 415df28ffc48205d8875aeed7311452106c53308063771949f58d1398e16dfa7

MCPd-1.3 — the bare PowerPC ELF, 304,708 bytes,
$VER: MCPd 1.3 (10.09.2026), built with AmigaOS 4.1 FE SDK 54.16 +
GCC 11.5 (walkero/amigagccondocker:os4-gcc11, the same image CI
uses). This is the binary validated on the X5000 above. Use it if you
are deploying from the host with
scripts/install_mcpd_autostart.py <ip>:4322, which sets the
protection bits itself.

sha256 7a6f44b9edf4c9ab47c927d8baef73cb97565fefa1a84a2b1e61de1543977081

Input injection stays off until you run MCPd-Enable-Input yourself.

Thanks

input.* was contributed by @cpm1 in #2.

v1.2 — Guided setup and whole-file transfers

Choose a tag to compare

@derfsss derfsss released this 07 May 23:38
6f0f073

This release focuses on install ergonomics and whole-file transfer convenience.

Highlights

Guided setup wizard

amiga-fleet-mcp --init now walks you through every config block — [server], [paths], [targets.*] (one or more), and [defaults] — and writes a validated config.toml to the platform default location. The dict is round-tripped through the same Pydantic schema the server uses at startup, so a successful exit guarantees the config loads cleanly.

  • --force overwrites an existing config without prompting.
  • --non-interactive emits a server-only stub with no targets — useful for CI smoke.
  • Auto-detects existing qemu-runner / AmigaQemuTests checkouts at the conventional ~/Projects/<name> paths.
  • For real hardware targets, offers to wire up [channels.mcu] for the FTDI USB-TTL cable.

AGENTS_SETUP.md — install spec for AI agents

A new top-level AGENTS_SETUP.md is a deterministic, machine-followable spec for setting up amiga-fleet-mcp from a fresh clone. Point an AI agent at it and it can reach a validated install + working MCP-client wiring without further input. Contains:

  • Pre-condition checks (Python ≥ 3.11, repo presence, etc.).
  • Three config-generation paths (--init, --non-interactive, generate-directly with detection commands).
  • Per-platform detection commands (PowerShell Get-PnpDevice for FTDI, Test-Path for project checkouts, etc.).
  • Decision tree covering QEMU-only / real-hardware-only / mixed / test-orchestration scenarios.
  • Minimal config templates per scenario.
  • Four mandatory validation steps (--inspect, --list-tools, --health-check, --discover).
  • Error-message → root-cause table for the common failure modes.

Whole-file transfers — fs.upload / fs.download

Two new host-side MCP tools wrap fs.write_chunk / fs.read for "I have a host file, please move it" use cases. They hide all the chunking + base64 + zlib mechanics:

  • fs.upload(target, local_path, remote_path, ...) auto-chunks any size (default 24 MiB raw post-base64), auto-base64-encodes each chunk, auto-zlib-compresses when compression="auto" (default) and the result is at least 5% smaller. Skips pre-compressed .lha / .zip / .iso payloads automatically. No separate reassembly step on the target.
  • fs.download(target, remote_path, local_path, ...) auto-pages via repeated fs.read(offset, length) calls and auto-base64-decodes on receipt.
  • Both support resume=True (continues from the existing on-target / on-disk size) and verify=True (SHA-256 both sides via fs.hash + local hashlib walk; raises on mismatch).
  • Available as fine-grained tools fs_upload / fs_download and via the fs namespace dispatcher.

15 new unit tests cover single-chunk + multi-chunk + auto-zlib + resume + verify paths, plus a binary-clean round-trip with all 256 byte values to prove the auto-base64 path doesn't corrupt binary content.

Documentation

  • New "Helper paths ([paths])" subsection in USAGE.md mapping each [paths] key to the tool surface that consumes it (qemu_runner → qemu.* + QMP, amiga_qemu_tests → tests.*, qemu_binary → qemu.start). The previous un-commented <placeholder> form in config.example.toml made these look mandatory; they're optional, and now look optional.
  • Error messages from those tool surfaces now point at the new docs and at --init.
  • INSTALL.md venv command split into python3 / py -3 to match modern Linux/macOS defaults and the Windows launcher convention.
  • COMMANDS.md clarifies the byte-level (fs.read / fs.write / fs.write_chunk) vs whole-file (fs.upload / fs.download) boundary; fs.write_chunk was missing from the daemon-side RPC table.

Tool count

118 → 121 tools (+fs.upload, +fs.download, +1 namespace registration).

Build

MCPd binary is cross-compiled from the walkero/amigagccondocker:os4-gcc11 image (AmigaOS 4.1 FE SDK 54.16 + GCC 11.5). Asset attached: MCPd-1.2.

Verification

  • All 211 unit tests pass.
  • ruff clean.
  • CI green on the merge commit.
  • Binary $VER string and discovery banner both report 1.2.

🤖 Generated with Claude Code

MCP-AmigaOS4 1.1 — Out-of-band power control

Choose a tag to compare

@derfsss derfsss released this 04 May 17:56

MCP-AmigaOS4 1.1 — Out-of-band power control

Headline

New power.* namespace drives the Amiga's internal MCU debug
shell (X5000 P18 / A1222 P15) over an FTDI USB-TTL cable wired to
the host. Bypasses MCPd entirely — works regardless of AOS / MCPd
state.

power.on is the only software path to boot a fully-off X5000. A
full off-then-boot cycle (power.off → power.on → MCPd
reachable) takes ~80 s on real X5000.

New tools

Tool Shell Confirm
power.help help —
power.identify id —
power.identify_dates id date —
power.sensors v —
power.toggle_stream (watch_s optional) q yes
power.on p yes
power.off s yes
power.shell (escape hatch) (any) yes

The four destructive tools require confirm: true — same
accidental-fire guard as sys.cold_reboot.

Configuration

[targets.x5000-real.channels.mcu]
enabled = true
port    = "COM5"            # or /dev/ttyUSB1 on Linux/macOS
baud    = 38400             # MCU is fixed at 38400 8N1

Cable pinout, OS group permissions, and the serial.* lock-out
behaviour are documented in
INSTALL.md § power.*.

Tool count

  • 109 → 118 tools (+8 fine-grained power.* + 1 namespace
    dispatcher).

Internal

  • New host/src/amiga_fleet_mcp/transports/p18.py async pyserial
    driver.
  • New host/src/amiga_fleet_mcp/tools/power.py with channel-
    resolution + confirm-gate helpers; integrates with the existing
    serial.* capture registry (returns NotCapable if the same
    port is being captured).
  • 18 new unit tests under tests/unit/test_power.py exercising
    every confirm path + every channel-resolution edge case with a
    mock-patched transport.

Build environment

Reproducible via walkero/amigagccondocker:os4-gcc11: AmigaOS 4.1
FE SDK 54.16 with GCC 11.5. The exact SDK identifier is embedded
in the attached MCPd binary's $BUILT-WITH: cookie and surfaced
via proto.version / proto.capabilities build.sdk.

MCP-AmigaOS4 1.0 — Initial public release

Choose a tag to compare

@derfsss derfsss released this 04 May 13:00

Change log

1.0 — Initial public release

First public release of MCP-AmigaOS4.

Highlights

  • Two-piece architecture: amiga-fleet-mcp (Python MCP server,
    host-side) + MCPd (C daemon, runs on each AmigaOS 4 target).
    JSON-RPC 2.0 over framed TCP on port 4322.
  • More than 100 typed MCP tools across fs.*, exec.cmd,
    sys.*, wb.*, debug.*, qemu.*, fleet.*, tests.*,
    events.*, app.notify, notify.*, installer.*, and
    serial.*.
  • Multi-target fleets: fleet.run_on_all, fleet.barrier,
    fleet.quorum_run, fleet.relay, all with optional tag
    filters. Works across any mix of QEMU guests and real hardware
    in one session.
  • LAN-local discovery via UDP broadcast on port 4323
    (fleet.discover).
  • QEMU lifecycle + snapshots: qemu.start / stop / reset
    / screenshot / savevm / loadvm / list_snapshots /
    delete_snapshot.
  • Live debug: per-task IDebug snapshots + symbolicated stack
    traces on a real Amiga, plus whole-system register and memory
    access through QEMU's GDB stub on emulated targets.
  • Native AmigaOS 4.1 FE installer pipeline (installer.*):
    preflight, ISO mount, recursive copy, LHA extraction,
    Kicklayout patching, staged upload, post-install verification,
    and per-machine sequences.
  • Live X5000 hardware introspection: Cyrus MCU supervisor
    protocol over UART1 (sys.mcu_cmd), Freescale QorIQ CCSR reads
    (sys.read_ccsr), TLB1 dump (sys.tlb_dump), and (with care)
    arbitrary supervisor-mode physical-address reads
    (sys.read_pa).
  • Auto-start install (scripts/install_mcpd_autostart.py):
    drops MCPd into SYS:System/MCPd/, registers a watchdog, and
    patches S:Network-Startup. Boot-to-bind ≈ 11 s on an X5000.
  • Per-tool parameter defaults via a [defaults] block in
    config.toml (dest_volume, sources_dir, bootstrap_dir,
    machine, iso_filename). Set frequently-repeated values
    once and skip them in subsequent tool calls.

Supported targets

  • QEMU: Pegasos2 (validated end-to-end), AmigaOne, SAM460ex.
  • Real hardware: AmigaOne X5000 (validated, Freescale P5020
    / E5500). AmigaOne A1222 / Tabor and AmigaOne X1000 / Nemo are
    recognised by board detection but not yet exercised in CI.

Build environment

MCPd's cross-compile build is reproducible via the
walkero/amigagccondocker:os4-gcc11 Docker image: AmigaOS 4.1 FE
SDK 54.16 with GCC 11.5. The exact SDK identifier is embedded in
each MCPd binary and surfaced via proto.version /
proto.capabilities build.sdk.