Protocol Guides

Bowire ships with fourteen first-party protocol plugins plus seven sibling plugins (AMQP, Kafka, TacticalAPI, Akka.NET, DIS, UDP, Surgewave) that live in their own NuGet packages and install via bowire plugin install. Each implements IBowireProtocol and auto-registers at startup. Install only the ones you need.

First-party protocols

These ship from this repo. All but two are in the workbench bundle, so bowire speaks them out of the box. NATS and Pulsar each carry a third-party client library (NATS.Net, DotPulsar), which under the optional-package rule keeps them out of the bundle — install either before pointing Bowire at a broker:

bowire plugin install Kuestenlogik.Bowire.Protocol.Nats
bowire plugin install Kuestenlogik.Bowire.Protocol.Pulsar

Without that step a nats:// or pulsar:// URL answers "No protocol plugin recognised this URL" — the plugin is not missing from your install, it was never in it.

Protocol Package Bundled Discovery Call types
gRPC Kuestenlogik.Bowire.Protocol.Grpc yes Server Reflection · .proto upload Unary, Server / Client / Bidi streaming
REST Kuestenlogik.Bowire.Protocol.Rest yes OpenAPI 3 / Swagger 2 · IApiDescriptionGroupCollectionProvider Request / response
GraphQL Kuestenlogik.Bowire.Protocol.GraphQL yes Schema introspection · SDL upload Query, Mutation, Subscription
SignalR Kuestenlogik.Bowire.Protocol.SignalR yes Endpoint metadata scan Invoke, Server streaming, Duplex
WebSocket Kuestenlogik.Bowire.Protocol.WebSocket yes Manual (no inherent discovery) Duplex with text / binary frames
SSE Kuestenlogik.Bowire.Protocol.Sse yes Attribute · manual registration Server streaming
MQTT Kuestenlogik.Bowire.Protocol.Mqtt yes Topic subscribe / publish (MQTT 3.1.1, 5.0 via MQTTnet) Pub / Sub, Request / Response
NATS Kuestenlogik.Bowire.Protocol.Nats no · install first Subject sampling · JetStream streams · Services API ($SRV.PING) Pub / Sub / Request, Stream consume
SOAP Kuestenlogik.Bowire.Protocol.Soap yes WSDL 1.1 <portType> + <binding> walk Unary (SOAP 1.1 / 1.2)
JSON-RPC Kuestenlogik.Bowire.Protocol.JsonRpc yes OpenRPC rpc.discover · freeform fallback Unary
Pulsar Kuestenlogik.Bowire.Protocol.Pulsar no · install first Pulsar HTTP admin (/admin/v2/persistent) Produce (Unary), Subscribe (ServerStreaming)
Socket.IO Kuestenlogik.Bowire.Protocol.SocketIo yes Manual (namespace / event) Duplex with ack
OData Kuestenlogik.Bowire.Protocol.OData yes CSDL metadata endpoint Request / response
MCP Kuestenlogik.Bowire.Protocol.Mcp yes Wraps other protocols as MCP tools Unary (tool invocation)

Sibling plugins

These ship from their own repos / NuGet packages on independent release cadences. Install via the CLI:

Protocol Package Discovery Call types
AMQP Kuestenlogik.Bowire.Protocol.Amqp RabbitMQ Management HTTP API (0.9.1) · synthetic Broker service (1.0) Publish (Unary), Consume (ServerStreaming)
Kafka Kuestenlogik.Bowire.Protocol.Kafka IAdminClient.GetMetadata Consume (ServerStreaming), Produce (Unary)
TacticalAPI Kuestenlogik.Bowire.Protocol.TacticalApi Bundled .proto set (no Server Reflection required) Typed CRUD (Unary) + server-streaming subscribe
Akka.NET Kuestenlogik.Bowire.Protocol.Akka DI-resolved ActorSystem (embedded only) Mailbox tap (server-streaming Tap/MonitorMessages)
DIS Kuestenlogik.Bowire.Protocol.Dis Live UDP-multicast probe · entity-scoped streams · mock replay Per-entity PDU stream, exercise-wide stream
UDP Kuestenlogik.Bowire.Protocol.Udp URL-bind any UDP endpoint Datagram listener (multicast / broadcast / unicast)
Surgewave (pre-release) Kuestenlogik.Bowire.Protocol.Surgewave Cluster service · pending native admin API Consume (ServerStreaming), Produce (Unary)

Writing your own: see Custom protocols.

Architecture at a glance

graph LR
    A[Bowire Core] --> B[gRPC]
    A --> C[REST]
    A --> D[GraphQL]
    A --> E[SignalR]
    A --> F[WebSocket]
    A --> G[SSE]
    A --> H[MQTT]
    A --> NATS[NATS]
    A --> SOAP[SOAP]
    A --> JRPC[JSON-RPC]
    A --> PULSAR[Pulsar]
    A --> I[Socket.IO]
    A --> J[OData]
    A --> K[MCP]
    A --> M[Surgewave]
    A --> N[Kafka]
    A --> O[DIS]
    A --> P[UDP]
    A --> Q["Akka.NET"]
    A --> AMQP[AMQP]
    A --> R[TacticalAPI]
    A --> L[Custom plugins]
    style A fill:#6366f1,color:#fff
    %% Dashed = not a concrete plugin. "Custom plugins" is the extension
    %% point, not a package you can install. TacticalAPI used to be dashed
    %% too, from when it was a preview entry (3afffbf2, May) — it has shipped
    %% since (1.0.10 on nuget), and a mark nobody can look up the meaning of
    %% is worse than no mark.
    style L stroke-dasharray: 5 5

What every plugin provides

  1. Discovery — enumerate services / methods / topics / events from the target
  2. Invocation — send a request and return the response (or the stream)
  3. Streaming / channels — where the protocol supports it, yield messages as they arrive

The UI stays protocol-agnostic: the same sidebar, request editor, and response viewer renders every plugin's output. Protocol-specific details (e.g. gRPC metadata, SignalR hub methods, MQTT topic wildcards) show up as extra fields in the request form only when the active plugin declares them.

Multiple protocols in one session

Every installed plugin runs simultaneously. A single Bowire instance against a service that speaks gRPC, REST, and SignalR shows all three in the sidebar with per-protocol badges. Filter to a single protocol via the command palette or the sidebar protocol pills.

Public test endpoints

If you want to try Bowire against a real-world service before standing up your own host, each protocol guide ends with a "Try it with a public endpoint" section listing well-known, anonymously-callable endpoints you can pass straight to --url:

These are third-party services that may rate-limit or disappear without notice. The per-protocol Bowire.Samples/ projects are the canonical try-it path for sustained testing.