Claude Pascal Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Claude Pascal Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP (Model Context Protocol) server that lets Claude compile, run, and interact with Pascal/Delphi desktop applications. Supports Free Pascal (fpc), Delphi 32-bit (dcc32), and Delphi 64-bit (dcc64) compilers.
| Tool | Description |
|---|---|
get_compiler_info | Detect available compilers and show versions |
compile_pascal | Compile single-file source code |
compile_delphi_project | Generate + compile a project from templates — vcl, fmx (cross-platform incl. Android), console, or fpc |
build_dproj | Build an existing .dproj via MSBuild + rsvars. Auto-resolves PAServer profile, chains Deploy, deep-cleans the dproj's actual output dirs, supports iOS deploy-manifest synthesis. See §build_dproj details below |
run_pascal | Compile and execute console programs |
launch_app | Compile and launch GUI app in background |
check_syntax | Syntax check only (no linking) |
parse_form | Parse DFM/FMX/LFM form files |
list_remote_profiles | List PAServer Connection Profiles registered for iOS/macOS/Linux builds |
check_ios_deploy | Inspect a .dproj for the iOS DeployFile entries required by /t:Deploy |
paserver_info | Read local info about a PAServer Connection Profile (host/port/sysroot) |
paserver_check_connection | Two-stage reachability probe: registry validation + TCP socket connect |
paserver_scratch_dir | Compose PAServer's restricted-mode scratch dir for a profile |
paserver_get | Pull a file from the PAServer remote host |
paserver_put | Push a file to the PAServer remote host |
paserver_remove | Delete a file on the PAServer remote host |
ios_codesign | Codesign an .app bundle on the remote Mac (paclient -c) |
ios_create_ipa | Assemble a signed .app into an .ipa (paclient -i) |
ios_install_ipa | Install an .ipa on an iOS device attached to the Mac (paclient -ii) |
mac_ssh_check | Probe SSH connectivity + key auth to the remote Mac |
mac_ssh_run | Run an arbitrary command on the Mac via SSH (xcrun, logging, etc.) |
sim_list | List iOS simulators known to the Mac (xcrun simctl list) |
sim_boot / sim_shutdown | Boot or shut down a simulator by UDID |
sim_install / sim_uninstall | Install / uninstall a .app on a simulator |
sim_launch / sim_terminate | Launch or terminate an app by bundle ID |
sim_open_url | Open a URL in the simulator (deep links, web) |
sim_screenshot | Capture a simulator screenshot as Image (parity with adb_screenshot) |
screenshot_app | Capture screenshot of a running app window |
list_app_windows | List visible windows on the desktop |
app_click | Click on a Windows app window at screenshot pixel coordinates |
app_type | Type text into a Windows app window |
app_key | Send key or shortcut (e.g., ctrl+a, enter) to a Windows app |
focus_ide | Restore + foreground the Delphi/Lazarus IDE window |
observe_ide | Capture IDE screenshot and scan project files |
read_ide_errors | Read source code around compiler error locations |
list_project_files | List source files in a Delphi/Lazarus project |
adb_devices | List connected Android devices with model and version |
adb_device_info | Get detailed info for a specific Android device |
adb_screenshot | Capture Android device screen |
adb_tap | Tap a point on the Android device screen |
adb_swipe | Swipe on the Android device screen |
adb_type_text | Type text on the Android device |
adb_key | Send a key event (home, back, enter, etc.) to Android device |
adb_install | Install an APK on the Android device |
adb_list_packages | List installed packages on the Android device |
adb_launch_app | Launch an app on the Android device |
adb_stop_app | Force-stop an app on the Android device |
adb_push | Push a file to the Android device |
adb_pull | Pull a file from the Android device |
setup_fpc | Download and install Free Pascal (fallback) |
build_dproj builds an existing real .dproj (multi-unit, with its own search paths, defines, resources, deployment) via MSBuild + rsvars.bat. It does the things ad-hoc shell calls to MSBuild keep getting wrong:
.proj that imports the dproj and emits DCC_ExeOutput / DCC_DcuOutput / DCC_BplOutput as the dproj's own evaluator sees them. Uses those for deep-clean targeting and artifact lookup — so ..\bin\$(Platform)\$(Config) layouts work the same as the default.HKCU\Software\Embarcadero\BDS\<ver>\RemoteProfiles. When multiple compatible profiles exist (e.g. a PRODUCTION and STAGING Linux profile) it refuses to silently pick — caller has to pass remote_profile=<name> explicitly. Stops you accidentally deploying to production..app, not just an intermediate libProj.so or object file. Pass deploy=False to opt out.ProjectiOSEntitlements, ProjectiOSInfoPList, ProjectiOSLaunchScreen, ProjectOutput) /t:Deploy ships nothing and codesign fails. synthesize_ios_manifest=True writes them after a timestamped .bak backup.rsvars.bat
MSBuild <Proj>.dproj /t:Build /p:Config=<Cfg> /p:Platform=<Plat>
MSBuild <Proj>.dproj /t:Deploy /p:Config=<Cfg> /p:Platform=<Plat> /p:Profile=<ConnectionProfile>build_dproj collapses this into a single call: build_dproj(dproj_path, platform=<Plat>, config=<Cfg>).
If a build fails, walk through these before assuming the MCP is broken:
check_ios_deploy(dproj_path, config, platform) and set synthesize_ios_manifest=True on the build.ld: file not found: /usr/lib/libiconv.dylib.)list_remote_profiles() shows what's registered; sidecar .profile files must exist at %APPDATA%\Embarcadero\BDS\<ver>\<name>.profile for /t:Deploy to read them.adb on PATH? Is the device authorized (adb_devices)?Cross-platform Embarcadero builds (iOS, macOS, Linux) compile through PAServer on a remote Mac or Linux host, driven by paclient.exe on Windows. This MCP wraps both ends:
build_dproj for iOS/macOS/Linux auto-resolves a Connection Profile, chains /t:Deploy, and synthesizes the iOS manifest if needed (see §build_dproj details).paserver_* tools cover the direct file/transfer/diagnostic surface that MSBuild doesn't reach.ios_* tools wrap the iOS-bundle pipeline (codesign → IPA → device install) for cases where you want surgical control instead of a full Deploy.PAServer profiles live in HKCU\Software\Embarcadero\BDS\<ver>\RemoteProfiles\ (registry) with a sidecar at %APPDATA%\Embarcadero\BDS\<ver>\<name>.profile. Configure them via RAD Studio → Tools → Options → Environment Options → Connection Profile Manager.
# What's registered:
list_remote_profiles()
# Verify a specific one's reachable:
paserver_check_connection("MACBOOK", timeout=3.0)By default PAServer rejects any file op outside its per-profile scratch dir:
/Users/<remote_user>/PAServer/scratch-dir/<windows_user>-<PROFILE>/Targeting /tmp or /Users/anything-else returns Error: E0006 ... PAServer is running in restricted mode. Either point your transfer at the scratch dir (paserver_scratch_dir composes the path) or have the host operator start PAServer with -restricted=false.
xcrun simctl runs on the Mac and PAClient doesn't expose arbitrary command execution, so simulator control goes through SSH. One-time setup on the Windows side:
# Enable Remote Login on the Mac: System Settings → General → Sharing → Remote Login.
# Then install your public key (asks for the Mac password once):
ssh-copy-id <mac_user>@<mac_host>Once that's done, the sim_* tools have parity with adb_* — same verbs, same return shape:
mac_ssh_check("192.168.88.79", "andrevanzuydam") # pre-flight
sim_list(host, user, booted_only=True) # what's running?
sim_boot(host, user, "<UDID>")
sim_install(host, user, "/Users/.../scratch-dir/...-MACBOOK/MyApp.app")
sim_launch(host, user, "com.embarcadero.MyApp")
sim_screenshot(host, user) # returns an Image# 1. Build the iOS app — Deploy chain leaves a .app in the scratch dir
build_dproj(
r"D:\src\App.dproj",
config="Release",
platform="iOSDevice64",
synthesize_ios_manifest=True, # if this is the first iOS deploy
)
# 2. Codesign it (or skip with "-" for ad-hoc dev signing)
ios_codesign(
"MACBOOK",
"/Users/macuser/PAServer/scratch-dir/winuser-MACBOOK/App.app",
"iPhone Developer: Jane Doe (ABCDE12345)",
entitlement="/Users/macuser/Provisioning/App.entitlements",
)
# 3. Package as IPA
ios_create_ipa(
"MACBOOK",
app_path="/Users/.../App.app",
out_path="/Users/.../App.ipa",
certificate="iPhone Developer: ...",
provisioning_profile="/Users/.../App.mobileprovision",
ipa_type=1, # ad-hoc; 2 for App Store
)
# 4. Install on attached device (find UDID via xcrun devicectl)
ios_install_ipa("MACBOOK", "/Users/.../App.ipa", "00008101-001234567890123A")The preview bridge lets Claude see and interact with running Pascal desktop applications through its web-based preview system. It serves live screenshots of desktop app windows as a web page.
Claude Preview Tools (preview_start, preview_screenshot, preview_click)
| HTTP
v
Preview Bridge Server (Python/Starlette)
/ -> HTML page with live screenshot viewer
/api/screenshot -> PNG of target window
/api/controls -> enumerate child controls with positions
/api/click -> click at coordinates or by control hwnd
/api/type -> send keystrokes to target window
/api/move -> move window to screen position
/api/resize -> resize window
| Win32 PrintWindow API
v
Running Pascal Desktop Application| Route | Method | Description |
|---|---|---|
/ | GET | HTML page with auto-refreshing screenshot viewer |
/api/screenshot | GET | PNG screenshot of target window |
/api/windows | GET | List visible windows |
/api/target | POST | Set target window by title |
/api/controls | GET | Enumerate child controls (buttons, inputs, etc.) |
/api/click | POST | Click by coordinates or direct control hwnd |
/api/type | POST | Send text or key combos (e.g., ctrl+a, enter) |
/api/drag | POST | Drag from one point to another |
/api/move | POST | Move target window |
/api/resize | POST | Resize target window |
/api/window-info | GET | Window position, size, and client area offset |
/api/console | GET | Console output from launched apps |
/api/launch | POST | Launch an executable |
The click endpoint supports three modes, from most to least reliable:
{"hwnd": "12345"}) — sends BM_CLICK directly to a control handle. Works regardless of DPI, monitors, or foreground state. Get hwnds from /api/controls.{"x": 200, "y": 142, "client": true}) — uses Win32 ClientToScreen for proper DPI handling.{"x": 312, "y": 261}) — raw coordinates in the screenshot image space.The app_click, app_type, and app_key tools let Claude interact with running Windows desktop applications.
screenshot_app to see the current UIapp_click with those coordinates to clickapp_type to enter text into a focused fieldapp_key to send keyboard shortcuts (enter, ctrl+a, alt+f4, etc.)Clicks use PostMessage with automatic child window targeting, so they reach the correct control. Typing and key events use SendInput for full Unicode and modifier support.
Full Android device interaction via ADB. All tools accept an optional device serial number — auto-selects when only one device is connected.
adb_devices — list connected devices with model, Android version, screen sizeadb_device_info — detailed info for a specific deviceadb_screenshot — capture the device screenadb_tap / adb_swipe — touch interaction at pixel coordinatesadb_type_text — type text (auto-escapes for adb shell)adb_key — send key events with aliases: home, back, enter, menu, power, volume_up, volume_down, tab, delete, space, escape, app_switchadb_install — install APK filesadb_list_packages — list installed packages (with optional filter)adb_launch_app — launch an app by package nameadb_stop_app — force-stop an appadb_push — push files from PC to deviceadb_pull — pull files from device to PCThe compile_delphi_project tool generates proper Delphi project structure automatically. You specify components and events, and it creates the correct DPR, PAS, and DFM files.
Templates automatically handle:
Vcl.Forms, System.SysUtils)Forms, SysUtils)compile_delphi_project(
project_name="HelloWorld",
form_caption="My App",
components='[{"type": "TButton", "name": "btnHello", "caption": "Click Me",
"left": 100, "top": 100, "width": 120, "height": 35,
"event": "btnHelloClick"}]',
events='[{"name": "btnHelloClick", "body": "ShowMessage(\'Hello!\');"}]',
compiler="C:\\Path\\To\\dcc64.exe"
)This generates:
HelloWorld.dpr — project file with proper uses clauseuMain.pas — unit with form class, component declarations, event handlersuMain.dfm — form definition with component propertiesOnce a release is published to PyPI, no clone is needed:
uvx --from claude-pascal-mcp pascal-mcpuvx --from git+https://github.com/tina4stack/claude-pascal-mcp pascal-mcpPin to a tag for reproducibility: git+https://github.com/tina4stack/[email protected].
git clone https://github.com/tina4stack/claude-pascal-mcp.git
cd claude-pascal-mcp
# Install dependencies
uv sync
# Run the MCP server (stdio mode)
uv run pascal-mcp
# Run the preview bridge (HTTP mode)
uv run pascal-previewPyPI install:
claude mcp add --transport stdio pascal-dev -- uvx --from claude-pascal-mcp pascal-mcpGit install:
claude mcp add --transport stdio pascal-dev -- uvx --from git+https://github.com/tina4stack/claude-pascal-mcp pascal-mcpLocal clone:
claude mcp add --transport stdio pascal-dev -- uv run --directory /path/to/claude-pascal-mcp pascal-mcpOr add to your project's .mcp.json — pick the form that matches how you installed:
{
"mcpServers": {
"pascal-dev": {
"command": "uvx",
"args": ["--from", "claude-pascal-mcp", "pascal-mcp"]
}
}
}{
"mcpServers": {
"pascal-dev": {
"command": "uvx",
"args": ["--from", "git+https://github.com/tina4stack/claude-pascal-mcp", "pascal-mcp"]
}
}
}{
"mcpServers": {
"pascal-dev": {
"command": "uv",
"args": ["run", "--directory", "/path/to/claude-pascal-mcp", "pascal-mcp"]
}
}
}Add to your claude_desktop_config.json (pick the form matching your install):
{
"mcpServers": {
"pascal-dev": {
"command": "uvx",
"args": ["--from", "claude-pascal-mcp", "pascal-mcp"]
}
}
}{
"mcpServers": {
"pascal-dev": {
"command": "uv",
"args": ["run", "--directory", "C:/path/to/claude-pascal-mcp", "pascal-mcp"]
}
}
}Maintainer notes — cutting a new release publishes to PyPI automatically.
version in pyproject.toml.git tag v0.1.0 && git push origin v0.1.0..github/workflows/publish.yml) builds the sdist + wheel, publishes to PyPI via Trusted Publishing, and attaches the artifacts to a GitHub Release.One-time PyPI Trusted Publisher setup (required before the first release):
uv publish).tina4stackclaude-pascal-mcppublish.ymlpypipypi (Settings → Environments).No API tokens needed — OIDC handles auth.
Add to .claude/launch.json in your project root:
{
"version": "0.0.1",
"configurations": [
{
"name": "pascal-preview",
"runtimeExecutable": "/path/to/claude-pascal-mcp/.venv/Scripts/pythonw.exe",
"runtimeArgs": ["-m", "pascal_mcp.preview_bridge"],
"port": 18080,
"autoPort": true
}
]
}Then in Claude Code, use preview_start("pascal-preview") to open the preview panel.
The server automatically detects compilers in this priority order:
You can also specify a full path to any compiler executable:
compile_pascal(source, compiler="C:\\Program Files (x86)\\Embarcadero\\Studio\\37.0\\bin\\dcc64.exe")Detection checks the system PATH first, then known installation directories:
C:\FPC\*\bin\*\fpc.exeC:\Lazarus\fpc\*\bin\*\fpc.exeC:\Program Files (x86)\Embarcadero\Studio\*\bin\dcc*.exeMIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.