Skip to content

CLI Reference

24 commands.

$ pip install bulla
$ bulla --help

audit#

Scan an MCP config file, launch all configured servers, and diagnose cross-server coherence. Auto-detects configs from Cursor, Claude Code, Cline, Claude Desktop, OpenAI Codex, Windsurf, and Zed. The primary entry point for most users.

bulla audit [config] [options]
FlagDescription
--host NAMEForce a specific MCP host (cursor, claude-code, cline, claude-desktop, codex, zed, windsurf)
--format {text,json,sarif}Output format (default: text)
-v, --verboseShow full blind spot details
--max-fee NExit 1 if coherence fee exceeds N (CI gating)
--max-blind-spots NExit 1 if blind spots exceed N
--discoverRun LLM-powered convention discovery before auditing
--convergeIterative convergence loop (fee strictly decreases per round)
--receipt FILEWrite a WitnessReceipt JSON after auditing
--chain RECEIPT.jsonChain onto a prior receipt's vocabulary
--pack FILEAdditional convention pack YAML (repeatable)
$ bulla audit
$ bulla audit --host claude-code
$ bulla audit ~/.cursor/mcp.json --format sarif -o report.sarif
$ bulla audit --discover --converge --receipt audit.json

key#

Generate a local ed25519 did:key identity your agent signs deeds under. Bulla never mints the name; it signs under one you hold.

bulla key gen [options]
FlagDescription
-o FILEWrite the key to FILE
$ bulla key gen -o key.json

certify#

Emit a signed, recomputable coherence certificate (a deed) for a composition. The verdict is a deterministic function of the composition — anyone can re-run it and get the same answer.

bulla certify --sign composition.yaml [options]
FlagDescription
--signSign the certificate with your key
--key FILEThe did:key identity to sign under
--output FILEWrite the certificate JSON
--format {text,json}Output format
$ bulla certify --sign comp.yaml --key key.json --output deed.json --format json

registry#

The append-only RFC 6962 Merkle log: append deeds, print the log, produce inclusion/consistency proofs, anchor the root via OpenTimestamps, or serve read-only HTTP endpoints (/root, /inclusion, /by-composition).

bulla registry {append,log,prove,root,anchor,serve} [options]
FlagDescription
--log FILEThe log file to operate on
$ bulla registry append deed.json --log log.jsonl
$ bulla registry root --log log.jsonl

verify#

Verify a certificate: integrity, authenticity, anchor, inclusion. Refuses a host’s bare claim about its own root — inclusion counts only against a root you obtained independently.

bulla verify CERT [options]
FlagDescription
--registry URL|FILERegistry to check inclusion against
--trusted-root HASHA root you pinned independently of the host
$ bulla verify deed.json --registry log.jsonl --trusted-root <hash>

receipt#

Verify an ActionReceipt to the digest rung: the four hashes recompute and the modality law holds. The same checks run in the in-browser verifier on /spec.

bulla receipt verify RECEIPT.json
$ bulla receipt verify receipt.json

gate#

The recourse gate: PROCEED / REFUSE-with-cure on a counterparty’s signed, logged deed. Gates on type signals only — coherence (fee=0), authenticity, and inclusion under an independently trusted root. Exit code is the verdict.

bulla gate --certificate DEED --registry LOG [options]
FlagDescription
--certificate FILEThe deed to gate on
--registry URL|FILEWhere inclusion is checked
--disclose DIMApply a convention disclosure as the cure
$ bulla gate --certificate deed.json --registry log.jsonl

proxy#

Live MCP proxy: fronts N backend servers as one, namespaces tools as server__tool, and injects the eight bulla__* meta-tools the agent itself calls (five advisory, three deed). Observe mode — never modifies traffic.

bulla proxy --config servers.yaml [options]
FlagDescription
--config FILEBackend server config
--inject-promptInject the agent system prompt for meta-tool use
$ bulla proxy --config servers.yaml

gauge#

Diagnose a single MCP server or manifest with prescriptive disclosure. Useful for server authors checking their own tool conventions.

bulla gauge [manifest] [options]
FlagDescription
--mcp-server CMDShell command to start MCP server
--format {text,json,sarif}Output format
-v, --verboseShow blind spot details and bridge recommendations
--pack FILEAdditional convention pack YAML
$ bulla gauge tools.json
$ bulla gauge --mcp-server "npx @modelcontextprotocol/server-filesystem /"

diagnose#

Run full diagnostic on composition YAML files. Reports coherence fee, blind spots, and bridge recommendations.

bulla diagnose [files...] [options]
FlagDescription
--format {text,json,sarif}Output format
--briefOne-line-per-file summary (fee + blind spot count)
--examplesRun on bundled example compositions
--pack FILEAdditional convention pack YAML
$ bulla diagnose composition.yaml
$ bulla diagnose compositions/ --brief

check#

CI/CD gate. Exits with code 1 if compositions exceed configured thresholds. Use in GitHub Actions or any CI pipeline.

bulla check [files...] [options]
FlagDescription
--max-fee NExit 1 if coherence fee exceeds N
--max-blind-spots NMax blind spots before failing (default: 0)
--max-unbridged NMax unbridged edges before failing (default: 0)
--format {text,json,sarif}Output format
$ bulla check --max-fee 0 compositions/
$ bulla check --max-blind-spots 3 --format sarif composition.yaml

scan#

Scan live MCP servers via stdio transport and diagnose. Zero-config: just provide the shell commands to start the servers.

bulla scan <commands...> [options]
FlagDescription
--format {text,json,sarif}Output format
-o, --output FILESave inferred composition YAML
--pack FILEAdditional convention pack YAML
$ bulla scan "npx @mcp/server-filesystem /" "npx @mcp/server-github"

witness#

Diagnose and emit a tamper-evident WitnessReceipt. Binds composition, diagnostic, and policy into a content-addressed, DAG-chainable JSON object.

bulla witness <files...>
$ bulla witness composition.yaml

bridge#

Auto-generate bridged compositions or JSON patches. Produces patched YAML where hidden conventions are surfaced as observable schema annotations.

bulla bridge <files...> [options]
FlagDescription
--format {yaml,json-patch}Output: bridged YAML (default) or JSON patches
-o, --output FILEWrite output to file
$ bulla bridge composition.yaml
$ bulla bridge composition.yaml --format json-patch -o patches.json

serve#

Run Bulla as an MCP server (stdio transport). Exposes bulla.witness and bulla.bridge as MCP tools, and bulla://taxonomy as a resource.

bulla serve
$ bulla serve

discover#

Discover convention dimensions from tool schemas using an LLM. Generates a micro-pack YAML that can be loaded with --pack.

bulla discover --manifests DIR -o FILE [options]
FlagDescription
--manifests DIRDirectory of MCP manifest JSON files
-o, --output FILEOutput micro-pack YAML file
--provider {openai,anthropic,openrouter,auto}LLM provider
--pack FILEAdditional convention pack YAML
$ bulla discover --manifests ./manifests -o discovered.yaml --provider anthropic

manifest#

Generate, validate, or publish Bulla Manifest files. Optionally anchor to the Bitcoin timechain via OpenTimestamps.

bulla manifest [options]
FlagDescription
--from-json FILEGenerate from MCP manifest JSON
--from-server CMDGenerate from a live MCP server
--validate FILEValidate an existing manifest YAML
--publish FILEAnchor to Bitcoin timechain (requires bulla[ots])
--verify FILEVerify OTS proof on a published manifest
$ bulla manifest --from-server "npx @mcp/server-filesystem /" -o fs.yaml
$ bulla manifest --validate fs.yaml

init#

Interactive wizard to generate a composition YAML from scratch.

bulla init [-o OUTPUT]
$ bulla init -o my-composition.yaml

infer#

Infer a proto-composition YAML from an MCP manifest JSON. Classifies tool parameters against known convention dimensions.

bulla infer <manifest> [options]
FlagDescription
-o, --output FILEWrite output to file
--pack FILEAdditional convention pack YAML
$ bulla infer tools.json -o composition.yaml

pack#

Convention pack utilities. Currently supports validation.

bulla pack validate <file>
$ bulla pack validate my-dimensions.yaml

merge#

Merge vocabularies from multiple receipts. Produces a DAG receipt with parent_receipt_hashes linking the inputs.

bulla merge <receipts...> [options]
FlagDescription
--receipt FILEWrite merged receipt JSON to file
--format {text,json}Output format
$ bulla merge receipt-a.json receipt-b.json --receipt merged.json

hosts#

Inspect MCP host integrations. Lists all seven registered hosts (Cursor, Claude Code, Cline, Claude Desktop, OpenAI Codex, Zed, Windsurf) and shows which configs are present on the current system.

bulla hosts list
$ bulla hosts list

frameworks#

Inspect framework adapters. Lists all registered framework adapters (Anthropic Messages, LangGraph, CrewAI) and their parse-mode support.

bulla frameworks list
$ bulla frameworks list

import#

Convert framework-native tool definitions into a Bulla manifest. Pipe through `bulla audit` directly with --audit, or write a manifest JSON for later. Static AST parsing today; runtime mode reserved for a future sprint.

bulla import <framework> <source> [options]
FlagDescription
--out FILEWrite manifest JSON to FILE (default: stdout)
--auditPipe through bulla audit immediately, no intermediate file
--format {text,json,sarif}Audit output format (only relevant with --audit)
--mode {static,runtime}Parse mode (default: static; runtime reserved for future sprint)
$ bulla import langgraph workflow.py --out manifest.json
$ bulla import crewai agents/ --audit
$ bulla import anthropic-messages tools.json --audit --format sarif