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.

Installation

Prerequisites

  • Python 3.10+

  • macOS (xcsift is macOS-only)

  • pipx (install via brew install pipx)

Install from source

git clone https://github.com/johnnyclem/xcsift_mcp.git
cd xcsift_mcp
pipx install -e ".[dev]"

Install via Homebrew

brew install johnnyclem/xcsift-mcp/xcsift-mcp

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/.

You can also install it manually via Homebrew:

brew install xcsift

Usage

Running the Server

# Run with stdio transport (default, for Claude Desktop/OpenCode)
xcsift-mcp

# Run with HTTP transport (for debugging/web clients)
xcsift-mcp --transport http --port 8000

Integration with AI Assistants

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "xcsift": {
      "command": "xcsift-mcp"
    }
  }
}

OpenCode

Add to your opencode.json (or opencode.jsonc):

{
  "mcp": {
    "xcsift": {
      "type": "local",
      "command": ["xcsift-mcp"]
    }
  }
}

Alternatively, run opencode mcp add and follow the interactive prompts.

Cursor

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

{
  "mcpServers": {
    "xcsift": {
      "command": "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