Skip to content
Merged
3 changes: 2 additions & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"permissions": {
"allow": [
"Bash(swift package:*)"
"Bash(swift package:*)",
"Bash(swift build)"
],
"deny": [
"Bash(sudo:*)",
Expand Down
4 changes: 4 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,9 @@ let package = Package(
"SwiftAutoGUI"
]
),
.testTarget(
name: "swift-mcp-guiTests",
dependencies: ["swift-mcp-gui"]
),
]
)
253 changes: 0 additions & 253 deletions Sources/main.swift

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ extension Server {
func waitForDisconnection() async {
await withUnsafeContinuation { (_ continuation: UnsafeContinuation<Void, Never>) in }
}
}
}
67 changes: 67 additions & 0 deletions Sources/swift-mcp-gui/Server/MCPServer.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import Foundation
import MCP

final class MCPServer: @unchecked Sendable {
private let server: Server
private let toolRegistry: ToolRegistry

init() {
self.server = Server(
name: "mac-control-server",
version: "1.0.0",
capabilities: .init(
prompts: .init(listChanged: true),
tools: .init(listChanged: true)
)
)
self.toolRegistry = ToolRegistry()
}

func start(transport: StdioTransport) async throws {
print("Starting MCP GUI Server...")
try await server.start(transport: transport)

// Register all tools
toolRegistry.registerAllTools()

// Register method handlers
await registerMethodHandlers()

// Notify about tool list changes
try await server.notify(ToolListChangedNotification.message())
}

private func registerMethodHandlers() async {
// Register list tools handler
await server.withMethodHandler(ListTools.self) { [weak self] _ in
guard let self = self else {
return ListTools.Result(tools: [])
}
return ListTools.Result(tools: self.toolRegistry.listTools())
}

// Register call tool handler
await server.withMethodHandler(CallTool.self) { [weak self] params in
guard let self = self else {
return .init(content: [.text("Server not available")], isError: true)
}

let argumentsValue: Value
if let args = params.arguments {
argumentsValue = .object(args)
} else {
argumentsValue = .object([:])
}

do {
return try await self.toolRegistry.execute(name: params.name, arguments: argumentsValue)
} catch {
return .init(content: [.text("Error executing tool: \(error.localizedDescription)")], isError: true)
}
}
}

func waitForDisconnection() async {
await server.waitForDisconnection()
}
}
Loading