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.core microservice exposes bus tools to LLM clients via the Model Context Protocol.
  • New shell.core microservice runs shell commands on the bus.
  • Native OpenAPI in the connector: :888/openapi.json is 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 symmetric svc.Unsubscribe(name).
  • *api/endpoints.go uses Def{Method, Route} literals with a URL() helper instead of *openapi.Endpoint variables.
  • LLM Chat accepts a []string of canonical endpoint URLs and fetches each host’s OpenAPI document at chat time. llmapi.ToolsOf is gone.
  • The openaillm provider was renamed to chatgptllm (hostname chatgpt.llm.core).
  • OpenAPI portal rewritten as a JSON aggregate (//openapi.json) plus a Swagger-UI-style HTML Explorer.

Breaking Changes

Tell your agent to upgrade microbus on your project to migrate. It drives the mechanical reshape end-to-end (delegating to regenerate-boilerplate per microservice). Doing this by hand across a multi-service project is not recommended.

  • *api/endpoints.go reshape. *openapi.Endpoint vars and the package-level Service *openapi.Service are gone. Each feature is now a Def{Method, Route} literal with a URL() helper. Description, claims, and feature metadata move into the svc.Subscribe(...) block in intermediate.go.
  • svc.Subscribe is now typed. The untyped positional form svc.Subscribe(method, route, handler, opts...) is removed. New shape: svc.Subscribe("Name", handler, sub.At(method, route), sub.Description(...), sub.Function(In{}, Out{})) (or sub.Web(), sub.Task(...), sub.Workflow(...)). svc.Unsubscribe(name) is the symmetric removal.
  • Per-service OpenAPI handlers removed. The connector serves /openapi.json on :888 directly. Per-service doOpenAPI handlers and generated Test*_OpenAPI tests are gone.
  • External :0/openapi.json no longer reachable. External consumers must go through the OpenAPI portal.
  • controlapi.OpenAPI route and fetch shape changed. Route is now :888/openapi.json; fetch via controlapi.NewClient(svc).ForHost(host).OpenAPI(ctx) instead of WithOptions(pub.URL(...)).
  • OpenAPI schema component keys are prefixed by hostname. Foo_OUT becomes myservice_example__Foo_OUT. Code that reads components.schemas by hard-coded key needs the new naming. (error_StreamedError is intentionally not prefixed.)
  • openapi package reshape. openapi.Doc renamed to openapi.Document. The openapi/doc subpackage was inlined into openapi.
  • OpenAPI portal API changed. openapiportalapi.Client.List(...) is gone. Use Document(...) for the JSON aggregate or Explorer(...) for HTML.
  • LLM Chat signature changed. Third argument is now []string of canonical endpoint URLs (e.g. calculatorapi.Arithmetic.URL()). llmapi.ToolsOf and caller-built llmapi.Tool literals are removed.
  • openaillm renamed to chatgptllm. Hostname openai.llm.corechatgpt.llm.core. Update imports and main/main.go.
  • JWT iss claim shape changed. The microbus:// scheme in iss is replaced with a dedicated microbus claim; the original identity provider is exposed in idp.
  • Unsigned-token claims now enforced in TESTING. RequiredClaims are 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.ExternalizeURL resolves a service-relative URL to its externally reachable form via the HTTP ingress proxy.
  • The connector now serves /openapi.json on :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.json mirror is registered with the default queue so consumers can multicast and gather every service’s document in one bus call.
  • Per-service doOpenAPI handlers and the generated Test*_OpenAPI tests are retired. The connector-level test in connector/control_test.go covers 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.Infra options.
  • svc.Unsubscribe(name) is the symmetric removal.

API Package Layout

  • *api/endpoints.go declares the Hostname constant, In/Out struct types, a Def{Method, Route} struct type with a URL() helper, and a package-level var (...) block of Def literals (one per feature).
  • *openapi.Endpoint variables and the package-level Service *openapi.Service are gone. Description, claim, and feature metadata move into the svc.Subscribe(...) block in intermediate.go.

OpenAPI Portal

  • Document at //openapi.json:0 — JSON aggregate covering every service. With ?hostname=X it proxies to that single service.
  • Explorer at //openapi:0 — Swagger-UI-style HTML browser. Lists services or, with ?hostname=X, expands a single service’s endpoints.
  • openapiportalapi.Client.List(...) is gone; use Document(...) or Explorer(...).

LLM and Tooling

  • llmapi.Chat takes []string of 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, and FeatureWorkflow endpoints are exposed; tasks and outbound events are filtered out at the OpenAPI document level.
  • llm.core orchestrates the tool-calling loop and dispatches workflow tools as dynamic subgraphs.
  • openaillm was renamed to chatgptllm with hostname chatgpt.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.example microservice demonstrating the LLM tool-calling flow with a mock provider.