Repository navigation
Releases: mika76/vb6-mcp
Release list
vb6-mcp 1.2.0
Two additions to the running-program tools. Only vb6mcp.exe changed: the add-in is the same build as in 1.1.0 and still reports 1.1.0.
Upgrading: run install.ps1 from the new package. Restart a running --stay watchdog so it runs the new build too.
app_treelists the items of list and combo boxes:itemCount, the first 20items, andselected. For a program in the IDE they're read through the add-in, because Windows blocks list messages from the non-elevated server. An event log kept in a ListBox used to show astext: "".app_screenshottakesregion(client coordinates) orcontrol(a handle fromapp_tree) and returns only that part, at full resolution, withcropfor mapping image positions back toapp_mousecoordinates. Checking a few pixels no longer means reading the whole form.
vb6-mcp 1.1.2
A fix for the shell guard. Only vb6mcp.exe changed: the add-in is the same build as in 1.1.0 and still reports 1.1.0.
Upgrading: run install.ps1 from the new package. Restart a running --stay watchdog to get the fix. Claude Code runs the hook binary afresh on every call, so the new rules apply as soon as it is installed — but hook configuration is read when a session starts, so a session that opened before the hook was registered stays unguarded until it is restarted.
Shell guard
Two shapes an agent reaches for naturally got past ShellPolicy, both found by replaying a real session's commands through vb6mcp.exe hook.
- A build whose executable sits in a variable and whose switch is an array element, as PowerShell usually writes it (
Start-Process -FilePath $exe -ArgumentList '/make','App.vbp', or& $exe /make App.vbp): the old rule wantedvb6and/makenext to each other. A standalone/makenow counts when the command also names a project file or VB6, so aStart-Processthat merely mentions a.vbp, and a path that happens to contain "make", stay allowed. unix2dos/dos2unix/todos/fromdos/flipon a VB6 source, which rewrite the file in place. A.vbprewritten with LF leaves VB6 unable to parse it: the project loses its references and the build fails with a misleading "User-defined type not defined" in an unrelated.bas. Only at a command position, because "flip" is an ordinary word.
vb6-mcp 1.1.1
A fix for the watchdog tray. Only vb6mcp.exe changed: the add-in is the same build as in 1.1.0 and still reports 1.1.0.
Upgrading: run install.ps1 from the new package. Restart a running --stay watchdog to get the fix.
- Watchdog tray: Restart as administrator no longer leaves a console window open, and the log no longer calls the restart "stopped from the tray". The restart is now verified live.
vb6-mcp 1.1.0
New projects, VB6 without administrator rights, and a watchdog you can see. One new tool (project_new, 95 in all). Details per tool: docs/tools.md.
Upgrading: run install.ps1 from the new package (roots are kept), then restart VB6 and Claude Code. The add-in reports version 1.1.0 and has two new verbs (PRJNEW, PRJSAVEAS); its ProgID, CLSIDs and the existing wire format are unchanged. A running --stay watchdog keeps the old version until you restart it.
New
project_newcreates an EXE, ActiveX EXE, ActiveX DLL or ActiveX control project at a new.vbppath under the roots, also in an IDE with no project open.project_savetakespathfor a project that was never saved, such as the New Project chooser'sProject1(spike 43). VB writes a new project's.vbpwithout its never-saved components, and still counts it as saved. So each component is saved first, and the server checks that the.vbplists them all.- VB6 without elevation is supported and tested (spike 41): everything works except registering components, and the README's "Elevated or not?" table says what changes.
- Registration without an elevated VB6:
com_register/com_unregisterrun through an elevated VB6's add-in, else the elevated watchdog (no IDE needed), else withelevate: truethrough a UAC prompt you answer. Otherwise they refuse before running anything.build_makehands a build to an elevated watchdog when the running VB6 isn't elevated, so ActiveX builds still register. - Watchdog tray icon: a "VB" tile in the notification area, with a shield when the watchdog runs as administrator. Its menu has Open log, Restart as administrator and Stop watchdog;
--no-trayleaves the icon out.
Fewer surprises
- Slow vs dead: during calls longer than 5 s the server sends a progress heartbeat every 10 s, and the installers set Claude Code's idle timeout to 2 minutes. A frozen or dead server now shows up as an error within 2 minutes instead of a 30-minute wait (spike 42). After
server_restart, new calls are refused at once with "restarting". - A non-elevated VB6's startup dialogs (another add-in's error before ours loads) are answered by the server itself.
Other agents
- Tested in GitHub Copilot CLI and OpenCode (spike 40): all tools load. In clients other than Claude Code,
debug_eval's approval for side effects now asks through MCP elicitation, and is refused where the client can't ask. Before, such a client could run a side-effect expression with no prompt. The README lists what works where.
Docs
- README: requirements as needed, tested on, and known untested limits (VB6 in another language, DBCS code pages); a screenshot of the tray icon.
vb6-mcp 1.0.0
The first public release. Nothing new to learn compared with 0.2.0: the same 94 tools, with the bugs and surprises found in six more benchmark tasks (T13-T18: a change shared by a DLL and two EXEs, debugging a reported wrong total, binary compatibility, a cause hidden in a compiled DLL, breakpoints, stepping) and in real use fixed. Every fix of the last round was re-tested in a live IDE. Details per tool: docs/tools.md; what's next: docs/roadmap.md.
Upgrading: run install.ps1 from the new package (roots are kept), then restart VB6 and Claude Code. The add-in reports version 1.0.0; its ProgID, CLSIDs and the wire protocol are unchanged.
Safety
project_saverefuses code that no tool edited (stray keystrokes in a code window, someone else's edit) and shows the diff;outside_edits: truesaves it anyway.syntax_checkreports such edits too.app_keysnever types into the IDE: withoutcontrol, keys go to the program's focused control or its form, not to the Immediate window or a code pane.app_treemarks controls the user can't see (clipped: outside a container's visible area, or less than 4 pixels showing), andapp_clickrefuses them unlessforce: true.run_startwarns about DLLs the project's controls and references need that aren't installed (missingDlls). A missing delay-loaded DLL ends the IDE process the moment the program uses it, unsaved work included (spike 39).com_diagnosenames the missing chain too.- The hook also catches the agent ending VB6 through pipelines,
wmic, CIM and.Kill(): a non-elevated process can end the elevated IDE (spike 38).
Fewer surprises
server_restarthands the session's IDEs and the runs it started to the next server, soide_quitandrun_enddon't ask foride_claimorforceafterwards.- Dialogs:
ide_launchandproject_openwait for the follow-up dialogs VB shows after loading and report them;app_waitstops as soon as a dialog blocks the program;batch_runstops at a dialog even withcontinue_on_error;ide_dialog_respondpresses once more when the first click didn't take (retried). - The program's own InputBox can be typed into (
app_set_text/app_keyswithwindownaming it). app_clicksays when nothing changed after the click (changed: false); lists of a program in the IDE are read through the add-in.app_screenshotreturnsclientOriginandimageScale, so image positions convert toapp_mousecoordinates.app_keys: a form with only Labels takes the keys itself;controlmay be a form;real_inputtypes characters as their keys, soKeyDownsees the realKeyCode.- Editing: an edit with
""no longer reports an error after it was applied; a failed edit says what state the module is in; a fresh module's trailing line is addressable. debug_localssurvives private user-defined types;debug_localsanddebug_evalclose the compile error their own line caused.- Step results say where they stopped (
at);bp_toggleworks while the program runs. app_set_textindexfollows reading order;app_treeshows each text box'sindexand flags a Locked one (readOnly).app_selectwithoutcontrolpicks the only list or combo box (or the only one with the item).- Missing required arguments are named all at once, with the right names.
markedChangedByRunnames listed forms whose designer is open (designerOpen).
Shorter results
symbol_refsreturns each file's hash, so edits need nofile_readfirst.form_add_controlwithout a position counts overlaps instead of listing them.com_searchmatches at word starts (match: substringfor the old way) and marks VB's.ocacache files.com_describelists the methods of VB-built classes withoutinclude_hidden, and leaves out the IUnknown/IDispatch methods even with it.
Development
- Benchmarks T13-T18 with their fixtures, generators, replays and scoring (
bench/,docs/benchmarks).
Install: download vb6mcp-1.0.0.zip, unpack it, and run install.ps1 as yourself (one UAC prompt). See the README.