Skip to main content
Version: v5

Harper MCP CLI

Added in: v5.1.0

harper mcp is a stdio bridge that lets MCP hosts (Claude Desktop, Cursor, Zed, or any client that speaks the stdio MCP transport) talk to a running Harper instance over Harper's Streamable HTTP MCP endpoint.

The CLI is bundled with Harper itself; if harper is on your PATH, so is harper mcp.

Subcommands

harper mcp [subcommand] [flags]
SubcommandPurpose
(default)Run the stdio bridge — JSON-RPC frames on stdin, responses on stdout, until stdin closes.
print-configEmit a paste-ready config block for an MCP host (--client claude-desktop, cursor, or zed).
doctorConnect, complete an initialize handshake, list tools, clean up; report each step.
helpPrint the help text.

Connection modes

harper mcp connects in one of two modes, chosen automatically based on whether --target is set:

Local UDS (default)

With no --target flag, the CLI connects to the Harper running on the same host via the operations API Unix Domain Socket — the same socket bin/cliOperations uses. Filesystem permissions on the socket are the access gate; no credentials are required or sent.

The UDS path is derived from operationsApi.network.domainSocket in harperdb-config.yaml and is typically <rootPath>/sockets/operations-server.

Network HTTPS / HTTP

--target https://node.example.com:9926 connects over the network to a remote Harper. Credentials are resolved with this precedence (highest first):

  1. --bearer <token> — explicit bearer token.
  2. --username + --password — explicit Basic auth.
  3. URL-embedded user/pass, e.g. --target https://alice:pw@node:9926.
  4. Saved JWT from ~/.harperdb/credentials.json for the resolved target (populated by harper login).

If none of these are present, the request goes out unauthenticated and Harper gates the response accordingly.

Use --insecure to skip TLS certificate validation (network mode only) — useful for local self-signed certs during development.

Flags

FlagDefaultPurpose
--profile <name>applicationoperations or application. Determines which MCP endpoint the CLI connects to.
--target <url>(local UDS)Network endpoint. Switches the CLI into network mode.
--mount-path <path>/mcpOverrides the mount path. Match whatever mcp.<profile>.mountPath is set to.
--username <u>(none)Basic auth username (network mode).
--password <p>(none)Basic auth password (network mode).
--bearer <token>(none)Bearer token (network mode). Wins over --username / --password.
--insecure(off)Skip TLS certificate validation (network mode only).
--client <name>(required for print-config)claude-desktop, cursor, or zed.
--help, -h(off)Print the help text and exit.

harper mcp (the bridge)

The default subcommand runs until stdin closes. The expected use is to invoke it from an MCP host's configuration block (see print-config below). Each line of stdin is parsed as a JSON-RPC frame and POSTed to the Harper MCP endpoint; each response (whether JSON or SSE-streamed) is emitted to stdout as line-delimited JSON-RPC.

After the initialize handshake completes, the bridge opens a long-lived GET /mcp request — Harper's server-push channel — and forwards every notifications/tools/list_changed and notifications/resources/list_changed frame to stdout. The host sees one unified MCP stream.

Logs (status, errors, dropped invalid stdin lines) go to stderr so they never collide with the JSON-RPC channel.

harper mcp print-config

Emits a paste-ready JSON block for the requested MCP host along with a comment indicating where to put it.

harper mcp print-config --client claude-desktop

Produces:

# Target file: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
{
"mcpServers": {
"harper": {
"command": "harper",
"args": ["mcp"]
}
}
}
# Note: Restart Claude Desktop after editing the file.
# Note: Merge into an existing `mcpServers` block if you already have one.

The generated args array reflects whatever flags you pass to print-config (other than --client). For instance:

harper mcp print-config --client cursor --target https://node.example.com:9926 --profile operations

emits a block whose args is ["mcp", "--profile", "operations", "--target", "https://node.example.com:9926"]. This lets you generate fully-resolved config blocks for non-default deployments without hand-editing.

Supported clients:

  • claude-desktop — Anthropic Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows).
  • cursor — Cursor IDE (~/.cursor/mcp.json).
  • zed — Zed editor (Zed settings.json, under context_servers).

harper mcp doctor

Runs a three-step smoke check against the configured connection:

  1. POST initialize — verifies the transport works and Harper accepts the handshake. Captures the negotiated protocol version and session id.
  2. POST tools/list — verifies the session is usable and reports how many tools are visible to the authenticated user.
  3. DELETE /mcp — cleans up the session. This step is allowed to fail (when mcp.session.allowClientDelete is false the server returns 405); overall doctor exit is still success.

Each step prints [OK] or [FAIL] with a short detail line. Exit code is 0 on success, 1 on any non-tolerable failure.

$ harper mcp doctor --target https://node.example.com:9926 --bearer $TOKEN
[OK ] initialize - session=ab12... protocol=2025-06-18
[OK ] tools/list - 14 tool(s) visible
[OK ] session cleanup

All checks passed.

Use doctor as a quick "is the wire path healthy?" check before pointing a real MCP host at the server.