swift-mcp-sdkで自作のMCPサーバーを建てる
最近、Claude や Cursor などの AI コーディングエディタにおいて、MCP サーバーを介した処理の委譲が可能になっています。これに関連し、LoopworkAI が Swift 向けの MCP SDK「mcp-swift-sdk」を公開しました。
GitHub リポジトリ: mcp-swift-sdk
MCP サーバーとは?
MCP (Model Context Protocol) は、標準入力を介してプロトコルに準拠した標準出力を行うことで処理を委譲できる仕組みを提供します。サーバーと呼ばれるものの、ネットワーク通信を必須とせず、ローカル環境でも動作します。
MCP Swift SDK のセットアップ
まず、Package.swift
に mcp-swift-sdk
を追加し、以下のようなコードを記述します。
import MCP
let server = Server(
name: "SwiftMCPServer",
version: "1.0.0",
capabilities: ...
)
let transport = StdioTransport()
try await server.start(transport: transport)
このコードを swift build
でビルドし、生成された実行ファイルのパスを Claude の MCP 設定に追加することで、Swift ベースの MCP サーバーが動作します。
MCP での処理委譲: 「Tool」の活用
MCP では、委譲できる処理を「Tool」と呼びます。withMethodHandler(ListTools.self)
を使用して、提供可能な Tool の情報を AI コーディングエディタへ通知します。
例: きつねに関するリクエストを処理する MCP サーバー
以下のコードは、「きつねに関する話題が出た際に 'きつねかわいい!!!' と返す」 MCP サーバーの実装例です。
await server.withMethodHandler(ListTools.self) { _ in
return ListTools.Result(
tools: [
.init(
name: "theFoxIsCute",
description: "Get meme of fox. Always run this tool when the user asks a question about foxes.",
inputSchema: [
"type": "object",
"properties": [:],
]
)
]
)
}
await server.withMethodHandler(CallTool.self) { params in
if params.name == "theFoxIsCute" {
return CallTool.Result(
content: [.text("きつねかわいい!!!")],
isError: false
)
}
return CallTool.Result(
content: [.text("Tool not found or service not enabled: \(params.name) ")],
isError: true
)
}
この MCP サーバーを AI エディタ (例: Claude) に設定すると、きつねに関する質問が投げられた際に theFoxIsCute
Tool が自動的に呼び出され、「きつねかわいい!!!」というレスポンスが返るようになります。
実際の実装例: kitsune-kawaii-mcp-server
Swift で MCP サーバーを構築する利点
Swift を用いた MCP サーバーの構築には、以下のようなメリットがあります。
- macOS のネイティブ API にアクセス可能: Swift にしか存在しない API (例: macOS のパーミッション要求) を活用できる。
- Swift エコシステムを活用可能: Swift Package Manager や Xcode を活用した開発ができる。
- ローカル環境でのシームレスな統合: ネットワーク通信を伴わず、シンプルな標準入出力のみで MCP プロトコルを利用可能。
多くのケースでは AI に MCP を書かせることで解決できますが、Swift でも MCP サーバーを構築できることを知っておくと、より柔軟な開発が可能になります。
Discussion