Skip to main content
Glama

xcsift-mcp

An MCP (Model Context Protocol) server that wraps xcsift, enabling AI coding assistants to parse Xcode build output into structured, token-efficient formats.

Python 3.10+ License: MIT MCP

Overview

xcsift-mcp provides AI coding assistants (like Claude, OpenCode, Cursor, etc.) with tools to:

  • Parse raw xcodebuild or swift build/test output into structured JSON or TOON format

  • Execute build commands and get parsed results automatically

  • Extract errors, warnings, test failures, and linker errors with file/line information

  • Analyze code coverage from test runs

The output is optimized for token efficiency, with TOON format providing 30-60% fewer tokens compared to JSON.

Quick Start

# Install pip install . # Run the MCP server xcsift-mcp

Then configure your AI assistant to use the server (see Integration below).

Installation

Prerequisites

  • Python 3.10+

  • macOS (xcsift is macOS-only)

Install from source

git clone https://github.com/johnnyclem/xcsift_mcp.git cd xcsift_mcp pip install .

Install with development dependencies

pip install -e ".[dev]"

xcsift Binary

The server will automatically download the xcsift binary from GitHub releases on first run if it's not already installed. The binary is cached in ~/.local/share/xcsift-mcp/bin/.

Alternatively, you can install it manually:

# Via Homebrew (recommended) brew install xcsift # Or build from source git clone https://github.com/ldomaradzki/xcsift.git cd xcsift swift build -c release cp .build/release/xcsift /usr/local/bin/

Usage

Running the Server

# Run with stdio transport (default, for Claude Desktop/OpenCode) xcsift-mcp # Or as a Python module python -m xcsift_mcp # Run with HTTP transport (for debugging/web clients) python -m xcsift_mcp --transport http --port 8000

Integration with AI Assistants

Claude Desktop

Add to your claude_desktop_config.json:

{ "mcpServers": { "xcsift": { "command": "python", "args": ["-m", "xcsift_mcp"] } } }

OpenCode

opencode mcp add xcsift -- python -m xcsift_mcp

Cursor

Add to your MCP configuration in Cursor settings, or add to .cursor/mcp.json:

{ "mcpServers": { "xcsift": { "command": "python", "args": ["-m", "xcsift_mcp"] } } }

Available Tools

Parsing Tools

Tool

Description

parse_xcodebuild_output

Parse raw xcodebuild/swift output into JSON or TOON format

extract_errors

Extract only errors with file/line information

extract_warnings

Extract only warnings with file/line/type

extract_test_failures

Extract failed tests with assertion messages

get_build_summary

Get a quick summary with error/warning counts

Build Execution Tools

Tool

Description

xcodebuild

Run xcodebuild and parse output automatically

swift_build

Run swift build for SPM projects

swift_test

Run swift test with optional coverage

run_shell_build_command

Run arbitrary build commands and parse output

Tool Parameters

parse_xcodebuild_output

Parameter

Type

Default

Description

output

string

required

Raw xcodebuild/swift output (use 2>&1 to capture stderr)

format

"json" | "toon"

"json"

Output format

include_warnings

bool

false

Include detailed warnings list

include_coverage

bool

false

Include coverage data if available

xcodebuild

Parameter

Type

Default

Description

action

"build" | "test" | "clean" | "analyze"

"build"

Build action

scheme

string

none

Scheme to build

project

string

none

Path to .xcodeproj

workspace

string

none

Path to .xcworkspace

destination

string

none

Destination (e.g., "platform=iOS Simulator,name=iPhone 15")

configuration

"Debug" | "Release"

none

Build configuration

enable_code_coverage

bool

false

Enable coverage for tests

output_format

"json" | "toon"

"json"

Output format

timeout

int

600

Timeout in seconds

swift_build

Parameter

Type

Default

Description

configuration

"debug" | "release"

"debug"

Build configuration

package_path

string

none

Path to Swift package

target

string

none

Specific target to build

output_format

"json" | "toon"

"json"

Output format

timeout

int

300

Timeout in seconds

swift_test

Parameter

Type

Default

Description

package_path

string

none

Path to Swift package

filter_test

string

none

Filter tests (e.g., "MyTests.testFoo")

enable_code_coverage

bool

false

Enable coverage collection

parallel

bool

true

Run tests in parallel

output_format

"json" | "toon"

"json"

Output format

timeout

int

600

Timeout in seconds

Example Usage

Parse existing build output

# In your AI assistant result = parse_xcodebuild_output( output="<raw xcodebuild output>", format="toon", # or "json" include_warnings=True )

Run build and get parsed results

result = xcodebuild( action="build", scheme="MyApp", destination="platform=iOS Simulator,name=iPhone 15", output_format="json" )

Run tests with coverage

result = swift_test( enable_code_coverage=True, output_format="toon" )

Extract just the errors

errors = extract_errors(output="<raw xcodebuild output>") # Returns: [{"file": "main.swift", "line": 15, "message": "..."}]

Output Formats

JSON Format

Standard structured JSON output:

{ "status": "failed", "summary": { "errors": 1, "warnings": 3, "failed_tests": 0, "linker_errors": 0, "build_time": "3.2s" }, "errors": [ { "file": "main.swift", "line": 15, "message": "use of undeclared identifier 'unknown'" } ], "warnings": [ { "file": "view.swift", "line": 20, "message": "variable 'temp' was never used", "type": "compile" } ] }

TOON Format (Token-Optimized)

30-60% fewer tokens than JSON:

status: failed summary: errors: 1 warnings: 3 failed_tests: 0 linker_errors: 0 build_time: 3.2s errors[1]{file,line,message}: main.swift,15,"use of undeclared identifier 'unknown'" warnings[1]{file,line,message,type}: view.swift,20,"variable 'temp' was never used","compile"

When to use each format:

  • JSON: When you need to parse the output programmatically or integrate with other tools

  • TOON: When sending to an LLM to reduce token usage and API costs

Available Resources

Resource URI

Description

xcsift://version

xcsift version and installation info

xcsift://config-template

Example .xcsift.toml configuration

xcsift://output-formats

Documentation about output formats

xcsift://help

Comprehensive help documentation

Available Prompts

Prompt

Description

Arguments

analyze_build_failure

Template for analyzing build failures

errors, code_context

fix_compiler_errors

Template for fixing Swift/ObjC compiler errors

errors, file_content

improve_test_coverage

Template for improving test coverage

coverage_report, target_coverage

debug_test_failures

Template for debugging test failures

test_output, test_code

fix_linker_errors

Template for fixing linker errors

linker_errors, project_structure

analyze_build_performance

Template for analyzing build performance

build_info

Development

Running Tests

pytest

Running Tests with Coverage

pytest --cov=xcsift_mcp

Code Formatting

ruff format . ruff check .

Project Structure

xcsift_mcp/ ├── src/xcsift_mcp/ │ ├── __init__.py # Package init │ ├── __main__.py # Entry point │ ├── server.py # FastMCP server │ ├── xcsift_installer.py # Auto-download xcsift │ ├── resources.py # MCP resources │ ├── prompts.py # Prompt templates │ └── tools/ │ ├── parse.py # Parsing tools │ └── build.py # Build execution tools ├── tests/ │ ├── fixtures/ # Sample build outputs │ └── test_*.py # Test files ├── pyproject.toml └── README.md

Architecture

┌─────────────────────────────────────────────────────────────────┐ │ AI Assistant (Claude, OpenCode, etc.) │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ MCP Protocol (stdio/HTTP) │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ xcsift MCP Server (Python) │ │ ┌─────────────────┐ ┌──────────────────┐ ┌────────────────┐ │ │ │ Tools (9) │ │ Resources (4) │ │ Prompts (6) │ │ │ │ - parse_output │ │ - version │ │ - analyze │ │ │ │ - xcodebuild │ │ - config │ │ - fix_errors │ │ │ │ - swift_build │ │ - formats │ │ - coverage │ │ │ │ - swift_test │ │ - help │ │ - debug │ │ │ └─────────────────┘ └──────────────────┘ └────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ xcsift CLI (subprocess) │ └─────────────────────────────────────────────────────────────────┘

Troubleshooting

xcsift not found

If xcsift cannot be downloaded automatically, install it manually:

brew install xcsift

Permission denied

Ensure the xcsift binary has execute permissions:

chmod +x ~/.local/share/xcsift-mcp/bin/xcsift

Build timeout

Increase the timeout parameter for long builds:

xcodebuild(scheme="MyApp", timeout=1200) # 20 minutes

License

MIT License - see LICENSE for details.

Credits

  • xcsift - The Swift CLI tool that does the actual parsing

  • MCP Python SDK - Model Context Protocol implementation

-
security - not tested
A
license - permissive license
-
quality - not tested

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/johnnyclem/xcsift-mcp'

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