Module DescriptorΒΆ
Every protocol module must expose a stable descriptor that the core can use for discovery, compatibility checks, health integration, and release validation.
Required FieldsΒΆ
| Field | Meaning |
|---|---|
moduleId | Stable module identifier, for example mcp-rust-runtime |
protocolFamily | One of mcp, a2a, llm, rest-grpc, or a future family |
implementationLanguage | python, rust, go, or another language identifier |
moduleVersion | Module build or release version |
spiVersions | Supported core SPI versions |
runtimeModes | Supported runtime modes such as embedded, sidecar |
ingressModes | Whether the module can run behind core routing, direct public ingress, or both |
capabilities | Declared protocol and runtime capabilities |
health | How health and readiness are queried |
stats | Optional runtime metrics surface |
pluginParity | Which plugin-sensitive flows are fully supported, delegated, or not yet supported |
fallbackStrategy | Whether rollback to legacy or embedded path exists |
Example DescriptorΒΆ
{
"moduleId": "a2a-rust-runtime",
"protocolFamily": "a2a",
"implementationLanguage": "rust",
"moduleVersion": "0.1.0",
"spiVersions": ["v1alpha1"],
"runtimeModes": ["sidecar"],
"ingressModes": ["core-routed"],
"capabilities": {
"discovery": true,
"invoke": true,
"taskState": true,
"streaming": false,
"pushNotifications": false
},
"health": {
"readiness": "grpc",
"liveness": "grpc"
},
"pluginParity": {
"preInvoke": "delegate",
"postInvoke": "delegate"
},
"fallbackStrategy": {
"supportsRollback": true,
"fallbackPath": "python-core"
}
}
Second illustrative example for a Go LLM proxy module:
{
"moduleId": "llm-go-proxy",
"protocolFamily": "llm",
"implementationLanguage": "go",
"moduleVersion": "0.1.0",
"spiVersions": ["v1alpha1"],
"runtimeModes": ["sidecar"],
"ingressModes": ["core-routed"],
"capabilities": {
"chatCompletions": true,
"streaming": true,
"sessionChat": true,
"providerRelay": true
}
}
Capability TaxonomyΒΆ
Capabilities should be declarative, not inferred from language or module name.
Recommended categories:
- ingress
- transport
- request or response streaming
- session or task state
- replay or resume
- subscriptions
- prompt rendering
- resource reads
- tool or agent invocation
- provider relay
- plugin parity support
Descriptor RulesΒΆ
- The descriptor must be available before live traffic.
- Capabilities must be honest. Unsupported optional protocol surfaces must be declared as unsupported, not silently dropped.
- The descriptor must be sufficient for the core to decide:
- whether the module can be started
- whether a given deployment mode is valid
- whether the module satisfies release policy for the protocol family
Protocol-Specific NotesΒΆ
- A Rust A2A module should declare task-state and invoke support explicitly.
- A Go LLM proxy module should declare both chat-completion and streaming support explicitly.
- A REST or gRPC module should declare whether it owns reflection, OpenAPI import, or only invocation relay.