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
envblock. No CLI flags besides--help/--version(prints the package version). - Dual era: accepts both the legacy
initializehandshake and the modernserver/discover(2026-07-28 protocol). Tested at the wire level. - Vendored bridge:
juso_search/juso_bridge.pyis byte-identical topublic/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)
- Find your extension id: open
chrome://extensions(enable Developer mode), copy the 32-char id from the Juso card. - Enable Agent Bridge in the extension's Options. Without it every call
fails with
extension_did_not_claim. - 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)
| File | Size | Uploaded | |
|---|---|---|---|
| juso_search-0.1.1.tar.gz | 21.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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