Ikanos — Schema — Exposes¶
The exposes array declares the server adapters that surface a capability to
the outside world. Each entry is a discriminated object on type: —
rest, mcp, skill, or control.
capability:
exposes:
- type: mcp
port: 3001
namespace: shipyard-tools
tools: { ... } # keyed map by tool name
- type: rest
port: 3002
namespace: shipyard-api
resources: { ... } # keyed map by resource name
- type: skill
port: 3003
namespace: shipyard-skills
skills: [...]
- type: control
port: 9090
namespace: control
observability: {...}
REST Expose (type: rest)¶
| Field | Required | Description |
|---|---|---|
type |
✅ | "rest" |
port |
✅ | TCP port (1–65535) |
namespace |
✅ | Unique identifier for this exposed API |
address |
Hostname, IPv4, or IPv6; default 0.0.0.0 |
|
authentication |
Bearer, API key, Basic, Digest | |
resources |
✅ | At least one exposed resource (keyed map) |
ExposedResource¶
resources: # keyed map; key IS the resource name
ships:
path: "/ships"
description: "Fleet of ships"
operations: { ... }
# — or, for pure pass-through:
forward:
targetNamespace: registry
ExposedOperation (simple mode)¶
operations: # keyed map; key IS the operation name
get-ship:
method: GET
path: "/ships/{imo}"
inputParameters: # keyed map
imo: { in: path, required: true }
call: registry.get-ship
with:
imo_number: shipyard-api.imo
outputParameters: [...]
ExposedOperation (orchestrated mode)¶
operations:
build-manifest:
method: GET
path: "/manifests/{voyageId}"
inputParameters:
voyageId: { in: path, required: true }
steps: { ... } # keyed map (see Steps page)
mappings: [...]
Exactly one of call: or steps: must be present. Using ref: is a
third option — see Aggregates.
MCP Expose (type: mcp)¶
| Field | Required | Description |
|---|---|---|
type |
✅ | "mcp" |
port |
✅ | TCP port (omit for stdio transport) |
namespace |
✅ | Unique identifier |
transport |
"http" (default) or "stdio" |
|
description |
Server-level description shown to MCP clients | |
authentication |
Bearer or API key | |
tools |
MCP tools (keyed map by tool name) | |
resources |
MCP static resources | |
prompts |
MCP prompt templates |
McpTool¶
tools: # keyed map; key IS the tool name
get-ship:
description: "Retrieve a ship's details by IMO"
inputParameters: # keyed map
imo: { type: string, required: true, description: "IMO number" }
call: registry.get-ship
with: { imo_number: shipyard-tools.imo }
outputParameters:
- type: object
properties:
imo: { type: string, mapping: "$.imo_number" }
name: { type: string, mapping: "$.vessel_name" }
hints:
readOnly: true
idempotent: true
Mock-mode tools omit call:, with:, and mapping: — they declare
outputParameters with literal or Mustache-templated value::
tools:
greet:
inputParameters:
who: { type: string, required: true }
outputParameters:
- { name: message, type: string, value: "Hello, {{who}}!" }
MCP transport¶
transport |
Listens on | Use case |
|---|---|---|
http (default) |
TCP port | Remote MCP clients, AI gateways |
stdio |
stdin/stdout | Local IDE/agent integrations |
Skill Expose (type: skill)¶
- type: skill
port: 3003
namespace: shipyard-skills
skills: # keyed map; key IS the skill name
fleet-ops:
description: "Fleet management tools"
tools: # keyed map; key IS the tool name
list-ships:
from: { sourceNamespace: shipyard-tools, action: list-ships }
Skill tools are references to MCP tools defined in another expose. The Skill adapter auto-exposes a discovery API:
GET /skillsGET /skills/{name}GET /skills/{name}/downloadGET /skills/{name}/contents
Control Expose (type: control)¶
- type: control
port: 9090
namespace: control
observability:
tracing:
exporter: otlp
endpoint: http://otel-collector:4317
metrics:
exporter: prometheus
Exposes operational endpoints:
| Endpoint | Purpose |
|---|---|
GET /health |
Liveness + readiness |
GET /metrics |
Prometheus RED metrics |
GET /status |
Runtime diagnostics |
GET /traces |
In-memory trace summary |
Only one Control expose per capability is allowed.
Authentication on exposes¶
Authentication on exposes validates incoming requests. Authentication on
consumes provides credentials for outgoing requests. Both use the same
Authentication object schema.