The previous article analyzed how the Agent Loop works, including one crucial step: "execute tools." When the LLM says "I need to call Bash," the SDK actually spawns a process to run the command. But the tool system behind this is far more nuanced than simply "calling a function." How are 34 built-in tools organized? How do you safely convert the LLM's JSON input into Swift types? How do you control which tools are available? This article starts from the protocol definition and examines the Open Agent SDK tool system layer by layer. ToolProtocol: What a Tool Looks Like Every tool in the SDK conforms to the ToolProtocol protocol: public protocol ToolProtocol : Sendable { var name : String { get } var description : String { get } var inputSchema : ToolInputSchema { get } var isReadOnly : Bool { get } var annotations : ToolAnnotations ? { get } func call ( input : Any , context : ToolContext ) async -> ToolResult } Enter fullscreen mode Exit fullscreen mode Five properties and one method.β¦