Early EffectheddleGitHub
capability compiler · JVM · Node · Native

One bind. Three runtimes.

Write the service once. HTTP, OpenAPI, and MCP are hosts of the same BoundOp. Server.install is that bind on the JVM, on Node, and on Scala Native. CLI is a later interpreter. Not a second product.

capability compiler
BoundOp

getShow

Endpoint + In => ZIO[R, E, Out]. Written once.

GET/shows/{id}.mcpReadOnly
HTTP

api.routes. Humans and systems.

OpenAPI

api.openApi. Swagger at /docs.

MCP HTTP

Mcp.from(api). POST /mcp.

stdio

mcp.stdio(). Local harnesses.

CLI

Same OpArgs. Not shipped. The AST is already this shape.

GET /shows/1 HTTP/1.1

HTTP/1.1 200 OK
content-type: application/json

{"id":1,"name":"Evening bill"}

Hosts are interpreters. Do not grow a second tool DSL.

box office · a web client
GET /shows/1
Evening bill
GET /shows/2
Matinee
GET /shows/3
Late bill
GET /shows/1 is get_show

Evening bill

12 remaining

GET /shows/1 HTTP/1.1

HTTP/1.1 200 OK
content-type: application/json

{"id":1,"name":"Evening bill"}

Same bind the tests run. Replay of the AST, not a hosted server. Clone and sbt example/run for the JVM process. The same Routes also bind on Node and Native.

The hubInstall

read the compiler