qsp-client
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.
Install
pip install qsp-client
Quick Start
# 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
Configuration
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).
CLI Options
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
Interactive Commands
| Command | Action |
|---|---|
/tools |
List available tools |
/help |
Show help |
quit |
Exit (also: exit, q, 73) |
Design
qsp-client is a strict, stateless pipe between an LLM and MCP tools:
- No caching, no shared state, no health polling
- All state lives in MCP servers
- All inference optimization lives in the inference server (prefix caching, KV-cache)
- qsp-client just connects the two sides
Works with any OpenAI-compatible endpoint: llama.cpp, Ollama, vLLM, SGLang.
Security
- Write-capable tools disabled by default (
--enable-writesopt-in) - Credentials stay inside MCP servers (OS keyring) — never exposed to qsp-client or the LLM
- No subprocess, no shell execution, no eval
- All external connections HTTPS only (LAN endpoints exempted)
Moving from qsp-mcp
qsp-client is qsp-mcp, renamed: in the MCP world, -mcp names mark servers, and this is a client.
pip install -U qsp-mcpnow installs qsp-client, so upgrading needs nothing else.- Your config keeps working:
~/.config/qsp-mcp/config.jsonand~/.qsp-mcp.jsonare still read, after the new~/.config/qsp-client/config.jsonand~/.qsp-client.json. - The
qsp-mcpcommand still works, and says it has moved. Useqsp-client.
License
MIT — see LICENSE.
Part of the qso-graph ecosystem
qso-graph.io — MCP servers for amateur radio.
Release files for qsp-client 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| qsp_client-0.3.0.tar.gz | 30.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| qsp_client-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.7 kB
Release files / qsp_client-0.3.0.tar.gz
| Download URL | qsp_client-0.3.0.tar.gz |
|---|---|
| Size | 30.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d82b465de86d590f073c15b941a0d8870ea53c52bae9d68b84e29fcad2b7f59e
|
|
BLAKE2b-256 checksum How to use checksums |
33e62375389da221955184d1c9eae9a4cdec46883f71cf902ab210d7071b2ab6
|
| 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 Sep 28, 2026.
Transparency logRelease files / qsp_client-0.3.0-py3-none-any.whl
| Download URL | qsp_client-0.3.0-py3-none-any.whl |
|---|---|
| Size | 27.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3d240198d32b830b8fae99900961fced939589be09e08e07b8a85492f5816f03
|
|
BLAKE2b-256 checksum How to use checksums |
48036068de0afd03091be25c2eec906f14fa982f3614a7a79c9278a1e8a58893
|
| 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 Sep 28, 2026.
Transparency log