Periphery MCP Server
Enables AI assistants to perform Swift code audits and detect unused code in iOS/macOS projects using Periphery CLI.
README
Periphery MCP Server
A Model Context Protocol (MCP) server that wraps the Periphery tool, enabling AI assistants to perform Swift code audits and detect unused code in iOS/macOS projects.
Features
- 7 MCP Tools for comprehensive code analysis
- CLI Integration - Uses Periphery CLI for stability and version flexibility
- JSON Output - Structured, parseable results perfect for AI interpretation
- Flexible Scanning - Support for Xcode projects and Swift Packages
- Advanced Options - Full control over Periphery scan configurations
Quick Start
Using Homebrew (Recommended):
# 1. Install Periphery
brew install peripheryapp/periphery/periphery
# 2. Install Periphery MCP Server
brew tap zyntx-lab/tap
brew install periphery-mcp-server
# 3. Configure Claude Desktop
# Edit: ~/Library/Application Support/Claude/claude_desktop_config.json
# Add:
# "periphery": {
# "command": "/opt/homebrew/bin/periphery-mcp-server"
# }
# 4. Restart Claude Desktop (Cmd+Q then reopen)
# 5. Test it
# In Claude Desktop: "Check if Periphery is installed"
From Source:
# 1. Install Periphery
brew install peripheryapp/periphery/periphery
# 2. Clone and build this server
git clone https://github.com/zyntx-lab/periphery-mcp-server.git
cd periphery-mcp-server
swift build -c release
# 3. Install to system path
sudo cp .build/release/periphery-mcp-server /usr/local/bin/
sudo chmod +x /usr/local/bin/periphery-mcp-server
# 4. Configure Claude Desktop
# Edit: ~/Library/Application Support/Claude/claude_desktop_config.json
# Add:
# "periphery": {
# "command": "/usr/local/bin/periphery-mcp-server"
# }
# 5. Restart Claude Desktop (Cmd+Q then reopen)
# 6. Test it
# In Claude Desktop: "Check if Periphery is installed"
Prerequisites
- macOS 13.0 or later
- Swift 6.0 or later
- Periphery installed
Installing Periphery
brew install peripheryapp/periphery/periphery
Or download from Periphery releases.
Installation
Option 1: Homebrew (Recommended)
# Add the tap
brew tap zyntx-lab/tap
# Install the server
brew install periphery-mcp-server
# Verify installation
which periphery-mcp-server
# Should output: /opt/homebrew/bin/periphery-mcp-server
Option 2: Download from GitHub Releases
Download the latest binary from Releases:
# Download and install
curl -L https://github.com/zyntx-lab/periphery-mcp-server/releases/download/v1.0.0/periphery-mcp-server \
-o /usr/local/bin/periphery-mcp-server
chmod +x /usr/local/bin/periphery-mcp-server
# Verify installation
which periphery-mcp-server
# Should output: /usr/local/bin/periphery-mcp-server
Option 3: Build from Source
# Clone the repository
git clone https://github.com/zyntx-lab/periphery-mcp-server.git
cd periphery-mcp-server
# Build release version
swift build -c release
# Install to system path (requires password)
sudo cp .build/release/periphery-mcp-server /usr/local/bin/
sudo chmod +x /usr/local/bin/periphery-mcp-server
# Verify installation
which periphery-mcp-server
# Should output: /usr/local/bin/periphery-mcp-server
Option 4: Install from MCP Registry
The server is also available on the MCP Registry. Use your MCP-compatible client to install it directly.
Configuration
Claude Desktop
Step 1: Locate Your Config File
The config file is at: ~/Library/Application Support/Claude/claude_desktop_config.json
Step 2: Edit the Configuration
If you installed via Homebrew:
{
"mcpServers": {
"periphery": {
"command": "/opt/homebrew/bin/periphery-mcp-server"
}
}
}
If you installed to /usr/local/bin:
{
"mcpServers": {
"periphery": {
"command": "/usr/local/bin/periphery-mcp-server"
}
}
}
If you're using the build directory directly:
{
"mcpServers": {
"periphery": {
"command": "/FULL/PATH/TO/periphery-mcp-server/.build/release/periphery-mcp-server"
}
}
}
If you already have other MCP servers configured:
{
"mcpServers": {
"xcode": {
"command": "node",
"args": ["/path/to/xcode-mcp-server/dist/index.js"]
},
"periphery": {
"command": "/usr/local/bin/periphery-mcp-server"
}
}
}
Step 3: Restart Claude Desktop
Important: You must completely quit and restart Claude Desktop for changes to take effect.
- Quit Claude Desktop: Press
Cmd+Qor use Claude Desktop → Quit - Wait a few seconds
- Reopen Claude Desktop
Step 4: Verify It's Working
Open a new conversation in Claude Desktop and try:
"Check if Periphery is installed"
If configured correctly, Claude will use the check_periphery_installed tool and respond with installation status.
Testing with MCP Inspector
Before configuring Claude Desktop, you can test the server with the MCP Inspector:
# Install MCP Inspector (if not already installed)
npm install -g @modelcontextprotocol/inspector
# Test your server
npx @modelcontextprotocol/inspector /usr/local/bin/periphery-mcp-server
# Or if using build directory
npx @modelcontextprotocol/inspector /path/to/periphery-mcp-server/.build/release/periphery-mcp-server
The Inspector will open in your browser where you can test all tools interactively.
Other Editors
VS Code
Add to .vscode/mcp.json:
{
"mcpServers": {
"periphery": {
"type": "stdio",
"command": "/usr/local/bin/periphery-mcp-server"
}
}
}
Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"periphery": {
"type": "stdio",
"command": "/usr/local/bin/periphery-mcp-server"
}
}
}
Available Tools
1. check_periphery_installed
Verify that Periphery CLI is installed and accessible.
Parameters: None
Example Response:
{
"installed": true,
"path": "/usr/local/bin/periphery",
"message": "Periphery is installed and ready"
}
2. get_periphery_version
Get the installed version of Periphery.
Parameters: None
Example Response:
{
"version": "2.18.0",
"raw_output": "2.18.0"
}
3. scan_project
Run a basic Periphery scan on a project.
Parameters:
project_path(required): Path to .xcodeproj or Package.swiftschemes(optional): Build schemes to scan (Xcode only)targets(optional): Specific targets to analyzeformat(optional): Output format: json, xcode, csv, checkstyle (default: json)
Example Response:
{
"success": true,
"results": [
{
"kind": "class",
"name": "UnusedClass",
"modifiers": ["public"],
"location": "Sources/MyApp/UnusedClass.swift:10:7"
}
],
"summary": {
"total_unused": 5,
"by_kind": {"class": 2, "function": 3}
}
}
4. scan_with_config
Run Periphery scan using a YAML configuration file.
Parameters:
config_path(required): Path to .periphery.yml config file
5. analyze_unused_imports
Focus specifically on detecting unused imports.
Parameters:
project_path(required): Path to .xcodeproj or Package.swiftschemes(optional): Build schemes to scantargets(optional): Specific targets to analyze
6. find_redundant_public
Identify public declarations that could be internal.
Parameters:
project_path(required): Path to .xcodeproj or Package.swiftschemes(optional): Build schemes to scantargets(optional): Specific targets to analyze
7. scan_with_options
Advanced scanning with custom Periphery flags.
Parameters:
project_path(required): Path to .xcodeproj or Package.swiftschemes(optional): Build schemes to scantargets(optional): Specific targets to analyzeformat(optional): Output formatretain_public(optional): Retain all public declarationsretain_objc_accessible(optional): Retain @objc declarationsdisable_unused_import_analysis(optional): Disable unused import analysisindex_store_path(optional): Custom index store locationverbose(optional): Enable verbose output
Usage Examples
With Claude Desktop
Once configured, you can have natural conversations with Claude about your code:
Check Installation:
You: "Check if Periphery is installed"
Claude: [Uses check_periphery_installed]
"Yes, Periphery is installed at /usr/local/bin/periphery
Version: 2.18.0"
Scan a Project:
You: "Scan my iOS project at ~/Projects/MyApp/MyApp.xcodeproj for unused code"
Claude: [Uses scan_project]
"I found 15 unused declarations in your project:
Classes (5):
- UnusedViewController at MyApp/UnusedViewController.swift:10
- OldDataManager at MyApp/Models/OldDataManager.swift:25
...
Functions (8):
- helperFunction at Utils/Helpers.swift:42
...
Imports (2):
- UIKit in DataModel.swift:1
..."
Find Redundant Public:
You: "Check which public declarations could be made internal in ~/Projects/MyFramework"
Claude: [Uses find_redundant_public]
"Found 12 public declarations that are only used internally and could be made internal:
- public class InternalHelper (only used within the framework)
- public func formatDate() (only called from within the module)
..."
Analyze Unused Imports:
You: "Find unused imports in my Swift package"
Claude: [Uses analyze_unused_imports]
"Found 8 unused imports that can be safely removed:
- Foundation in Models/User.swift (not using any Foundation APIs)
- Combine in ViewModels/ProfileViewModel.swift (Combine is imported but not used)
..."
With Custom Configuration
Create .periphery.yml in your project:
project: MyApp.xcodeproj
schemes:
- MyApp
targets:
- MyApp
- MyAppKit
format: json
retain_public: false
retain_objc_accessible: true
verbose: false
Then use scan_with_config:
You: "Scan my project using the custom config"
Troubleshooting
Server Not Appearing in Claude Desktop
Symptoms: Claude doesn't recognize Periphery tools after configuration
Solutions:
-
Verify config file syntax:
# Check for JSON syntax errors cat ~/Library/Application\ Support/Claude/claude_desktop_config.json | python3 -m json.tool -
Check the binary path is correct:
# Test that the binary exists and runs /usr/local/bin/periphery-mcp-server # Or your custom path /path/to/.build/release/periphery-mcp-server -
Completely restart Claude Desktop:
- Press
Cmd+Qto quit (not just close the window) - Wait 5 seconds
- Reopen Claude Desktop
- Start a new conversation (old conversations won't see new servers)
- Press
-
Check Claude Desktop logs:
# View logs for errors tail -f ~/Library/Logs/Claude/mcp*.log
Periphery Not Found
If you get "Periphery is not installed":
- Install Periphery:
brew install peripheryapp/periphery/periphery - Verify installation:
which periphery - Restart Claude Desktop/VS Code/Cursor
- Try the
check_periphery_installedtool again
MCP Inspector Connection Errors
If the Inspector can't connect to the server:
-
Verify the server runs:
# Server should wait for input, not exit immediately /usr/local/bin/periphery-mcp-server # Press Ctrl+C to exit -
Check for errors:
# Run with verbose output /usr/local/bin/periphery-mcp-server 2>&1 | tee server.log -
Use the absolute path:
npx @modelcontextprotocol/inspector $(which periphery-mcp-server)
Scan Timeout
Default timeout is 5 minutes. For large projects:
- Use
scan_with_configwith a focused configuration - Scan specific targets instead of the entire project
- Use
--index-store-pathto reuse build artifacts - Build your project in Xcode first to generate the index
No Results or Empty Scan
Periphery requires a compiled project with an index store:
- Build your project first in Xcode (Cmd+B)
- Ensure schemes are shared:
- Xcode → Product → Scheme → Manage Schemes
- Check the "Shared" checkbox for your scheme
- Verify the project path:
# For Xcode projects ls /path/to/YourProject.xcodeproj # For Swift Packages ls /path/to/Package.swift - Check Periphery can access the project:
# Test Periphery directly periphery scan --project /path/to/YourProject.xcodeproj --schemes YourScheme
Permission Denied
If you get "Permission denied" when running the server:
# Make the binary executable
chmod +x /usr/local/bin/periphery-mcp-server
# Or for build directory
chmod +x .build/release/periphery-mcp-server
Architecture
This server uses the CLI approach rather than importing Periphery as a library for maximum stability:
- ✅ CLI interface is Periphery's public API contract
- ✅ Survives internal Periphery refactorings
- ✅ Users can update Periphery independently
- ✅ Simpler dependency management
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Submit a pull request
License
MIT License - see LICENSE file for details.
Related Projects
- Periphery - The underlying code analysis tool
- Model Context Protocol - The protocol specification
- MCP Swift SDK - Official Swift SDK for MCP
- MCP Registry - Official MCP server registry
- MCP Community Servers - Collection of community MCP servers
Distribution Channels
This server is available through multiple channels:
- MCP Registry: registry.modelcontextprotocol.io
- Homebrew Tap: github.com/zyntx-lab/homebrew-tap
- GitHub Releases: github.com/zyntx-lab/periphery-mcp-server/releases
- Community Servers: Listed in modelcontextprotocol/servers
Support
- Issues: GitHub Issues
- Periphery Docs: Periphery Guide
- MCP Docs: MCP Specification
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。