Viaduct supports community connectors through the gRPC-based plugin host in internal/connectors/plugin/.
- you need a connector that is not part of the built-in set
- you want to iterate on a platform integration without changing core Viaduct
- you need to keep a connector in a separate distribution or lifecycle
Implement the ConnectorPluginServer contract:
ConnectDiscoverPlatformCloseHealth
The plugin host expects:
- a non-empty platform identifier
Healthto returnokorhealthyDiscoverto return a non-nil normalized result- graceful shutdown behavior
- a
plugin.jsonmanifest when Viaduct launches the plugin executable directly
See:
../../examples/plugin-example/main.go../../examples/plugin-example/plugin.json../../examples/plugin-example/README.md
- Viaduct can start a plugin executable and pass
VIADUCT_PLUGIN_ADDR - Viaduct can also connect to a pre-running plugin using a
grpc://host:portaddress - plugins are registered by normalized platform key
- loading a replacement plugin for the same platform replaces the prior process
Example manifest:
{
"name": "Viaduct Example Plugin",
"platform": "example",
"version": "1.0.0",
"protocol_version": "v1",
"minimum_viaduct_version": "v1.0.0"
}Example config:
plugins:
example: "grpc://127.0.0.1:50071"- preserve the normalized schema in
internal/models/ - do not return ad hoc parallel schemas
- keep connector auth and transport logic deterministic and testable
- fail clearly on health, connect, or discover errors
- ensure
Closecan be called even when the process is already unhealthy - keep
minimum_viaduct_versionandmaximum_viaduct_versionaligned with the host releases you actually test against - keep
protocol_versionaligned with the plugin host contract ininternal/connectors/plugin/manifest.go
- host load test using
internal/connectors/plugin/host.go - manifest validation succeeds with the expected platform and protocol version
- host-version compatibility validation succeeds for the Viaduct releases you claim to support
- health check returns
okorhealthy - platform lookup returns a non-empty identifier
- discovery returns normalized VMs and metadata
- shutdown path is safe
- regression tests cover unhealthy plugin, empty platform, config propagation, and nil discovery results
Run the manifest validator directly:
go run ./scripts/plugin_manifest_check -manifest examples/plugin-example/plugin.json -host-version <viaduct-version>For the broader checklist and release-facing expectations, see plugin-certification.md.
- keep fixture payloads close to the connector package
- prefer deterministic mapping helpers over logic embedded in transport code
- use the KVM or example plugin patterns as reference implementations before branching into more complex platforms