Autopilot for Delphi – What’s New

The changes in Autopilot for Delphi, newest first.

Version 3.5

  • Crash reports are now opt-in. By default the MCP server never sends a crash report: it only saves it on your PC, to %TEMP%\Autopilot\bugreport Autopilot.Mcp.txt. To send it to us, add the parameter --crash-report when you register the server: claude mcp add autopilot -- <path>\Autopilot.Mcp.exe --crash-report. The parameter --no-crash-report still works and wins over --crash-report.
  • No more hint H1054 in your builds. The bridge no longer prints a hint each time your project compiles it.
  • Fixed: a call to a tool that does not exist answers the JSON-RPC error -32602, as the MCP specification asks. A call with no tool name, or with arguments that are not a JSON object, answers -32602 too. Before, these came back as a normal tool result with an error text, and arguments that were not an object ran the tool with every argument at its default.
  • Fixed: an argument of the wrong type, or a missing required argument, is refused. The answer is an error result that names the argument, for example Parameter "pid": expected a whole number in the Integer range, got "abc". Before, the server could run the tool with a wrong or empty value and say nothing.
  • Fixed: null for an optional argument now means “not given”. Before, a text argument received the word null.
  • Fixed: the tool list publishes whole-number arguments as integer, not number. This covers pid, count, timeoutMs, maxWidth, pollIntervalMs and hwnd, so an AI knows not to send a value like 1.5.
  • Fixed: a request line that is not valid UTF-8 answers the JSON-RPC parse error -32700. Before, the server replaced the bad bytes and ran the request with the changed text.
  • Fixed, in an MCP server built with Delphi 11 or 12: a number where the protocol expects a text (the method name or the tool name) is refused, not read as text.
  • Fixed: enumeration and record arguments, which no tool uses yet. The schema now lists the allowed names of an enumeration, and an unknown name is refused instead of becoming the first value. An argument of a kind the server does not handle, such as a record, now fails in the server’s own tests instead of being published as a string and then ignored.

Version 3.1.3

  • The MCP server is now built from its source. The repository holds the source of Autopilot.Mcp.exe, not the EXE. Give your AI the install prompt: it builds the EXE and registers it. With Delphi Community Edition, which cannot compile from the command line, the AI asks you to build it once in Delphi (Source\McpServer\Autopilot.Mcp.dproj, Release, Win32). The steps: How to install it.
  • Fixed: the MCP server finds the bridge folder when it runs from its build folder. An EXE in Source\McpServer\Win32_<config>\ now names Source\Bridge in its setup steps, the same as an EXE in Source\McpServer\.
  • Fixed: the description of the list_tree tool. It said that each part of a path like Form.A.B.C is a direct child of the part before it. It now says what the bridge does: each part is owned by the part before it, and a path the owner tree cannot resolve is tried again through the visual parents. It also warns that the number in a name like @TButton#3 changes when an earlier unnamed component is freed.
  • Fixed: the Claude Code agent autopilot-script-runner can close dialogs. It now has all 14 tools. dismiss_dialog and set_keep_awake were missing, so a script that opened a message box could not close it.
  • The AI briefing AI-INSTRUCTIONS.md is shorter and corrected. Each rule is stated once, and stale statements were fixed: for example, it said that keyboard shortcuts cannot be tested, but send_keys presses them.

Version 3.1.2

  • The source of the MCP server is in the repository (Source\McpServer\), and it builds with or without madExcept.

Version 3.1.1

Version 3.1

  • New: the parameter --no-crash-report for Autopilot.Mcp.exe. With it, the MCP server never sends a crash report: it only saves it on your PC, to %TEMP%\Autopilot\bugreport Autopilot.Mcp.txt. Add it when you register the server: claude mcp add autopilot -- <path>\Autopilot.Mcp.exe --no-crash-report.

Version 3.0

  • New page: Security and privacy. The short answers for a Compliance or Risk team: what Autopilot can read, where the data goes, and how to keep it to test builds, test data and one project.
  • New: repeatable GUI tests in DUnitX, with no AI. The new unit Autopilot.Client lets a DUnitX test (or any Delphi program) start your app, click, type, read labels and properties, close dialogs and take screenshots, then check the result with Assert. No AI and no MCP server in the loop, and about 0.8 ms per command. Your app ends together with the test EXE, even when the test run is killed. Two demo test projects, one for the VCL demo and one for the FMX demo, show the setup. Their runner returns exit code 0 when every test passed and 1 when one failed, and writes an NUnit XML file, so a build agent can run it as a step. For Windows targets. How to use it: Automated GUI testing in Delphi.
  • Fixed: a screenshot of a minimized VCL form now shows its labels and speed buttons. A minimized form paints only its icon, so the controls without a window of their own were missing from the image. Now they are there, the image has the form’s normal (restored) size, and the form stays minimized.

Version 2.1

  • New tool send_keys. The AI can now press keys and shortcuts, or type text, into a control of your app. The same events and shortcuts run as for a user’s key press. It never types into other programs, and your app does not need to be in front.
  • Cheaper screenshots. screenshot takes two new options: path captures only one control, and maxWidth scales the image down. Both cut the image cost.
  • Fixed: click in message mode on a minimized form. On a minimized VCL form the click never ran; now it does.
  • Fixed: Enter on an inactive form no longer clicks a button that had the focus earlier.

Version 2.0 and earlier

  • Fixed trap: A click that frees its own control stops cleanly. When click runs with a count above 1 and one click frees the control (for example, a button that closes and frees its form), the remaining clicks stop and the answer says stoppedReason:"freed". Before, the bridge clicked the freed control again.
  • A new home for the documentation. Everything about Autopilot now lives on this website: the main page, the technical details, and this list of changes.
  • Screenshots arrive as a picture. screenshot now returns the PNG as an image your assistant can look at, plus a short text part with the form name, width and height. Before, the picture came as a long base64 text, and the AI never saw it as an image.
  • A frozen or busy app gives a clear answer. When the app is stopped on a breakpoint or hung, so that its connection stays busy, the tools now answer error -32098 target_not_responding instead of a raw “could not open pipe” text. wait_for stops at the first -32098 instead of polling on until its deadline.
  • A control moved onto another form is found through the form that shows it. A panel created on one form and placed on a tab sheet of another can now be reached as MainForm.tabFixEnters.Container. If two controls fit such a path, the answer is -32002 ambiguous_path with the paths to use instead, and list_tree marks a moved control with a parent field.
  • Fixed trap: A click on a control bound to an action runs the action, the same as a mouse click: OnExecute gets the action as Sender, AutoCheck works, and a standard action such as TFileExit no longer fails.
  • No more debugger stops on third-party components with unusual property types, such as DevExpress bar items, whose Visible is an enumeration. The bridge now checks a property’s type before it reads or writes it, so it raises no hidden exception, and a debugger that stops on exceptions no longer halts your app during list_tree. The same holds when your app answers after the assistant has stopped waiting.
  • set_property can enable a disabled control again. On a disabled control it now accepts the property Enabled (true or false); every other property still answers -32003 control_disabled.
  • Named colors read back as claRed, as documented: a TAlphaColor (the FMX color type) used to read back as Red. A color with no name reads as #AARRGGBB.
  • etc
  • No compile step for the server. Source\McpServer\Autopilot.Mcp.exe now comes ready to run in the download: register it with your assistant and go. You compile only the demo and your own app.
  • Lighter on every session. The text the server gives your AI at the start of every session shrank from 1,397 to 857 characters (39% less). The bridge setup steps used to ride along in every session; now the AI gets them only when it needs them. Want the rest too? Register the server only where you use it – see step 1 of the Quick start in the README. On my machine that took 3,604 characters out of every session that does not drive a Delphi app.
  • A clear answer when your app is not running. Every tool now answers with error -32099 target_not_running plus the steps to start the app or link the bridge in (for an Android target, also the adb forward step). attach always carries the setup steps too.
  • wait_for stops at once when no app is running, instead of waiting out its whole timeout.
  • Plain-ASCII tool descriptions, so no AI host shows stray characters where a dash or an arrow was meant.
  • dismiss_dialog tells you when it cannot confirm a click. When it had to send the click by command id instead of pressing the button itself, the answer says via:"WM_COMMAND", so the AI knows to list the dialogs again and check.
Scroll to Top