---
slug: "zio"
source_type: "readme"
source_url: "https://cdn.jsdelivr.net/gh/otobrglez/zio-ella@master/README.md"
repo: "https://github.com/otobrglez/zio-ella"
source_file: "README.md"
branch: "master"
---
# zio-ella

[zio-ella] is a framework for writing [MCP (Model Context Protocol)][mcp] servers for modern AI platforms with Scala 3
and [ZIO] with `zio-http`.

> ⚠️ The project is in its early phase and is bound to rapid change. Please feel free to reach-out with ideas and use-cases.

Example capabilities and tools definition within a service might look like:

```scala 3
import zio.ZIO
import zio.dev.ella.*

object MyService:
  val capabilities = Capabilities(
    // Tool that only returns current server time
    Tool("get-time") -> { _ =>
      zio.Clock.instant.map(_.toString)
    },

    // Exemple tool to get where we accept city as an argument.
    Tool("get-weather", ArgDef.string("city")) -> {
      _.string("city").flatMap(city => ZIO.succeed(s"Weather in $city is sunny!"))
    }
  )

  def run = MCPServer(capabilities).run
```

Integration with the ZIO Stack as follows:

```scala 3
object Main extends ZIOAppDefault:
  def program = for
    _ <- logInfo("Booting...")
    _ <- MyService.run
  yield ()

  def configuredServer: TaskLayer[Server] =
    ZLayer
      .fromZIO(ZIO.config(Config.int("port")).tap(port => logInfo(s"Starting server on port $port")))
      .flatMap(portEnv => Server.defaultWithPort(portEnv.get))

  def run = program.provide(configuredServer)
```

## Resources

- [MCP Protocol Tutorial](https://www.claudemcp.com/)
- [Anthropic / Model Context Protocol (MCP)](https://docs.anthropic.com/en/docs/agents-and-tools/mcp)
- [MCP Inspector](https://github.com/modelcontextprotocol/inspector)

[ZIO]: https://zio.dev

[zio-ella]: https://github.com/otobrglez/zio-ella

[mcp]: https://modelcontextprotocol.io/introduction