Mirror of https://github.com/modelcontextprotocol/swift-sdk — The official Swift SDK for Model Context Protocol servers and clients.
  • Swift 99.8%
  • Shell 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Mattt 1f5f8d64b9
Add configurable strict mode for MCP server initialization (#3)
Adds a Configuration struct to control server behavior around client initialization.
When strict mode is enabled, server enforces MCP spec requiring clients to initialize
before sending requests. Default mode is more permissive for non-compliant clients.
2025-03-04 06:02:43 -08:00
.github/workflows Add CI workflow (#1) 2025-02-11 15:26:39 -08:00
.vscode Initial implementation 2025-02-11 15:22:35 -08:00
Sources/MCP Add configurable strict mode for MCP server initialization (#3) 2025-03-04 06:02:43 -08:00
Tests/MCPTests Temporarily comment out hanging test 2025-02-11 15:22:41 -08:00
.gitignore Initial commit 2025-02-05 11:13:57 -08:00
LICENSE Initial implementation 2025-02-11 15:22:35 -08:00
Package.resolved Initial implementation 2025-02-11 15:22:35 -08:00
Package.swift Initial implementation 2025-02-11 15:22:35 -08:00
README.md Bump version to 0.2.0 2025-02-27 14:51:39 -08:00

MCP Swift SDK

Swift implementation of the Model Context Protocol (MCP).

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.2.0")
]

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(
        resources: .init(
            list: true,
            read: true,
            subscribe: true
        )
    )
)

// 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.