Repository navigation
Releases: derfsss/MCP-AmigaOS4
Release list
2.0 — Tracked jobs, sandboxed commands, and the mcp 2 SDK
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-outexec_cmdreturnsstate: "running"with itsjob_id.- Job priority defaults to -2 and is capped at 0 (
priority,[defaults] exec_priority). Workers run at +1. exec_cmd sandbox=truereturns asandboxblock withend_reasonand the trap report.exec_kill force=trueneeds SandboxVM 1.1.input.keyhandles F11/F12;input.scrollsends native AmigaOS 4 wheel events.- Board detection uses
GetMachineInfo;qemu.stopalways flushes the guest's filesystem. - qemu-runner is a package dependency (v1.3.1, MIT).
gitmust 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 withLhA x MCPd-2.0.lha, then runMCPd-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.
v1.3 — Sandboxed iteration, screen capture, and input injection
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.capabilitiesreportsinput.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] enabledflag 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-sidediskimage-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
v1.2 — Guided setup and whole-file transfers
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.
--forceoverwrites an existing config without prompting.--non-interactiveemits a server-only stub with no targets — useful for CI smoke.- Auto-detects existing
qemu-runner/AmigaQemuTestscheckouts 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-PnpDevicefor FTDI,Test-Pathfor 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 whencompression="auto"(default) and the result is at least 5% smaller. Skips pre-compressed.lha/.zip/.isopayloads automatically. No separate reassembly step on the target.fs.download(target, remote_path, local_path, ...)auto-pages via repeatedfs.read(offset, length)calls and auto-base64-decodes on receipt.- Both support
resume=True(continues from the existing on-target / on-disk size) andverify=True(SHA-256 both sides viafs.hash+ local hashlib walk; raises on mismatch). - Available as fine-grained tools
fs_upload/fs_downloadand via thefsnamespace 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 inUSAGE.mdmapping 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 inconfig.example.tomlmade 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.mdvenv command split intopython3/py -3to match modern Linux/macOS defaults and the Windows launcher convention.COMMANDS.mdclarifies the byte-level (fs.read/fs.write/fs.write_chunk) vs whole-file (fs.upload/fs.download) boundary;fs.write_chunkwas 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.
ruffclean.- CI green on the merge commit.
- Binary
$VERstring and discovery banner both report1.2.
🤖 Generated with Claude Code
MCP-AmigaOS4 1.1 — Out-of-band power control
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 8N1Cable 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.pyasync pyserial
driver. - New
host/src/amiga_fleet_mcp/tools/power.pywith channel-
resolution + confirm-gate helpers; integrates with the existing
serial.*capture registry (returnsNotCapableif the same
port is being captured). - 18 new unit tests under
tests/unit/test_power.pyexercising
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
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 intoSYS:System/MCPd/, registers a watchdog, and
patchesS: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.