Claude Pascal MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_compiler_infoA | Detect available Pascal compilers and return their details. Checks for Free Pascal (fpc), Delphi 32-bit (dcc32), and Delphi 64-bit (dcc64) on the system PATH and in common installation directories. Returns a summary of all compilers found with name, version, and path. Side effect: also emits an MCP |
| compile_pascalA | Compile Pascal source code and return compiler output. Use this to check if code compiles without running it. Returns compiler messages including any errors or warnings. Args: source_code: The complete Pascal source code to compile. Should include the program/unit header (e.g., 'program Hello;'). compiler: Which compiler to use. Can be a type name ('fpc', 'dcc32', 'dcc64') or a full path to a specific compiler executable (e.g., 'C:\Program Files (x86)\Embarcadero\Studio\37.0\bin\dcc64.exe'). If not specified, auto-selects the best available compiler. |
| run_pascalA | Compile and execute Pascal source code, returning the program output. Compiles the source code, runs the resulting executable, and returns both compilation messages and program output (stdout/stderr). Args: source_code: The complete Pascal source code to compile and run. Should be a program (not a unit) with a begin..end block. compiler: Which compiler to use. Can be a type name ('fpc', 'dcc32', 'dcc64') or a full path to a specific compiler executable (e.g., 'C:\Program Files (x86)\Embarcadero\Studio\37.0\bin\dcc64.exe'). If not specified, auto-selects the best available compiler. stdin_input: Optional text input to send to the program's stdin. Useful for programs that read from input. |
| check_syntaxA | Check Pascal syntax without producing an executable. Performs a syntax-only check (no linking). Faster than a full compile and useful for quickly validating code structure. Args: source_code: The Pascal source code to check. compiler: Which compiler to use. Can be a type name ('fpc', 'dcc32', 'dcc64') or a full path to a specific compiler executable. If not specified, auto-selects the best available compiler. |
| parse_formA | Parse a Delphi/Lazarus form file and return its component structure. Reads .dfm (VCL), .fmx (FireMonkey), or .lfm (Lazarus) form files and returns a structured view of all components, their properties, positions, sizes, and event handlers. Args: file_path: Absolute path to the .dfm, .fmx, or .lfm file. output_format: How to format the output: - 'tree': Indented component tree with key properties (default) - 'summary': High-level overview with component counts and events - 'flat': Flat list of all components with position/size info |
| screenshot_appA | Take a screenshot of a running application window. Finds a window by its title (or partial title) and captures just that window as a PNG image without stealing focus or disrupting the user's desktop. Use list_app_windows first if you need to find the exact title. Args: window_title: Full or partial window title to capture (case-insensitive). For example: 'Hello World App' or just 'Hello'. |
| list_app_windowsA | List visible application windows on the desktop. Use this to find the exact title of a window before taking a screenshot with screenshot_app. Args: filter_text: Optional text to filter window titles (case-insensitive). Leave empty to list all visible windows. |
| launch_appA | Compile Pascal source and launch the GUI application in background. Use this for GUI applications (VCL/FMX) that need to stay running so you can see and interact with them. Unlike run_pascal, this does not wait for the program to finish — it launches and returns immediately. After launching, use the preview system (preview_start with "pascal-preview") to see the running application, or use screenshot_app to capture a screenshot. Args: source_code: The complete Pascal source code to compile and launch. Should be a GUI program (VCL/FMX) with forms. compiler: Which compiler to use. Can be a type name ('fpc', 'dcc32', 'dcc64') or a full path to a specific compiler executable. If not specified, auto-selects the best available compiler. |
| compile_delphi_projectA | Compile a Delphi project using proper templates (DPR + PAS + DFM). This is the ONLY correct way to build Delphi applications — do NOT use MSBuild, shell commands, or other build systems. This tool generates proper project structure and invokes the Delphi compiler (dcc32/dcc64) or Free Pascal directly. Args: project_name: Name for the project (e.g., 'HelloWorld'). form_caption: Title bar text for the main form (VCL only). components: JSON array of components. Each component is an object: [{"type": "TButton", "name": "btnHello", "caption": "Say Hello", "left": 130, "top": 120, "width": 140, "height": 45, "event": "btnHelloClick"}] Supported types: TButton, TEdit, TLabel, TMemo. events: JSON array of event handlers: [{"name": "btnHelloClick", "body": "ShowMessage('Hello!');"}] compiler: Which compiler to use ('fpc', 'dcc32', 'dcc64', or full path). output_dir: Optional directory for output files. If not specified, uses a temp directory. project_type: One of: 'vcl' — Windows-only desktop GUI app (Vcl.Forms, .dfm). 'fmx' — FireMonkey cross-platform GUI app (FMX.Forms, .fmx). Emits a .dproj wired for Win32 + Win64 + Android64 so build_dproj can cross-compile to mobile without manual editing. Use this when the user wants Android/iOS/macOS, or just "a mobile-ready app". 'console' — text-mode program (no form). 'fpc' — Free Pascal program (cross-platform but no GUI). program_body: For console/fpc projects, the main program code. |
| build_dprojA | Build an existing Delphi .dproj project file using MSBuild + rsvars.bat. Use this for real-world multi-file Delphi projects (CuttlefishV2.dproj, etc.) — anything that already exists on disk with its own .dproj, .dpr, units, forms, search paths, conditional defines, and resources. Honours the project's full build configuration exactly as RAD Studio would, no template substitution. NOTE: compile_delphi_project is for generating a new throwaway project from a TButton/TEdit/TLabel/TMemo template. build_dproj is for building an existing real project. Use the right one. STAGING CLEAN (Android / iOS / macOS / Linux): Delphi's own MSBuild Clean/Rebuild targets do NOT fully clean staging-based build pipelines. They wipe DCU/.o files but leave the PAClient (Android) or PAServer (iOS/macOS/Linux) staging directory and the previous artifact in place. That causes the classic "I changed code/assets but the new APK/app didn't update" symptom. When platform is Android/iOS/macOS/Linux and target is Rebuild or Clean, this tool automatically deep-cleans the platform's intermediate and bin directories before invoking MSBuild. Pass deep_clean=False to disable, or deep_clean=True to force it. OUTPUT PATHS: this tool reads the .dproj's own DCC_ExeOutput / DCC_DcuOutput / DCC_BplOutput properties (resolved by MSBuild, honouring conditional PropertyGroups, $(Platform)/$(Config) substitution, base config inheritance, etc.) and uses those for both deep_clean and artifact resolution. So if your dproj points outputs at ..\bin$(Platform)$(Config) or anywhere else non-default, this tool follows. Safe guard: paths resolving outside the project tree (e.g. the shared C:\Users\Public...\Bpl\ system dir) are NEVER deep-cleaned; the trace will list them as "Skipped". PASERVER (iOS / macOS / Linux): cross-builds for these platforms run through PAServer on a remote Mac or Linux host. Pass remote_profile with the name of a Connection Profile already configured in RAD Studio (Tools → Options → Environment Options → Connection Profile Manager). PAServer must be running on the target host. If the .dproj already pins a default profile you can omit remote_profile, but explicit is safer. This tool does not create profiles or store credentials — the profile must already exist locally on the dev machine. Args: dproj_path: Absolute path to the .dproj file (e.g. r"D:\projects\cuttlefishmobile\src\CuttlefishV2.dproj"). config: Build config — Debug, Release, etc. (default Debug). platform: Target platform — Win32, Win64, Android64, iOSDevice64, iOSSimARM64, OSX64, OSXARM64, Linux64 (default Win32). For Cuttlefish always use Win32 unless explicitly building for mobile. target: MSBuild target — Build (default), Rebuild (clean+build), or Clean. studio_root: Optional Studio install (e.g. r"C:\Program Files (x86)\Embarcadero\Studio\37.0"). Defaults to the highest-version install detected. timeout: Seconds before the build is killed (default 600). Remote iOS/macOS/Linux builds can be slow on first run — bump to 1800+ if PAServer needs to re-deploy a large bundle. deep_clean: Nuke the platform's intermediate + bin dirs before building. None (default) auto-enables for Android/iOS/macOS/Linux Rebuild or Clean. True forces it on for any platform. False disables it. remote_profile: Name of the RAD Studio Connection Profile for PAServer. Required for iOS/macOS/Linux unless the .dproj pins a default. Ignored for Win32/Win64/Android. Example: "MyMacMini". If omitted on a PAServer platform, the tool auto-selects from registered Connection Profiles when exactly one is compatible — multiple matches force an explicit choice for safety (so a Linux Debug build can't accidentally hit a "production" PAServer host). deploy: Chain MSBuild's /t:Deploy after the requested target. Required to produce a packaged artifact on Android (APK), iOS (.app bundle + codesign), macOS (.app), and Linux (binary staged on remote). None (default) auto-enables for those platforms whenever target isn't Clean. False keeps the legacy "compile and link only" behaviour. Ignored for Win32/Win64. synthesize_ios_manifest: For iOS targets only. The IDE writes 4 DeployFile entries per Config × Platform on first deploy (Entitlements, InfoPList, LaunchScreen, ProjectOutput). Command- line Deploy can't synthesize them, so projects never IDE-deployed to iOS fail with cryptic "codesign … No such file" errors. Setting this True auto-adds the missing entries to the .dproj before Deploy runs, after writing a timestamped .bak backup. Default False — the build trace will report what's missing without mutating anything. Use check_ios_deploy to inspect without building. |
| check_ios_deployA | Check whether a .dproj has the iOS DeployFile entries required for Deploy. PAServer's iOS Deploy target reads the dproj's section to decide what to ship to the Mac for codesign + .app assembly. The IDE writes 4 entries per Config × Platform on first deploy: ProjectiOSEntitlements, ProjectiOSInfoPList, ProjectiOSLaunchScreen, ProjectOutput. If they're missing — common when a project was renamed or never IDE-deployed to a given target — Deploy ships nothing and codesign fails with ".app: No such file or directory". This tool only INSPECTS; it never mutates. Use synthesize_ios_manifest=True on build_dproj to add missing entries (with .bak backup). Args: dproj_path: Absolute path to the .dproj. config: Build configuration to check (Debug, Release, etc.). platform: iOS platform: iOSDevice64 or iOSSimARM64. |
| paserver_infoA | Read local info about a PAServer Connection Profile (paclient -l). Pure local read — does NOT touch the network. Returns the host, port, platform tag, and sysroot path the IDE has stored for this profile. The profile name must already exist in HKCU registry (use list_remote_profiles to enumerate). paclient itself doesn't error on unknown names — it returns synthesised defaults — so we validate against the registry first to catch typos with a clear error. Args: profile: Connection Profile name (e.g. "MACBOOK"). Case-sensitive. studio_root: Optional Studio install root. Defaults to the highest-version detected. |
| paserver_check_connectionA | Two-stage reachability check for a PAServer Connection Profile. Runs:
Doesn't perform a full PAServer protocol handshake (that requires the paclient password and isn't necessary to answer "is the host even reachable"). For full validation, run any file-transfer tool against the profile — paclient will surface protocol-level errors. Use this as the first pre-flight step before iOS/macOS/Linux builds or before paserver_get/paserver_put. Answers ~90% of "why is my PAServer build failing" questions immediately. Args: profile: Connection Profile name (e.g. "MACBOOK"). timeout: TCP connect timeout in seconds. Default 3. studio_root: Optional Studio install root. |
| paserver_scratch_dirA | Return PAServer's per-profile scratch directory path on the remote host. PAServer in restricted mode (the default) only allows file ops inside /Users//PAServer/scratch-dir/-/. Use this helper to get the right path before calling paserver_put / paserver_get, or to clean up after a build. Args: profile: Connection Profile name (e.g. "MACBOOK"). remote_user: Unix username running paserver on the Mac/Linux host. You can find this by SSHing to the host once, or check the PAServer terminal output for the home dir. |
| paserver_getA | Pull a file or directory from the PAServer remote host to this box. PREFER passing ssh_user: that routes the transfer over SSH (tar stream),
which is the reliable path. PAClient 37.1's own Without ssh_user it falls back to Args:
profile: Connection Profile name (resolves the Mac host).
remote_path: Path on the Mac — either absolute, or relative to the
PAServer scratch root (e.g. "CuttlefishV2.app" or
"logs/crash.txt"). Relative paths are resolved against the
scratch dir for the SSH transport.
local_dir: Local directory to extract into. Created if missing.
ssh_user: Mac SSH login (e.g. "andrevanzuydam"). Enables the
reliable SSH transport. Not stored in PAServer profiles, so
you supply it. Requires one-time |
| paserver_putA | Push a file or directory from this box to the PAServer remote host. Wraps Args: profile: Connection Profile name. local_path: File or directory on this Windows box. May contain wildcards. remote_dir: Destination directory on the PAServer host. timeout: Seconds before the transfer is killed (default 300). studio_root: Optional Studio install root. |
| mac_ssh_checkA | Test SSH connectivity + key auth to the remote Mac. Runs Args: host: Mac hostname or IP (use the same address as the PAServer profile's Host field — see paserver_info). user: Mac user account. key_path: Optional explicit SSH private key path. |
| mac_ssh_runA | Run an arbitrary command on the remote Mac via SSH. The building block for any Mac-side operation that paclient.exe doesn't cover (xcrun simctl, devicectl, log inspection, log streaming, etc.). Most callers should prefer the sim_* tools that wrap simctl directly; use this when you need something specific that doesn't have a wrapper. Args: host: Mac hostname or IP. user: Mac user account. command: Single command line. Quote internal spaces yourself. key_path: Optional explicit SSH private key path. timeout: Seconds before killed. |
| sim_listA | List iOS simulators on the Mac (xcrun simctl list devices --json). Returns the raw simctl JSON so the caller can pick UDIDs / runtime versions / names. Pass booted_only=True to filter to currently-running. |
| sim_bootB | Boot a simulator by UDID (xcrun simctl boot). |
| sim_shutdownB | Shut down a simulator. Pass udid='booted' to stop all running ones. |
| sim_installA | Install a .app bundle on a simulator (xcrun simctl install). app_path is the path on the Mac. After a build_dproj for iOSSimARM64 with deploy chained, the .app lives in PAServer's scratch dir — use paserver_scratch_dir + the project name to compose it. |
| sim_launchC | Launch an installed app by bundle identifier (xcrun simctl launch). |
| sim_terminateC | Terminate a running app by bundle identifier. |
| sim_uninstallC | Uninstall an app from a simulator. |
| sim_open_urlC | Open a URL in the simulator (deep link or web URL). |
| sim_screenshotA | Capture a simulator screenshot and return it as an Image (parity with adb_screenshot). Pipes through base64 over SSH so we don't need a separate scp step. Returns [Image, description] on success, or an error string on failure. |
| ios_codesignA | Codesign an iOS/macOS .app bundle on the remote Mac (paclient -c). The .app must already exist on the Mac (typically in PAServer's scratch dir after build_dproj + Deploy ran). The certificate is whatever's in the Mac's keychain — pass the common name (e.g. "iPhone Developer: Jane Doe (ABCDE12345)") or "-" for ad-hoc dash-signing (development use only; won't install on real devices). Notarization options need Apple Developer Program membership + notarytool setup on the Mac. Args: profile: Connection Profile name. app_path: Remote path to the .app bundle. certificate: Identity in the Mac's keychain, or "-" for ad-hoc. entitlement: Optional remote path to entitlements.plist. notarize: Apply notarization (requires entitlement). timeout: Seconds before killed. studio_root: Optional Studio install root. |
| ios_create_ipaA | Package a signed .app into an .ipa on the remote Mac (paclient -i). The .app must be codesigned first (ios_codesign). The provisioning profile must exist on the Mac and match the cert + bundle ID. IPA assembly runs entirely on the Mac via xcrun. Args: profile: Connection Profile name. app_path: Remote path to the signed .app. out_path: Remote path where the .ipa should be written. certificate: Same identity used for codesign. provisioning_profile: Remote path to a .mobileprovision file. ipa_type: 1 = ad-hoc / dev distribution, 2 = App Store. Default 1. timeout: Seconds before killed (default 600). studio_root: Optional Studio install root. |
| ios_install_ipaA | Install an .ipa on an iOS device attached to the Mac (paclient -ii). The iOS device must be physically connected to the Mac, trusted, and
listed by xcrun devicectl. Find the UDID via Note: this is for device installation. Simulator installation needs xcrun simctl install which paclient does NOT wrap — that's tracked under issue #5 (sim_* tools). Args: profile: Connection Profile name. ipa_path: Remote path to the .ipa on the Mac. device_udid: Target iOS device UDID. timeout: Seconds before killed. studio_root: Optional Studio install root. |
| paserver_removeA | Delete a file or directory on the PAServer remote host. Wraps Args: profile: Connection Profile name. remote_path: Path on the PAServer host. Wildcards allowed. timeout: Seconds before the operation is killed (default 60). studio_root: Optional Studio install root. |
| list_remote_profilesA | List PAServer Connection Profiles registered in this RAD Studio install. These profiles drive iOS / macOS / Linux builds via PAServer on a remote Mac or Linux host. build_dproj uses them automatically (it picks the first compatible profile for the target platform), but listing them is useful when troubleshooting a "Missing profile name" or "No remote profile" error from MSBuild Deploy. Each profile lists:
Args: studio_root: Optional RAD Studio install root (e.g. r"C:\Program Files (x86)\Embarcadero\Studio\37.0"). Defaults to the highest-version install detected. |
| setup_fpcA | Download and install Free Pascal Compiler (FPC). Only use this when no Pascal compiler is available on the system. Downloads FPC 3.2.2 from the official SourceForge mirror and performs a silent installation. May require administrator privileges. Args: install_dir: Where to install FPC. Defaults to C:\FPC\3.2.2. Avoid paths with spaces. |
| focus_ideA | Restore the Delphi/Lazarus IDE window and bring it to the foreground. Finds a running RAD Studio / Delphi / Lazarus IDE and:
This is the precondition for many IDE-driven workflows: observe_ide's screenshot is more reliable on a foreground window (the Windows Graphics Capture path can't reach GPU-composited Skia panels behind other windows), and any UI automation needs the window visible. Call this first whenever you're about to interact with the IDE. Returns a one-line confirmation with the window title, or a clear error if no IDE is running. |
| observe_ideA | Observe the Delphi/Lazarus IDE and return a screenshot plus project info. Finds a running RAD Studio, Delphi, or Lazarus IDE window, captures a screenshot of it, and optionally scans the project directory for source files. Claude reads the screenshot to spot compiler errors, warnings, or other messages in the IDE's Messages pane. Args: project_dir: Optional path to the project directory on disk. If provided, also returns a list of project source files. |
| read_ide_errorsA | Read source code context around compiler error locations. After spotting errors in an IDE screenshot, call this tool with the parsed error locations to get the source code around each error. Args: project_dir: Path to the project directory on disk. errors: JSON array of error locations. Each entry is an object with 'file' and 'line' keys, e.g.: [{"file": "Unit1.pas", "line": 42}, {"file": "MainForm.pas", "line": 15}] |
| list_project_filesA | List all source files in a Delphi/Lazarus project directory. Scans the directory for Pascal source files (.pas, .dpr, .lpr), form files (.dfm, .fmx, .lfm), and project files (.dproj, .lpi). Also parses .dproj files for unit references, search paths, and build configuration. Args: project_dir: Path to the project directory on disk. |
| app_clickA | Click on a Windows application window at the given coordinates. Coordinates use screenshot pixels — take a screenshot_app first to identify where to click, then use those pixel coordinates here. Uses PostMessage with automatic child window targeting so clicks reach the correct control (buttons, edits, etc.). Args: window_title: Full or partial window title (case-insensitive). x: X coordinate in screenshot pixels. y: Y coordinate in screenshot pixels. button: 'left' (default) or 'right'. double_click: If True, send a double-click. |
| app_typeA | Type text into a Windows application window. Sends Unicode characters to the window's currently focused control. Click on a text field first with app_click to focus it. Args: window_title: Full or partial window title (case-insensitive). text: The text to type. |
| app_keyA | Send a key or keyboard shortcut to a Windows application window. Supports special keys: enter, tab, escape, backspace, delete, space, up, down, left, right, home, end, pageup, pagedown, f1-f12. Supports modifier combinations: ctrl+a, ctrl+shift+s, alt+f4, etc. Args: window_title: Full or partial window title (case-insensitive). key: Key name or combination (e.g., 'enter', 'ctrl+a', 'f5'). |
| adb_devicesA | List all connected Android devices with model, Android version, and screen size. Returns a formatted table of connected devices. Use this to find device serial numbers for targeting specific devices. |
| adb_device_infoB | Get detailed information about a connected Android device. Args: device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_screenshotA | Capture the Android device screen as a screenshot. Returns the screen image for visual inspection. Use this to see what's currently displayed on the device. Args: device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_tapA | Tap a point on the Android device screen. Args: x: X coordinate in pixels. y: Y coordinate in pixels. device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_swipeA | Swipe on the Android device screen from one point to another. Args: x1: Start X coordinate. y1: Start Y coordinate. x2: End X coordinate. y2: End Y coordinate. duration_ms: Swipe duration in milliseconds (default 300). device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_type_textA | Type text on the Android device. The text is escaped for the adb shell. Spaces and special characters are handled automatically. The device must have a text field focused. Args: text: The text to type. device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_keyA | Send a key event to the Android device. Accepts short aliases: home, back, enter, menu, power, volume_up, volume_down, tab, delete, space, escape, dpad_up, dpad_down, dpad_left, dpad_right, dpad_center, app_switch, camera. Also accepts full KEYCODE_* names or numeric key codes. Args: key: Key name, alias, or numeric code. device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_installA | Install an APK file on the Android device. Replaces the existing installation if present (-r flag). Args: apk_path: Absolute path to the .apk file on the local machine. device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_list_packagesA | List installed packages on the Android device. Args: filter_text: Optional text to filter package names (case-insensitive). device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_launch_appA | Launch an app on the Android device. If no activity is specified, launches the default launcher activity. Args: package: Package name (e.g., 'com.example.myapp'). activity: Optional activity name (e.g., '.MainActivity'). device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_stop_appA | Force-stop an app on the Android device. Args: package: Package name (e.g., 'com.example.myapp'). device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_pushB | Push a file from the local machine to the Android device. Args: local_path: Path to the file on the local machine. remote_path: Destination path on the device (e.g., '/sdcard/file.txt'). device: Device serial number. If omitted, auto-selects when only one device is connected. |
| adb_pullB | Pull a file from the Android device to the local machine. Args: remote_path: Path on the device (e.g., '/sdcard/file.txt'). local_path: Destination path on the local machine. device: Device serial number. If omitted, auto-selects when only one device is connected. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 53 tools
Each tool targets a distinct resource and action: compiler operations, Android ADB commands, iOS simulator/PAServer operations, and IDE observations are all clearly separated. Even similar tools like compile_pascal vs check_syntax vs run_pascal have explicit differences in their descriptions, and compile_delphi_project vs build_dproj are contrasted directly.
Naming is mixed: some tools follow verb_noun (compile_pascal, list_project_files), while others use noun_verb (adb_tap, sim_list, app_click). There is internal consistency within prefixes like adb_*, sim_*, and paserver_*, but the overall conventions are inconsistent. The pattern is readable but not uniform.
At 53 tools, the surface is very large and spans multiple subdomains (Pascal compilation, Delphi project building, Android device automation, iOS simulator/remote builds, IDE interaction). While each tool has a purpose, the sheer quantity makes the set heavy and likely overwhelming for agents. It exceeds the '25+ feels heavy' threshold significantly.
The toolset provides broad lifecycle coverage for Pascal/Delphi development: code generation, compilation, running, GUI launching, project building, debugging via IDE observation, Android deployment, iOS remote builds, codesigning, IPA packaging, simulator management, and file transfers. Minor gaps exist (e.g., no direct .dproj editing, no explicit unit test runner), but the core workflows are thoroughly covered.