Repository navigation
Releases
Releases · ApocryphaRealm/MO2AgentControl
MO2 Agent Control 1.0.0
1.0.0 - 2026-10-24 - first public release
Added
- An MO2 plugin that opens a command channel on 127.0.0.1 only, with a new random token each session, written to
plugins\data\ApocryphaAgentControl\channel.jsonin the instance. - Reads:
info,profiles,mods,plugins,overwrite,executables,backups. Writes:select_profile,
set_mods,set_plugins,refresh,run(through MO2's virtual file system, returns the pid at once),call
(commands other MO2 plugins register) andmm(MO2 Modlist Manager's short form). - The in-use check: changes are refused while MO2's window is in front and the keyboard or mouse was used within the
last few minutes, unless the request carries aconfirmnote. Three settings: on/off (default on), minutes
(default 5), and an optional activity file from a tool that can tell a person's input from a script's. modlist.txt,plugins.txtandloadorder.txtare backed up before every command that changes the profile.- Follows MO2 2.5.2's own code where it touches it (MO2-REFERENCE.md): the profile switch goes through MO2's profile box
handler,runcloses the process handle MO2 hands over,set_pluginsrefuses the game's primary plugins (MO2 never
changes or lists them), and the settings' descriptions are translated even though MO2 reads them beforeinit(). mo2_ctl.py, a standalone client (Python 3.8+, standard library only; themo2-ctlcommand once installed), and
docs\PROTOCOL.md, the protocol reference with a minimal client example.tools\mo2-ctl.pyruns the same file for
anything that still calls the client at that path.mo2_mcp.py, a Model Context Protocol server (stdio; themo2-mcpcommand once installed) built on the same client:
twelve tools -info,profiles,mods,plugins,executables,overwrite,backups,set_mods,set_plugins,
select_profile,refresh,run. The plugin's in-use refusal reaches the agent word for word as the tool's error,
and every write tool has a requiredconfirmargument the server never fills in itself. MO2 not running, the plugin
missing or a stale channel file each give a plain error saying so. Logs to stderr;--log-level debuglogs every
request.docs\MCP.md: ready-to-paste configuration for Claude Desktop, Claude Code and Cursor, the tools, the errors.- A pip package,
mo2-agent-control(pyproject.toml; Python 3.10+, depends onmcp), holding the client and the
server as themo2-ctlandmo2-mcpcommands; the plugin itself is still copied into MO2. tests\test_mo2_ctl_and_mcp.py: the client and the server against the plugin's core behind a real loopback server
(45 checks, among them the refusal, the confirm note, the missing-channel errors and a full stdio round trip);
tools\mcp_call.py, which calls one tool through a real stdio session from the command line (to try the server before
adding it to a client, and for live tests); andtools\make_release.py, which builds the release zip and its notes
from the CHANGELOG intoout\.- The plugin's own texts (its description, menu entry, settings and status window) in English, Japanese, Korean,
Chinese, Russian, German, French, Spanish, Italian, Polish and Czech. Command replies, mo2-ctl's output and the MCP
tools' texts stay English: tools read them. The product name is "MO2 Agent Control" everywhere a user sees it - the
plugin list, the Tools menu entry and the status window in every language (a name is not translated), the READMEs,
the page, the pip package's description and the release notes.
Development history before 1.0.0
- 2026-10-24: built as "Apocrypha Agent Control" inside the project's own scripts (commits 4e62ff0 and e661987 of the
.MDrepository) so the project's agents could operate MO2 without screen control; proven on a scratch instance
(request e591), includingset_pluginswriting plugins.txt itself because MO2 writes it late. - 2026-10-24: made a public release (the project owner: "an actual mod with a mod page on Nexus and modding tools for
anyone who wants to use it"). Renamed MO2 Agent Control; the in-use check, which read the project's own presence
file, became a setting with Windows' idle clock as the default;owner_okbecameconfirm(the old name is still
read);call,backupsand the version / protocol fields ininfoandchannel.jsonadded; translations added.