v1.27.0 — OpenAPI, LLM Tooling, MCP, Shell
Released 2026-04-30. GitHub release.
Release v1.27.0 reshapes the OpenAPI surface and the way LLMs call tools on the bus. The connector now serves /openapi.json natively on :888, the typed svc.Subscribe(name, handler, opts...) API replaces the untyped form, and *api/endpoints.go switches to lightweight Def{Method, Route} literals. New mcp.core and shell.core microservices land, the OpenAI provider is renamed to chatgptllm, and the OpenAPI portal is rewritten as a JSON aggregate plus a Swagger-UI-style explorer.
Highlights
- New
mcp.coremicroservice exposes bus tools to LLM clients via the Model Context Protocol. - New
shell.coremicroservice runs shell commands on the bus. - Native OpenAPI in the connector:
:888/openapi.jsonis served built-in, walked from the live subscription map and filtered by actor claims. - Typed
svc.Subscribe(name, handler, opts...)API replaces the untyped positional form, with a symmetricsvc.Unsubscribe(name). *api/endpoints.gousesDef{Method, Route}literals with aURL()helper instead of*openapi.Endpointvariables.- LLM
Chataccepts a[]stringof canonical endpoint URLs and fetches each host’s OpenAPI document at chat time.llmapi.ToolsOfis gone. - The
openaillmprovider was renamed tochatgptllm(hostnamechatgpt.llm.core). - OpenAPI portal rewritten as a JSON aggregate (
//openapi.json) plus a Swagger-UI-style HTMLExplorer.
Breaking Changes
Tell your agent to
upgrade microbuson your project to migrate. It drives the mechanical reshape end-to-end (delegating toregenerate-boilerplateper microservice). Doing this by hand across a multi-service project is not recommended.
*api/endpoints.goreshape.*openapi.Endpointvars and the package-levelService *openapi.Serviceare gone. Each feature is now aDef{Method, Route}literal with aURL()helper. Description, claims, and feature metadata move into thesvc.Subscribe(...)block inintermediate.go.svc.Subscribeis now typed. The untyped positional formsvc.Subscribe(method, route, handler, opts...)is removed. New shape:svc.Subscribe("Name", handler, sub.At(method, route), sub.Description(...), sub.Function(In{}, Out{}))(orsub.Web(),sub.Task(...),sub.Workflow(...)).svc.Unsubscribe(name)is the symmetric removal.- Per-service OpenAPI handlers removed. The connector serves
/openapi.jsonon:888directly. Per-servicedoOpenAPIhandlers and generatedTest*_OpenAPItests are gone. - External
:0/openapi.jsonno longer reachable. External consumers must go through the OpenAPI portal. controlapi.OpenAPIroute and fetch shape changed. Route is now:888/openapi.json; fetch viacontrolapi.NewClient(svc).ForHost(host).OpenAPI(ctx)instead ofWithOptions(pub.URL(...)).- OpenAPI schema component keys are prefixed by hostname.
Foo_OUTbecomesmyservice_example__Foo_OUT. Code that readscomponents.schemasby hard-coded key needs the new naming. (error_StreamedErroris intentionally not prefixed.) openapipackage reshape.openapi.Docrenamed toopenapi.Document. Theopenapi/docsubpackage was inlined intoopenapi.- OpenAPI portal API changed.
openapiportalapi.Client.List(...)is gone. UseDocument(...)for the JSON aggregate orExplorer(...)for HTML. - LLM
Chatsignature changed. Third argument is now[]stringof canonical endpoint URLs (e.g.calculatorapi.Arithmetic.URL()).llmapi.ToolsOfand caller-builtllmapi.Toolliterals are removed. openaillmrenamed tochatgptllm. Hostnameopenai.llm.core→chatgpt.llm.core. Update imports andmain/main.go.- JWT
issclaim shape changed. Themicrobus://scheme inissis replaced with a dedicatedmicrobusclaim; the original identity provider is exposed inidp. - Unsigned-token claims now enforced in
TESTING.RequiredClaimsare evaluated against unsigned JWTs as well. - OpenAPI path parameters no longer carry
style: deepObject. Query-only per OpenAPI 3.1; the rendered document is now spec-compliant.
Connector
Connector.ExternalizeURLresolves a service-relative URL to its externally reachable form via the HTTP ingress proxy.- The connector now serves
/openapi.jsonon:888(the control-plane port). Endpoints across every port are returned, filtered by the caller’s claims; consumers apply any port-based filtering at their own ingress boundary. A parallel//all:888/openapi.jsonmirror is registered with the default queue so consumers can multicast and gather every service’s document in one bus call. - Per-service
doOpenAPIhandlers and the generatedTest*_OpenAPItests are retired. The connector-level test inconnector/control_test.gocovers the OpenAPI surface.
Subscription API
- New typed registration:
svc.Subscribe("Name", handler, sub.At(method, route), sub.Description(...), sub.Function(In{}, Out{})). The untyped positional form is gone. - New
sub.At,sub.Description,sub.Function,sub.Web,sub.InboundEvent,sub.Task,sub.Workflow,sub.Infraoptions. svc.Unsubscribe(name)is the symmetric removal.
API Package Layout
*api/endpoints.godeclares theHostnameconstant, In/Out struct types, aDef{Method, Route}struct type with aURL()helper, and a package-levelvar (...)block ofDefliterals (one per feature).*openapi.Endpointvariables and the package-levelService *openapi.Serviceare gone. Description, claim, and feature metadata move into thesvc.Subscribe(...)block inintermediate.go.
OpenAPI Portal
Documentat//openapi.json:0— JSON aggregate covering every service. With?hostname=Xit proxies to that single service.Explorerat//openapi:0— Swagger-UI-style HTML browser. Lists services or, with?hostname=X, expands a single service’s endpoints.openapiportalapi.Client.List(...)is gone; useDocument(...)orExplorer(...).
LLM and Tooling
llmapi.Chattakes[]stringof canonical endpoint URLs (e.g.calculatorapi.Arithmetic.URL()) as the third argument. The LLM service fetches each host’s OpenAPI document, locates the matching operation, and converts it into a callable tool.- Endpoints from multiple services can be combined. Only
FeatureFunction,FeatureWeb, andFeatureWorkflowendpoints are exposed; tasks and outbound events are filtered out at the OpenAPI document level. llm.coreorchestrates the tool-calling loop and dispatches workflow tools as dynamic subgraphs.openaillmwas renamed tochatgptllmwith hostnamechatgpt.llm.core.
New Core Microservices
mcp.core(coreservices/mcpportal) — exposes the bus’s tools to LLM clients via the Model Context Protocol.shell.core(coreservices/shell) — runs shell commands as a bus service.
Examples
- New
chatbox.examplemicroservice demonstrating the LLM tool-calling flow with a mock provider.