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-reportwhen you register the server:claude mcp add autopilot -- <path>\Autopilot.Mcp.exe --crash-report. The parameter--no-crash-reportstill 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:
nullfor an optional argument now means “not given”. Before, a text argument received the wordnull. - Fixed: the tool list publishes whole-number arguments as
integer, notnumber. This coverspid,count,timeoutMs,maxWidth,pollIntervalMsandhwnd, 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 namesSource\Bridgein its setup steps, the same as an EXE inSource\McpServer\. - Fixed: the description of the
list_treetool. It said that each part of a path likeForm.A.B.Cis 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#3changes when an earlier unnamed component is freed. - Fixed: the Claude Code agent
autopilot-script-runnercan close dialogs. It now has all 14 tools.dismiss_dialogandset_keep_awakewere missing, so a script that opened a message box could not close it. - The AI briefing
AI-INSTRUCTIONS.mdis shorter and corrected. Each rule is stated once, and stale statements were fixed: for example, it said that keyboard shortcuts cannot be tested, butsend_keyspresses 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
- The source code is on GitHub. Download or clone version 3 from github.com/GabrielOnDelphi/Autopilot-for-Delphi: the bridge, the test client, the ready-to-run MCP server and the two demo apps.
Version 3.1
- New: the parameter
--no-crash-reportforAutopilot.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.Clientlets 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 withAssert. 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.
screenshottakes two new options:pathcaptures only one control, andmaxWidthscales the image down. Both cut the image cost. - Fixed:
clickin 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
clickruns with acountabove 1 and one click frees the control (for example, a button that closes and frees its form), the remaining clicks stop and the answer saysstoppedReason:"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.
screenshotnow 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_respondinginstead of a raw “could not open pipe” text.wait_forstops at the first-32098instead 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_pathwith the paths to use instead, andlist_treemarks a moved control with aparentfield. - Fixed trap: A click on a control bound to an action runs the action, the same as a mouse click:
OnExecutegets the action asSender,AutoCheckworks, and a standard action such asTFileExitno longer fails. - No more debugger stops on third-party components with unusual property types, such as DevExpress bar items, whose
Visibleis 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 duringlist_tree. The same holds when your app answers after the assistant has stopped waiting. set_propertycan enable a disabled control again. On a disabled control it now accepts the propertyEnabled(trueorfalse); every other property still answers-32003 control_disabled.- Named colors read back as
claRed, as documented: aTAlphaColor(the FMX color type) used to read back asRed. A color with no name reads as#AARRGGBB. - etc
- No compile step for the server.
Source\McpServer\Autopilot.Mcp.exenow 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_runningplus the steps to start the app or link the bridge in (for an Android target, also theadb forwardstep).attachalways carries the setup steps too. wait_forstops 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_dialogtells 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 saysvia:"WM_COMMAND", so the AI knows to list the dialogs again and check.