
If you're running local LLMs through llama.cpp, Ollama, or vLLM and want them to use MCP tools, this is the bridge. It translates between OpenAI-compatible chat completion endpoints and MCP servers, letting any function-calling model access the same tools Claude Desktop uses. The config format is intentionally identical to Claude Desktop's mcpServers block, so you can copy it directly. Built for the qso-graph amateur radio ecosystem but works with any MCP server. Write operations are disabled by default. Useful when you need local inference with tool calling but don't want to rewrite tool integrations or move weights to the cloud.
QSP — relay MCP tools to any OpenAI-compatible local LLM endpoint.
Named after the Q-signal QSP ("Will you relay?"), qsp-client relays tool calls between a local LLM and MCP servers. It is an MCP client: any model with function calling gains access to the qso-graph servers' tools, from local weights, not from cloud.
Formerly qsp-mcp. See Moving from qsp-mcp.
uv tool install qsp-client # the qsp-client command, on your PATH
pip install qsp-client # or into your own environment
# Interactive mode
qsp-client --config ~/.config/qsp-client/config.json
# Single query
qsp-client --query "What bands are open from DN13 to JN48 right now?"
# Direct endpoint (no config file needed if no MCP servers configured)
qsp-client --endpoint http://localhost:8000/v1/chat/completions --api-key sk-xxx
The config format is Claude Desktop compatible — copy your existing mcpServers block directly:
{
"mcpServers": {
"ionis": {
"command": "ionis-mcp",
"env": { "IONIS_DATA_DIR": "/path/to/datasets/v1.0" }
},
"solar": {
"command": "solar-mcp"
},
"wspr": {
"command": "wspr-mcp"
}
},
"bridge": {
"endpoint": "http://localhost:8000/v1/chat/completions",
"model": "AstroSage-70B",
"temperature": 0.3,
"system_prompt": "You are an expert ham radio operator and RF engineer.",
"max_tool_calls_per_turn": 5,
"profiles": {
"contest": {
"servers": ["n1mm", "ionis", "solar", "wspr"],
"temperature": 0.2,
"system_prompt": "You are a contest advisor. Be concise."
},
"propagation": {
"servers": ["ionis", "solar", "wspr"],
"temperature": 0.3
},
"full": {
"servers": "*",
"temperature": 0.3
}
},
"server_timeouts": {
"ionis": 1,
"solar": 8,
"qrz": 5
}
}
}
The mcpServers block uses the exact same format as Claude Desktop. The bridge section is qsp-client specific (ignored by Claude Desktop).
qsp-client [OPTIONS]
Options:
-c, --config PATH Config file path (default: ~/.config/qsp-client/config.json)
-e, --endpoint URL LLM endpoint URL (overrides config)
-k, --api-key KEY API key for the LLM endpoint
-m, --model NAME Model name (overrides config)
-p, --profile NAME Tool profile (contest, dx, propagation, full)
-q, --query TEXT Single query mode — ask one question and exit
--enable-writes Enable write-capable tools (disabled by default)
--list-tools List available tools and exit
--version Show version
| Command | Action |
|---|---|
/tools | List available tools |
/help | Show help |
quit | Exit (also: exit, q, 73) |
qsp-adif-convert converts an ADIF (.adi) log to JSON or NDJSON, with filters for band, mode,
callsign, date range and confirmed QSOs:
qsp-adif-convert -i mylog.adi -o mylog.json
qsp-adif-convert --help
It works on files on your own machine and opens no connection. It used to be adif-mcp convert;
adif-mcp is now only the MCP server.
qsp-client is a strict, stateless pipe between an LLM and MCP tools:
Works with any OpenAI-compatible endpoint: llama.cpp, Ollama, vLLM, SGLang.
--enable-writes opt-in)qsp-client is qsp-mcp, renamed: in the MCP world, -mcp names mark servers, and this is a client.
pip uninstall qsp-mcp && pip install qsp-client.~/.config/qsp-mcp/config.json and ~/.qsp-mcp.json are still read, after the new
~/.config/qsp-client/config.json and ~/.qsp-client.json.qsp-mcp command still works, and says it has moved. Use qsp-client.GPL-3.0-or-later — see LICENSE.
qso-graph.io — MCP servers for amateur radio.