Skip to main content

juso-search

An MCP server (stdio) that exposes the Juso search extension's agent-bridge search capabilities to MCP clients (Claude Desktop, Cursor, Cline, Claude Code, …). It mirrors the CLI agent-skill juso_search subcommands over MCP JSON-RPC 2.0, with a short-lived Chromium launch per call that the extension claims and completes through its Agent Bridge.

  • Transport: stdio. JSON-RPC flows over stdin/stdout; diagnostics go to stderr (stdout stays clean — only newline-delimited JSON-RPC).
  • Config: environment variables via the client's MCP env block. No CLI flags besides --help / --version (prints the package version).
  • Dual era: accepts both the legacy initialize handshake and the modern server/discover (2026-07-28 protocol). Tested at the wire level.
  • Vendored bridge: juso_search/juso_bridge.py is byte-identical to public/agent-skill/scripts/juso_bridge.py (the plan's drift lock). Never edit it by hand — regenerate from the source.

Install

Requires Python 3.10+ and mcp>=2.0,<3 (installed automatically as a dependency).

pip install juso-search

From this repository (development):

python -m venv mcp-server/.venv
mcp-server/.venv/Scripts/pip install -e mcp-server/

Verify:

mcp-server/.venv/Scripts/juso-search --help

Environment variables

Variable Required Meaning
JUSO_EXTENSION_ID yes The extension's 32-char id (see chrome://extensions).
JUSO_CHROME_PATH no Explicit Chromium-family executable (auto-discovered otherwise).
JUSO_CHROME_PROFILE no Chromium profile directory (auto-selected if unset).
JUSO_TIMEOUT no Seconds to wait for the extension to claim a request (default 40).

JUSO_EXTENSION_ID is required — the server refuses to start without it (exit code 2 and a stderr message) rather than guessing.

Client configuration

Each client injects these variables differently. Pick your client:

Claude Desktop (claude_desktop_config.json)

Claude Desktop does not expand ${VAR}, so write literal values:

{
  "mcpServers": {
    "juso": {
      "command": "juso-search",
      "args": [],
      "env": {
        "JUSO_EXTENSION_ID": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        "JUSO_CHROME_PATH": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
        "JUSO_TIMEOUT": "40"
      }
    }
  }
}

Cursor (.cursor/mcp.json)

{
  "mcpServers": {
    "juso": {
      "command": "juso-search",
      "args": [],
      "env": {
        "JUSO_EXTENSION_ID": "${env:JUSO_EXTENSION_ID}",
        "JUSO_CHROME_PATH": "${env:JUSO_CHROME_PATH}",
        "JUSO_CHROME_PROFILE": "${env:JUSO_CHROME_PROFILE}",
        "JUSO_TIMEOUT": "${env:JUSO_TIMEOUT}"
      }
    }
  }
}

Cline (cline_mcp_settings.json)

{
  "mcpServers": {
    "juso": {
      "command": "juso-search",
      "args": [],
      "env": {
        "JUSO_EXTENSION_ID": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        "JUSO_CHROME_PATH": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
        "JUSO_CHROME_PROFILE": "",
        "JUSO_TIMEOUT": "40"
      }
    }
  }
}

Claude Code (.mcp.json)

Claude Code expands ${VAR} from the shell environment, with :-default fallback:

{
  "mcpServers": {
    "juso": {
      "command": "juso-search",
      "args": [],
      "env": {
        "JUSO_EXTENSION_ID": "${JUSO_EXTENSION_ID}",
        "JUSO_CHROME_PATH": "${JUSO_CHROME_PATH:-}",
        "JUSO_CHROME_PROFILE": "${JUSO_CHROME_PROFILE:-}",
        "JUSO_TIMEOUT": "${JUSO_TIMEOUT:-40}"
      }
    }
  }
}

Tools

Tool Params Notes
search query, provider_id?, force_refresh? Providers: tavily, exa, brave, stepfun, stepfun-plan, jina, doubao, doubao-global.
engine-search query, engine_id?, max_results? Engines: google, bing, baidu, yandex, duckduckgo, bilibili, xiaohongshu, douyin.
search-instance query, instance_id, force_refresh? Searches a configured provider instance.
list-providers Providers and their config state.
list-instances Registered provider instances.

All tools are annotated readOnlyHint + openWorldHint. Tool results carry structuredContent plus a text serialization; engine-search error replies (consent wall, challenge, timeout) surface as successful results carrying an error field — only genuine bridge failures (e.g. Chrome not found, bridge not enabled) come back as isError.

Prerequisites (in the extension)

  1. Find your extension id: open chrome://extensions (enable Developer mode), copy the 32-char id from the Juso card.
  2. Enable Agent Bridge in the extension's Options. Without it every call fails with extension_did_not_claim.
  3. To use engine-search, also enable its sub-switch in Options.

Development / tests

python -m pytest mcp-server/tests        # or: npm run test:mcp

The suite covers config parsing/exit codes, tools/list schema and wire fields, tools/call dispatch and error shapes, the dual-era handshake over real subprocesses, and stdout cleanliness (only JSON-RPC on stdout).

Release files for juso-search 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for juso-search 0.1.1
File Size Uploaded
juso_search-0.1.1.tar.gz 21.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for juso-search 0.1.1
File Interpreter ABI Platform
juso_search-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 37.7 kB

Release files / juso_search-0.1.1.tar.gz

Download URL juso_search-0.1.1.tar.gz
Size 21.2 kB
Tags Source
SHA-256 checksum
How to use checksums
87acb0343a167cb4080667e521630b5ef06980d4f6b26249e7392f6f4fc6beb4
BLAKE2b-256 checksum
How to use checksums
0258fb22fd9879d44cc8c0662a20221c5f703b6f362f3a3ba7971242d993457d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.

Transparency log

Release files / juso_search-0.1.1-py3-none-any.whl

Download URL juso_search-0.1.1-py3-none-any.whl
Size 16.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
43064f54e2501baeb5ce0a42bc55fadd2962fc6dc05b3f3f17ad6aa194a4c28f
BLAKE2b-256 checksum
How to use checksums
dcf503604b03a8bc6933306436ab4446c9d560f944b597ac9cbffbc430f22cc2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.0

2 release files

This release

0.1.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page