Skip to content

Commit a62e51a

Browse files
authored
Make CallTool.Result.isError optional (#11)
1 parent 154cf61 commit a62e51a

File tree

4 files changed

+23
-9
lines changed

4 files changed

+23
-9
lines changed

Sources/MCP/Client/Client.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ public actor Client {
344344
}
345345

346346
public func callTool(name: String, arguments: [String: Value]? = nil) async throws -> (
347-
content: [Tool.Content], isError: Bool
347+
content: [Tool.Content], isError: Bool?
348348
) {
349349
_ = try checkCapability(\.tools, "Tools")
350350
let request = CallTool.request(.init(name: name, arguments: arguments))

Sources/MCP/Server/Tools.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ public enum CallTool: Method {
154154

155155
public struct Result: Hashable, Codable, Sendable {
156156
public let content: [Tool.Content]
157-
public let isError: Bool
157+
public let isError: Bool?
158158

159-
public init(content: [Tool.Content], isError: Bool) {
159+
public init(content: [Tool.Content], isError: Bool? = nil) {
160160
self.content = content
161161
self.isError = isError
162162
}

Tests/MCPTests/RoundtripTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ struct RoundtripTests {
5252
}
5353

5454
guard let a = request.arguments?["a"]?.intValue,
55-
let b = request.arguments?["b"]?.intValue
55+
let b = request.arguments?["b"]?.intValue
5656
else {
5757
return CallTool.Result(
5858
content: [.text("Did not receive valid arguments")], isError: true)
5959
}
6060

61-
return CallTool.Result(content: [.text("\(a + b)")], isError: false)
61+
return CallTool.Result(content: [.text("\(a + b)")])
6262
}
6363

6464
let client = Client(name: "TestClient", version: "1.0")
@@ -96,7 +96,7 @@ struct RoundtripTests {
9696

9797
let callToolTask = Task {
9898
let result = try await client.callTool(name: "add", arguments: ["a": 1, "b": 2])
99-
#expect(result.isError == false)
99+
#expect(result.isError == nil)
100100
#expect(result.content == [.text("3")])
101101
}
102102

Tests/MCPTests/ToolTests.swift

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,16 @@ struct ToolTests {
139139
#expect(params.arguments?["param2"] == .int(42))
140140
}
141141

142-
@Test("CallTool result validation")
142+
@Test("CallTool success result validation")
143143
func testCallToolResult() throws {
144144
let content = [
145145
Tool.Content.text("Result 1"),
146146
Tool.Content.text("Result 2"),
147147
]
148148

149-
let result = CallTool.Result(content: content, isError: false)
149+
let result = CallTool.Result(content: content)
150150
#expect(result.content.count == 2)
151-
#expect(result.isError == false)
151+
#expect(result.isError == nil)
152152

153153
if case .text(let text) = result.content[0] {
154154
#expect(text == "Result 1")
@@ -157,6 +157,20 @@ struct ToolTests {
157157
}
158158
}
159159

160+
@Test("CallTool error result validation")
161+
func testCallToolErrorResult() throws {
162+
let errorContent = [Tool.Content.text("Error message")]
163+
let errorResult = CallTool.Result(content: errorContent, isError: true)
164+
#expect(errorResult.content.count == 1)
165+
#expect(errorResult.isError == true)
166+
167+
if case .text(let text) = errorResult.content[0] {
168+
#expect(text == "Error message")
169+
} else {
170+
#expect(Bool(false), "Expected error text content")
171+
}
172+
}
173+
160174
@Test("ToolListChanged notification name validation")
161175
func testToolListChangedNotification() throws {
162176
#expect(ToolListChangedNotification.name == "notifications/tools/list_changed")

0 commit comments

Comments
 (0)