zeekayandHanzo Dev 2e72b6f1f8 fetch: search asks our own API, and says so when it cannot
`fetch:search` scraped html.duckduckgo.com and pulled results out of a regex
over `class="result__title"`. Measured 2026-08-20: that page answers HTTP 202 —
DuckDuckGo's anti-bot challenge — and the markup carries no `result__title` at
all. So the regex matched nothing and the tool returned `{results: [], count: 0}`
for EVERY query: the identical answer it gives when the web genuinely has
nothing. Blind rendered as empty, with no way for a caller to tell them apart,
which is exactly why nobody noticed.

It now asks POST /v1/websearch — the meta-search we ship — reading the base URL
and credential from the same env the tracker tool reads, so the MCP has one way
to reach cloud rather than a second one here.

The failure shape is the point:

  no credential  -> NO_CREDENTIAL, never an empty result list
  cloud refuses  -> its own words verbatim ("sign in to search the web"),
                    because a 401 and a 500 are different problems and
                    flattening both into "search failed" makes an outage
                    look like a bad query
  results        -> carries WHICH ENGINES answered, so a zero-result search
                    with engines listed is a real empty and one with none is
                    a search that did not happen

HONEST GAP: the committed test cannot run. The repo declares typescript ^7.0.2
against ts-jest ^29.4.6, which does not support TS7, so `npx jest` dies in
_resolveTsConfig on "Cannot read properties of undefined (reading 'fileExists')"
— for the pre-existing suites too (edit.test.ts: 0 tests). `tsc --noEmit` is
clean repo-wide; only the transform is dead. The eight assertions were run
against the esbuild-bundled tool instead and all pass; they execute under jest
the moment the toolchain is fixed.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-20 13:48:00 -07:00
2026-02-14 05:26:48 -08:00

Hanzo MCP

@hanzo/mcp

The canonical Model Context Protocol server for the Hanzo AI Cloud — one action-routed tool surface every Hanzo agent runs on.

npm PyPI Status License

Quick start

npm install -g @hanzo/mcp
hanzo-mcp serve

What this is

@hanzo/mcp is the canonical MCP server for the Hanzo platform. It collapses a 260+ tool catalog into 13 HIP-0300 action-routed tools (fs, exec, code, git, fetch, workspace, ui, plus optional think, memory, hanzo, plan, tasks, mode) served over the MCP stdio / streamable-http transports.

Every Hanzo agent speaks this same tool surface. The Python SDK (hanzo-mcp on PyPI) and the Rust crate (hanzo-mcp::brain) mirror it 1-to-1, so a tool name and its action schema are identical across all three runtimes.

Implements:

  • HIP-0300 — Unified MCP Tools
  • HIP-0106 — Unified Cloud Binary (mcp subsystem)

Tool surface (HIP-0300)

13 canonical tools organized by axis. Each tool uses action-routed dispatch — one tool name, many verbs.

Core tools (7)

Tool Axis Key actions
fs Bytes + paths read, write, stat, list, mkdir, rm, mv, apply_patch, search_text
exec Execution run, background, ps, kill, logs
code Symbols + semantics parse, search, transform, summarize
git Diffs + history status, diff, log, commit, branch, stash
fetch HTTP get, post, put, delete, download
workspace Project context info, config, env, dependencies
ui UI components list_components, fetch_component, search, install

Optional tools (6)

Tool Purpose
think Structured reasoning
memory Persistent storage
hanzo Hanzo platform surface (iam, kms, paas, commerce)
plan Task planning
tasks Task tracking
mode Developer modes

Community tools (opt-in)

Third-party descriptors that shell out to externally-installed binaries. Off by default; enable individually.

Tool Source Purpose
tesseract.deploy kcolbchain/tesseract Deploy zk-OCR relayer to a target chain
tesseract.health_check kcolbchain/tesseract Probe deployed relayer addresses
tesseract.monitor kcolbchain/tesseract Poll matching contract events
compress.solana kcolbchain/blockchain-compression Compress blob with Solana-tuned compressor

Enable with hanzo-mcp serve --enable-community-cryptuon. See src/tools/community/cryptuon/ for descriptors and per-tool env overrides (e.g. $CRYPTUON_TESSERACT_DEPLOY).

Usage

CLI

# Default: HIP-0300 unified surface (13 tools)
hanzo-mcp serve

# Legacy individual tools (read_file, write_file, bash, …)
hanzo-mcp serve --legacy

# UI extensions
hanzo-mcp serve --enable-ui --enable-desktop

# Disable specific tools
hanzo-mcp serve --disable-tools plan,tasks

# List available tools
hanzo-mcp list-tools

# Install for Claude Desktop
hanzo-mcp install-desktop

Programmatic

import { getConfiguredTools } from '@hanzo/mcp';

// HIP-0300 unified surface (default)
const tools = getConfiguredTools({ unified: true });

// Legacy individual tools
const legacy = getConfiguredTools({ enableLegacy: true });

// With UI extensions
const withUI = getConfiguredTools({
  unified: true,
  enableUI: true,
  enableDesktop: true,
});

Client configuration

Claude Desktop / Cursor / Code

Add to .mcp.json:

{
  "mcpServers": {
    "hanzo": {
      "command": "npx",
      "args": ["-y", "--package=@hanzo/mcp", "hanzo-mcp", "serve"]
    }
  }
}

Why --package=? Without it, npx -y @hanzo/mcp serve resolves serve as a separate npm package (the unrelated static-file server) and runs that instead of hanzo-mcp. The --package= form binds npx to the right binary. This matters on every platform — Windows, macOS, and Linux.

Troubleshooting

If MCP "doesn't work" in Claude Desktop, Claude Code, Cursor, or any other client:

  1. Verify the stdio handshake from the command line:

    echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
      | npx -y --package=@hanzo/mcp@latest hanzo-mcp serve
    

    A working install prints a JSON-RPC response with "serverInfo":{"name":"hanzo-mcp","version":"…"} within ~10 s. Silence (or a long hang) means the wrong binary is running.

  2. Turn on debug logging by setting HANZO_MCP_DEBUG=1 in the client's MCP server env block. Stderr will then include the resolved CLI path, cwd, argv, and PATH prefix — usually enough to tell whether a stray serve binary, a wrong npx arg form, or a port conflict is shadowing the server.

    "hanzo": {
      "command": "npx",
      "args": ["-y", "--package=@hanzo/mcp", "hanzo-mcp", "serve"],
      "env": { "HANZO_MCP_DEBUG": "1" }
    }
    

    In Claude Desktop the stderr lands in ~/Library/Logs/Claude/mcp-server-hanzo.log (macOS) or %APPDATA%\Claude\logs\mcp-server-hanzo.log (Windows).

  3. Rerun the installer to overwrite a stale (2.4.1 or earlier) config:

    npx -y --package=@hanzo/mcp@latest hanzo-mcp install --claude-desktop
    

    Then restart Claude Desktop.

  4. Windows specifics. npx.cmd shells out to cmd.exe for arg parsing, which is sensitive to quoting. If the JSON config uses single quotes anywhere, switch to double quotes.

  5. CI invariants. The protocol-level contract is exercised on every push to main, on native Linux amd64 + arm64 (Hanzo self-hosted runners, no QEMU), via scripts/smoke-mcp.mjs and an e2e test against the published npm package using the same npx invocation shipped to clients. If MCP works locally but fails for you, open an issue with the HANZO_MCP_DEBUG=1 log attached.

Architecture

   Claude Desktop / Cursor / Code  ->  stdio MCP transport
                                              |
                                          hanzo-mcp serve
                                              |
                          +-------------------+-------------------+
                          |                                       |
                  HIP-0300 unified tools          legacy individual tools (--legacy)
                  fs / exec / code / git /         read_file, write_file, bash, …
                  fetch / workspace / ui +
                  optional think / memory /
                  hanzo / plan / tasks / mode
                          |
                  TS runtime (today) | Rust runtime (latency-sensitive)
                          |
                  Go runtime under hanzoai/cloud (HIP-0106 in flight)

Source layout:

src/tools/unified/    # HIP-0300 action-routed tools (fs, exec, code, fetch, workspace, hanzo)
src/tools/            # Individual tools (git, think, memory, tasks, plan, mode, …)
rust/src/tools/       # Rust native tools (exec, git, fetch, code, computer, …)

The Rust runtime provides native performance for latency-sensitive operations (<5 ms clicks, <2 ms keypress, <50 ms screenshots).

Python SDK parity

The Python implementation (hanzo-mcp on PyPI) exposes the same 13 HIP-0300 tools via entry-point discovery from hanzo-tools-* packages. Tool names and action schemas are identical across both runtimes.

pip install hanzo-mcp

License

MIT

Hanzo — the Open AI Cloud

Open source · every language · on-chain settlement. hanzo.ai · docs.hanzo.ai

SDKs in every language — Python (flagship) · TypeScript · Go · Rust · C++ · Swift · Kotlin · umbrella

S
Description
Model Context Protocol server with 260+ tools for AI agents
Readme MIT
435 MiB
Languages
Rust 57.4%
TypeScript 37.7%
JavaScript 2.8%
Python 0.9%
Go 0.9%