MCP

Probierz MCP tool reference.

`probierz mcp` exposes Probierz discovery, execution, evidence, and control operations over newline-delimited stdio JSON-RPC, running each tool in the product's own process.

Start the server#

Build the repository with `cargo build --release` in `probierz-rs`, put `target/release` on `PATH`, and configure your MCP client to launch `probierz mcp` (with `--harness <dir>` when the harness is not the repository the binary was built in). The server reads JSON-RPC from standard input and writes one JSON response per line to standard output. Every tool is the CLI command of the same name run inside this process; only an asynchronous run is a child process, so that its whole process tree can be cancelled.

The tool names, descriptions, and schemas below are generated by starting that server and calling `tools/list`; the documentation check refuses missing, extra, or changed tools.

MCP server command
probierz mcp

Asynchronous run queue#

Initialize the stdio session, send `notifications/initialized`, start a run, and poll its durable run ID until it settles. Artifacts are listed and read separately; `probierz_get_artifact` returns base64 content. Cancellation is idempotent: asking to cancel a settled run returns `cancelRequested: false`.

JavaScript
import { spawn } from "node:child_process";
import { createInterface } from "node:readline";

const server = spawn("probierz", ["mcp"], { stdio: ["pipe", "pipe", "inherit"] });
const lines = createInterface({ input: server.stdout });
const pending = new Map();
let id = 0;
lines.on("line", (line) => {
  const message = JSON.parse(line);
  pending.get(message.id)?.(message);
  pending.delete(message.id);
});
function rpc(method, params) {
  id += 1;
  server.stdin.write(JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n");
  return new Promise((resolve) => pending.set(id, resolve));
}
async function tool(name, args) {
  const response = await rpc("tools/call", { name, arguments: args });
  if (response.error) throw new Error(response.error.message);
  return JSON.parse(response.result.content[0].text);
}
await rpc("initialize", {
  protocolVersion: "2024-11-05",
  capabilities: {},
  clientInfo: { name: "probierz-docs", version: "1" },
});
server.stdin.write(JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized" }) + "\n");
const started = await tool("probierz_start_run", { target: "tui", appId: "docs-demo" });
const STATUS_POLL_MS = 500;
let status = started;
while (["queued", "running"].includes(status.status)) {
  await new Promise((resolve) => setTimeout(resolve, STATUS_POLL_MS));
  status = await tool("probierz_run_status", { runId: started.runId });
}
const artifacts = await tool("probierz_list_artifacts", { runId: started.runId });
const report = await tool("probierz_get_artifact", { runId: started.runId, file: "report.json" });
const decoded = JSON.parse(Buffer.from(report.content, "base64").toString("utf8"));
if (decoded.probierz.runId !== started.runId) throw new Error("artifact runId mismatch");
const cancelled = await tool("probierz_cancel_run", { runId: started.runId });
if (cancelled.cancelRequested !== false) throw new Error("settled run requested cancellation");
console.log({ status: status.status, artifacts: artifacts.artifacts });
server.stdin.end();

Tools#

Source snapshot#

Generated from https://github.com/wisent-ai/probierz.git revision `f65b755da397f2ec7435eb80ed722aa6017437c1` by calling the Rust server's `tools/list` operation.

The captured server exposes 49 tools. Binary SHA-256: `d5398832d3ab52c541b1efe979730dea62941ac6197898a20fccfc5d3fca44df`; tools/list SHA-256: `e0ac65d9045c1fdeb35ed9b386f1532ec72ee0dca4586e624c817fec41bbaf86`.