Skip to main content
Glama

Delphi Build MCP Server

A Model Context Protocol (MCP) server that enables AI coding agents like Claude Code to compile Delphi projects programmatically.

Features

  • Automatic Configuration: Generate config from IDE build logs with multi-line parsing

  • Multi-Config Support: Generate unified config from multiple build logs (Debug/Release × Win32/Win64/Win64x/Linux64)

  • Extend Configuration: Add new platforms or libraries to existing config without regenerating

  • Smart Compilation: Reads .dproj files for build settings and compiler flags

  • Package Support: Compiles both application (.dpr) and package (.dpk) projects with correct output (.exe/.bpl)

  • Filtered Output: Returns only errors, filters out warnings and hints

  • Multi-Language Support: Parses both English and German compiler output

  • Response File Support: Handles command lines >8000 characters automatically

  • Cross-Platform: Supports Win32, Win64, Win64x (LLVM), and Linux64 cross-compilation

  • 80+ Library Paths: Successfully handles projects with extensive dependencies

  • Environment Variables: Auto-expands ${USERNAME} in paths

  • MCP Compatible: Works with Claude Code, Cline, and other MCP clients

  • Network Transport: Streamable HTTP support for remote access (e.g., WSL-Ubuntu to Windows host)

  • WSL Interop: Use from WSL-Ubuntu via stdio through Windows Python or via Streamable HTTP

Quick Start

1. Install

# Install UV if you haven't already # Windows: powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # macOS/Linux: curl -LsSf https://astral.sh/uv/install.sh | sh # Or: pip install uv cd delphi-build-mcp-server uv venv uv pip install -e .

2. Generate Configuration

In Delphi IDE:

  1. Tools > Options > Building > Show compiler progress > "Verbose"

  2. Build your project

  3. View > Messages > Right-click > Copy All

  4. Save to build.log

Then generate config:

Single Build Log (simple projects):

# Platform-specific config is generated by default (e.g., delphi_config_win64.toml) uv run python -m src.config_generator build.log # Generate generic delphi_config.toml instead uv run python -m src.config_generator build.log --generic

Multiple Build Logs (multi-platform projects):

For projects targeting multiple platforms (Win32/Win64/Linux64), create build logs for each configuration:

  1. Build in IDE with each Platform/Config combination

  2. Save each build log separately (e.g., build_debug_win32.log, build_release_linux64.log)

  3. Generate config from all logs:

# Separate platform-specific config files (default) uv run python -m src.multi_config_generator build_win32.log build_win64.log # Creates: delphi_config_win32.toml, delphi_config_win64.toml # Custom output directory for platform-specific files uv run python -m src.multi_config_generator *.log -d ./configs/ # Single unified config instead of separate files uv run python -m src.multi_config_generator build_win32.log build_win64.log --unified -o my_config.toml # Disable environment variable substitution uv run python -m src.multi_config_generator *.log --no-env-vars

Platform-Specific Config Files:

The server supports platform-specific configuration files with automatic fallback:

Platform

Config File

Win32

delphi_config_win32.toml

Win64

delphi_config_win64.toml

Win64x

delphi_config_win64x.toml

Linux64

delphi_config_linux64.toml

Search order:

  1. DELPHI_CONFIG environment variable (explicit override)

  2. delphi_config_{platform}.toml (platform-specific)

  3. delphi_config.toml (generic fallback)

Or use the Python API:

from src.config_generator import ConfigGenerator from src.multi_config_generator import MultiConfigGenerator from pathlib import Path # Single build log generator = ConfigGenerator() result = generator.generate_from_build_log( build_log_path=Path("build.log"), output_path=Path("delphi_config.toml") ) # Multiple build logs (recommended for multi-platform) multi_gen = MultiConfigGenerator() result = multi_gen.generate_from_build_logs( build_log_paths=["build_debug_win32.log", "build_release_win64.log", "build_debug_linux64.log"], output_path=Path("delphi_config.toml") ) print(result.message)

3. Configure Claude Code

Edit %APPDATA%\Claude\claude_desktop_config.json:

{ "mcpServers": { "delphi-build": { "command": "uv", "args": [ "run", "--directory", "C:\\path\\to\\delphi-build-mcp-server", "main.py" ], "env": { "DELPHI_CONFIG": "C:\\path\\to\\delphi-build-mcp-server\\delphi_config.toml" } } } }

Server Options

The server supports two transport modes:

Flag

Default

Description

--transport

stdio

Transport type: stdio or streamable-http

--host

0.0.0.0

Bind address (streamable-http only)

--port

8080

Listen port (streamable-http only)

Local (stdio, default):

uv run main.py

Network (Streamable HTTP):

uv run main.py --transport streamable-http # Server listens on http://0.0.0.0:8080/mcp

Configure Claude Code in WSL-Ubuntu

Two options for using the Delphi MCP server from WSL-Ubuntu:

Option 1: stdio via WSL Interop (Simplest)

WSL can execute Windows binaries directly. This uses stdio transport through the Windows Python -- no HTTP server needed, no manual start. Claude Code manages the server lifecycle automatically.

Edit ~/.claude.json (or project-level .mcp.json) in WSL:

{ "mcpServers": { "delphi-build": { "command": "/mnt/c/Users/<username>/path/to/delphi-build-mcp-server/.venv/Scripts/python.exe", "args": [ "/mnt/c/Users/<username>/path/to/delphi-build-mcp-server/main.py" ], "env": { "DELPHI_CONFIG": "C:\\Users\\<username>\\path\\to\\delphi_config.toml" } } } }

Note: The DELPHI_CONFIG path must use Windows-style paths since the server runs as a Windows process.

Option 2: Streamable HTTP (Network Transport)

Run the MCP server as a persistent HTTP service on Windows and connect from WSL over the network.

1. Start the MCP server on Windows:

cd C:\path\to\delphi-build-mcp-server uv run main.py --transport streamable-http

To start the server automatically at logon, place start_mcp_server.bat (included in this repository) in your Windows Startup folder (Win+Rshell:startup).

2. Find your Windows host IP from WSL:

# Method 1: WSL gateway IP cat /etc/resolv.conf | grep nameserver | awk '{print $2}' # Method 2: Windows hostname hostname -I # run on Windows side

3. Configure Claude Code in WSL:

Edit ~/.claude.json (or project-level .mcp.json):

{ "mcpServers": { "delphi-build": { "url": "http://<windows-host-ip>:8080/mcp" } } }

Note: If the connection is refused, you may need to allow port 8080 through Windows Firewall:

netsh advfirewall firewall add rule name="Delphi MCP Server" dir=in action=allow protocol=TCP localport=8080

4. Use in Claude Code

Please compile my Delphi project at X:\MyProject\MyApp.dproj

Tools

compile_delphi_project

Compile a Delphi project and return parsed results.

Parameters:

  • project_path (required): Path to .dpr or .dproj file

  • force_build_all: Force rebuild all units

  • override_config: Override build config (Debug/Release)

  • override_platform: Override platform (Win32/Win64/Win64x/Linux64)

  • additional_search_paths: Extra search paths

  • additional_flags: Additional compiler flags

Returns:

  • success: Whether compilation succeeded

  • errors: List of compilation errors (warnings/hints filtered)

  • compilation_time_seconds: Time taken

  • output_executable: Path to compiled EXE

  • statistics: Compilation statistics

generate_config_from_build_log

Generate delphi_config.toml from a single IDE build log.

Parameters:

  • build_log_path (required): Path to build log file

  • output_config_path: Output file path (overrides default platform-specific naming)

  • use_platform_specific_name: Generate platform-specific filename (e.g., delphi_config_win64.toml) based on detected platform (default: true)

  • use_env_vars: Replace paths with ${USERNAME} (default: true)

Returns:

  • success: Whether generation succeeded

  • config_file_path: Path to generated config

  • statistics: Paths found and processed

  • detected_info: Delphi version, platform, build config

generate_config_from_multiple_build_logs

Generate configuration from multiple IDE build logs for different configurations and platforms. By default, creates separate platform-specific files (e.g., delphi_config_win32.toml, delphi_config_win64.toml).

Parameters:

  • build_log_paths (required): Array of paths to IDE build log files (e.g., Debug-Win32, Release-Win64, Debug-Linux64)

  • output_config_path: Output file path for unified config (only used when generate_separate_files=false)

  • generate_separate_files: Generate separate platform-specific config files (default: true). Set to false for a single unified config.

  • output_dir: Output directory for generated files (default: current directory)

  • use_env_vars: Replace paths with ${USERNAME} (default: true)

Returns:

  • success: Whether generation succeeded

  • config_file_path: Path to generated config(s)

  • build_logs_processed: Details of each processed log (path, config, platform, auto_detected)

  • statistics: Configs found, platforms found, total library paths, files generated

extend_config_from_build_log

Extend an existing delphi_config.toml with settings from a new IDE build log. Useful for adding support for new platforms (e.g., Win64x) or libraries without regenerating the entire configuration.

Parameters:

  • existing_config_path (required): Path to existing delphi_config.toml

  • build_log_path (required): Path to IDE build log file

  • output_config_path: Output path (default: overwrites existing)

  • use_env_vars: Replace paths with ${USERNAME} (default: true)

Returns:

  • success: Whether extension succeeded

  • config_file_path: Path to extended config

  • paths_added: Number of new paths added

  • paths_skipped: Number of duplicates skipped

  • platforms_added: List of new platforms (e.g., ["Win64x"])

  • settings_updated: Count of settings updated per section

Documentation

Project Structure

delphi-build-mcp-server/ |-- main.py # MCP server entry point (stdio + streamable-http) |-- src/ | |-- models.py # Pydantic data models | |-- buildlog_parser.py # Parse IDE build logs | |-- dproj_parser.py # Parse .dproj files | |-- config.py # Load TOML configuration | |-- output_parser.py # Parse compiler output | |-- config_generator.py # Generate TOML configs (single log) | |-- multi_config_generator.py # Generate TOML configs (multi-log) | |-- config_extender.py # Extend existing TOML configs | +-- compiler.py # Compiler orchestration |-- tests/ # Unit tests |-- start_mcp_server.bat # Auto-start script for Windows (shell:startup) |-- test_stdio_wsl.sh # Test stdio transport from WSL |-- test_http_transport.sh # Test Streamable HTTP transport (bash) |-- test_http_transport.bat # Test Streamable HTTP transport (Windows) |-- delphi_config.toml.template # Configuration template |-- pyproject.toml # Python project config |-- QUICKSTART.md # Quick start guide +-- DOCUMENTATION.md # Complete documentation

Requirements

  • Python 3.10+

  • Delphi 11, 12, or 13

  • MCP-compatible client (Claude Code, Cline, etc.)

How It Works

Note: The server automatically handles response files for projects with 80+ library paths (command lines >8000 chars) and parses both English and German compiler output.

1. AI Agent calls compile_delphi_project | v 2. MCP Server loads delphi_config.toml - Delphi installation paths - Library search paths | v 3. Parse .dproj file - Active configuration (Debug/Release) - Compiler flags and defines - Project-specific search paths | v 4. Build compiler command - Merge config file + .dproj settings - Add search paths, namespaces, aliases | v 5. Execute dcc32.exe/dcc64.exe/dcclinux64.exe | v 6. Parse output - Extract errors (E####, F####) - Filter warnings (W####) and hints (H####) | v 7. Return structured result to AI

Example Usage

Compile a Project

from src.compiler import DelphiCompiler from pathlib import Path compiler = DelphiCompiler() result = compiler.compile_project( project_path=Path("X:/MyProject/MyApp.dproj") ) if result.success: print(f"[OK] Compilation successful: {result.output_executable}") else: print(f"[FAIL] Compilation failed with {len(result.errors)} errors:") for error in result.errors: print(f" {error.file}({error.line},{error.column}): {error.message}")

Generate Config from Build Log

from src.config_generator import ConfigGenerator from pathlib import Path generator = ConfigGenerator(use_env_vars=True) result = generator.generate_from_build_log( build_log_path=Path("build.log"), output_path=Path("delphi_config.toml") ) print(f"[OK] {result.message}") print(f" Detected: Delphi {result.detected_info.delphi_version}") print(f" Platform: {result.detected_info.platform}") print(f" Paths found: {result.statistics['unique_paths']}")

Generate Multi-Platform Config from Multiple Build Logs

from src.multi_config_generator import MultiConfigGenerator from pathlib import Path generator = MultiConfigGenerator(use_env_vars=True) result = generator.generate_from_build_logs( build_log_paths=[ "build_debug_win32.log", "build_release_win32.log", "build_debug_linux64.log", "build_release_linux64.log" ], output_path=Path("delphi_config.toml") ) print(f"[OK] {result.message}") print(f" Configs: {result.statistics['configs_found']}") print(f" Platforms: {result.statistics['platforms_found']}") print(f" Total paths: {result.statistics['total_library_paths']}")

Extend Existing Config with New Platform

from src.config_extender import ConfigExtender from pathlib import Path # Extend existing config with Win64x platform support extender = ConfigExtender(use_env_vars=True) result = extender.extend_from_build_log( existing_config_path=Path("delphi_config.toml"), build_log_path=Path("build_win64x.log") ) print(f"[OK] {result.message}") print(f" New platforms: {result.platforms_added}") print(f" Paths added: {result.paths_added}") print(f" Paths skipped (duplicates): {result.paths_skipped}")

Or via CLI:

uv run python -m src.config_extender delphi_config.toml build_win64x.log uv run python -m src.config_extender delphi_config.toml build_win64x.log -o extended_config.toml

Troubleshooting

"Configuration file not found"

Generate it from a build log:

uv run python -m src.config_generator build.log

"Unit not found"

Regenerate config from a fresh IDE build log that includes all dependencies.

"Compiler not found"

Verify delphi.root_path in delphi_config.toml points to your Delphi installation.

Development

Install Development Dependencies

uv pip install -e ".[dev]"

Run Tests

uv run pytest

Test Sample Projects

Two sample projects are included for testing:

# Test successful compilation uv run python test_compile_samples.py
  • sample/working/Working.dproj - Compiles successfully

  • sample/broken/Broken.dproj - Intentionally has errors for testing error parsing

Code Formatting

uv run black src/ uv run ruff check src/

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

License

MIT License - see LICENSE file for details.

Support

Acknowledgments

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Basti-Fantasti/delphi-build-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server