What problem does it solve? Building LLM integrations with tool calling requires type-safe tool definitions, validated parameters, structured failure handling, and composable toolkits, which is error-prone when done ad hoc with raw JSON schemas. ## Core Features & Use Cases - User-Defined Tools: Create tools with Tool.make using Schema.Struct parameters, success/failure schemas, failureMode strategies, and service dependencies. - Toolkit Composition: Combine tools with Toolkit.make, implement handlers via toLayer or toHandlers, and execute them through toolkit.handle streams with preliminary progress results. - Provider-Defined & Dynamic Tools: Integrate provider-native capabilities like OpenAI WebSearch and FileSearch via Tool.providerDefined and OpenAiTool, plus runtime-discovered tools via Tool.dynamic. - Use Case: Build a coding agent that exposes read-file and query-database tools to an LLM, with tagged-error failures, approval flows for destructive operations, and dependency-injected handlers. ## Quick Start Ask the AI to define an Effect AI tool with Tool.make that has typed parameters, a success schema, and a handler implemented through Toolkit.toLayer.