Standalone Tool

Run Bowire as a standalone .NET global tool to browse and invoke any remote API server — no code changes required on the target service. The tool ships with every Bowire protocol plugin built in (gRPC, REST, GraphQL, SignalR, MCP, SSE, WebSocket), so a single install gives you the full multi-protocol workbench.

Bowire standalone tool against SimpleGrpc

Installation

dotnet tool install -g Kuestenlogik.Bowire.Tool

The tool is published as Kuestenlogik.Bowire.Tool on NuGet but the executable itself is just bowire — global-tool installs put it on your PATH so you can run it from any directory.

Browser UI mode

Launch Bowire pointed at a target server URL:

bowire --url https://my-grpc-server:443

Bowire starts a local HTTP server on http://localhost:5080/bowire and auto-opens your default browser. The sidebar populates as discovery completes (typically <1 second against a local server).

Multiple URLs are supported by repeating the --url flag — Bowire fans out discovery in parallel and shows the merged service list with per-URL origin tagging:

bowire --url https://api.dev.example:443 \
        --url https://api.staging.example:443

When discovery succeeds against some URLs but fails against others, the empty-state landing surfaces a per-URL status table with retry buttons for the failed ones — see the Empty-State Landing feature page for screenshots of every state.

Plugin hint syntax (hint@url)

By default Bowire probes every loaded plugin against each URL — fast in practice but slow when one plugin needs a long network round-trip to discover that the URL isn't theirs (e.g. the gRPC plugin opening an HTTP/2 channel against an HTTP/1.1 GraphQL server and waiting for the handshake to time out).

Prefix the URL with <plugin-id>@ to skip every other plugin's discovery probe and route the URL straight to that plugin:

bowire --url grpc@https://api.example.com:443
bowire --url signalr@https://api.example.com/hubs/chat
bowire --url graphql@https://api.example.com/graphql

The hint is optional — bowire --url https://... keeps the original "probe everything" behaviour. The parser is careful with URI userinfo (https://user:pass@host) and email-style strings (alice@example.com): both pass through untouched because they don't match the hint's clean-token-then-:// shape. Plugin schemes (udp://, kafka://, dis://) need no hint — the scheme itself selects the plugin.

Disabling plugins (--disable-plugin)

When a plugin DLL fails to load (broken dependency, version mismatch) or its discovery probe is too expensive to leave running, skip it at startup with --disable-plugin:

# Single plugin
bowire --url https://api.example.com --disable-plugin grpc

# Multiple, comma-separated
bowire --url https://api.example.com --disable-plugin grpc,signalr

# Multiple, repeated flag
bowire --url https://api.example.com \
        --disable-plugin grpc \
        --disable-plugin signalr

This removes the plugin from the protocol-registry assembly scan entirely — it never reaches the AppDomain, never runs an Initialize callback, never participates in Discovery. Equivalent settings in appsettings.json:

{
  "Bowire": {
    "DisabledPlugins": [ "grpc", "signalr" ]
  }
}

--disable-plugin is process-startup config — use the hint@url syntax above for per-URL plugin selection without disabling anything else, and per-plugin UI toggles (rendered from BowirePluginSetting) for runtime feature switches inside an already-loaded plugin.

Options

Option Description Default
--url <url> Server URL to discover (repeatable for multi-URL). Optional <plugin>@ prefix routes the URL to a single plugin. none
--port <n> Bowire UI port 5080
--title <text> Browser title Bowire
--no-browser Don't auto-open the browser false
--enable-mcp-adapter Expose discovered methods as MCP tools at /bowire/mcp/sse false
--disable-plugin <id> Skip a protocol plugin at startup. Repeat or comma-separate. none

Examples

# Custom port and title
bowire --url https://server:443 --port 8080 --title "Production API"

# Headless (e.g. inside a container) — no browser auto-open
bowire --url https://server:443 --no-browser

# Multiple URLs in one Bowire window
bowire --url https://api.dev:443 --url https://api.staging:443

# AI agent integration — exposes discovered methods as MCP tools
bowire --url https://server:443 --enable-mcp-adapter

CLI mode (grpcurl-style)

The same tool also has a CLI mode for scripting and automation. No browser is opened, no UI is started — just print to stdout:

# List all services
bowire list --url https://server:443

# Describe a specific service
bowire describe --url https://server:443 weather.WeatherService

# Invoke a method with inline JSON
bowire call --url https://server:443 \
  weather.WeatherService/GetCurrentWeather -d '{"city":"Berlin"}'

See CLI Mode for the full command reference.

Plugin management

The standalone tool ships with the seven first-party protocol plugins built in. To install community plugins (third-party protocols published as Kuestenlogik.Bowire.Protocol.* packages on NuGet):

# Install a community plugin
bowire plugin install Kuestenlogik.Bowire.Protocol.MyProto

# Pin a specific version
bowire plugin install Kuestenlogik.Bowire.Protocol.MyProto --version 1.0.0

# List installed plugins
bowire plugin list

# Uninstall
bowire plugin uninstall Kuestenlogik.Bowire.Protocol.MyProto

Plugins are stored in ~/.bowire/plugins/ and loaded automatically at the next startup.

Run from source

If you've cloned the Bowire repository:

cd src/Kuestenlogik.Bowire.Tool
dotnet run -- --url https://my-grpc-server:443

The source build includes whatever protocol plugins are project- referenced in Kuestenlogik.Bowire.Tool.csproj — by default that's all seven first-party plugins.

What discovery requires from the target

The standalone tool talks to your target server over the network and asks it to describe itself. Each protocol has a different discovery mechanism:

Protocol Discovery requirement
gRPC gRPC Server Reflection enabled (Grpc.AspNetCore.Server.Reflection)
REST OpenAPI / Swagger document at /swagger/v1/swagger.json (or another path the user uploads as a fallback)
GraphQL __schema introspection enabled (Bowire queries it directly)
MCP MCP listing endpoint reachable
SignalR Embedded mode only — SignalR has no remote discovery protocol; for standalone, upload the hub schema as a fallback
SSE Embedded mode only — SSE has no listing endpoint; for standalone, configure the URL manually

If discovery fails, Bowire's landing page shows a context-sensitive error card with the actual error message and four common-cause troubleshoot bullets — you don't have to read logs to figure out what's wrong. See Empty-State Landing.

See also