xcsift
FreeNot checkedWraps the xcsift CLI tool to parse Xcode build output into structured, token-efficient JSON or TOON formats, automatically managing the binary and providing too
About
Wraps the xcsift CLI tool to parse Xcode build output into structured, token-efficient JSON or TOON formats, automatically managing the binary and providing tools to execute build commands with automatic parsing and extract specific errors, warnings, and test failures with file/line details.
README
An MCP (Model Context Protocol) server that wraps xcsift, enabling AI coding assistants to parse Xcode build output into structured, token-efficient formats.
Overview
xcsift-mcp provides AI coding assistants (like Claude, OpenCode, Cursor, etc.) with tools to:
- Parse raw
xcodebuildorswift build/testoutput 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
Installing xcsift
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/johnnyclem/xcsift-mcpFAQ
Is xcsift MCP free?
Yes, xcsift MCP is free — one-click install via Unyly at no cost.
Does xcsift need an API key?
No, xcsift runs without API keys or environment variables.
Is xcsift hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install xcsift in Claude Desktop, Claude Code or Cursor?
Open xcsift on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare xcsift with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
