MCP Swift SDK
Swift SDK for Model Context Protocol

Description

Swift SDK implementation of the Model Context Protocol (MCP).

Details

Type

SDK

MCP Swift SDK

Swift implementation of the Model Context Protocol (MCP).

[!TIP] To see it in action, check out the iMCP app.

Requirements

  • Swift 6.0+ / Xcode 16+
  • macOS 14.0+ (Sonoma)
  • iOS 17.0+

Installation

Swift Package Manager

Add the following to your Package.swift file:

dependencies: [ .package(url: "https://github.com/loopwork-ai/mcp-swift-sdk.git", from: "0.5.1") ]

Usage

Basic Client Setup

import MCP // Initialize the client let client = Client(name: "MyApp", version: "1.0.0") // Create a transport and connect let transport = StdioTransport() try await client.connect(transport: transport) // Initialize the connection let result = try await client.initialize()

Basic Server Setup

import MCP // Initialize the server with capabilities let server = Server( name: "MyServer", version: "1.0.0", capabilities: .init( prompts: .init(), resources: .init( subscribe: true ), tools: .init() ) ) // Create transport and start server let transport = StdioTransport() try await server.start(transport: transport) // Register method handlers server.withMethodHandler(ReadResource.self) { params in // Handle resource read request let uri = params.uri let content = [Resource.Content.text("Example content")] return .init(contents: content) } // Register notification handlers server.onNotification(ResourceUpdatedNotification.self) { message in // Handle resource update notification } // Stop the server when done await server.stop()

Working with Tools

// List available tools let tools = try await client.listTools() // Call a tool let (content, isError) = try await client.callTool( name: "example-tool", arguments: ["key": "value"] ) // Handle tool content for item in content { switch item { case .text(let text): print(text) case .image(let data, let mimeType, let metadata): // Handle image data } }

Working with Resources

// List available resources let (resources, nextCursor) = try await client.listResources() // Read a resource let contents = try await client.readResource(uri: "resource://example") // Subscribe to resource updates try await client.subscribeToResource(uri: "resource://example") // Handle resource updates await client.onNotification(ResourceUpdatedNotification.self) { message in let uri = message.params.uri let content = message.params.content // Handle the update }

Working with Prompts

// List available prompts let (prompts, nextCursor) = try await client.listPrompts() // Get a prompt with arguments let (description, messages) = try await client.getPrompt( name: "example-prompt", arguments: ["key": "value"] )

License

This project is licensed under the Apache License, Version 2.0.