Local openQA mcp client
Project description
openqa-mcp
An MCP server that exposes curated, typed tools over the openQA REST API. It is built on fastmcp 3.x and the openqa-async transport client.
Read tools work anonymously; mutating tools require API credentials and
return 403 without them.
Install
uv sync
This installs the package and its dependencies into a project virtualenv
and exposes the openqa-mcp console script.
Configuration
The server reads its configuration from environment variables, falling back to the openQA client config file for credentials.
Environment variables
| Variable | Default | Purpose |
|---|---|---|
OPENQA_SERVER |
openqa-async default | openQA host (e.g. openqa.opensuse.org). |
OPENQA_API_KEY |
(unset) | API key; overrides the config file when set. |
OPENQA_API_SECRET |
(unset) | API secret; overrides the config file when set. |
OPENQA_VERIFY |
true |
TLS verification: true/false, or a path to a CA bundle. |
OPENQA_API_KEY and OPENQA_API_SECRET only take effect when both are
set; a partial pair is ignored so the client is never half-configured.
Config file
If the env credentials are not set, openqa-async loads them from
~/.config/openqa/client.conf (or /etc/openqa/client.conf). Generate a
key/secret from the API keys page of your openQA instance and add a section
keyed by the host:
[openqa.opensuse.org]
key = YOUR_API_KEY
secret = YOUR_API_SECRET
Without any credentials the server is GET-only (read tools succeed, mutating
tools get 403).
Tools
Read tools
| Tool | Description |
|---|---|
list_jobs |
List jobs matching the given filters. |
list_jobs_overview |
List a condensed jobs overview matching the given filters. |
get_job |
Get full details for a single job. |
get_job_comments |
List comments on a job. |
list_machines |
List configured worker machines. |
list_test_suites |
List configured test suites. |
list_products |
List configured products (mediums). |
find_jobs_by_setting |
Find jobs whose setting key equals list_value. |
list_jobs and list_jobs_overview accept the same optional filters:
state, result, distri, version, build, test, arch, machine,
groupid, group, latest, limit, page, ids. Unset filters are
dropped from the request.
Mutating tools (require credentials)
| Tool | Description |
|---|---|
restart_jobs |
Restart each of the given jobs. |
cancel_job |
Cancel a running or scheduled job. |
add_job_comment |
Add a comment to a job. |
trigger_isos |
Trigger ISO test scheduling for a product. |
delete_job |
Delete a job. |
Mutating tools carry the mutating tag so MCP clients can gate them behind
confirmation. To drop them entirely, start the server in read-only mode with
--readonly (or OPENQA_READONLY=true): the mutating tools are never
registered, so clients see only the read tools.
Running
stdio (default)
Most local MCP clients spawn the server over stdio. Wire it in with:
uv run openqa-mcp
Example MCP client configuration:
{
"mcpServers": {
"openqa": {
"command": "uv",
"args": ["run", "openqa-mcp"],
"env": {
"OPENQA_SERVER": "openqa.opensuse.org"
}
}
}
}
HTTP (optional)
For remote or shared deployments, run over HTTP with --http:
uv run openqa-mcp --http --server 127.0.0.1 --port 8000
The server can also be launched as a module:
uv run python -m openqa_mcp --http --port 8000
| Flag | Default | Purpose |
|---|---|---|
--http |
off | Serve over HTTP instead of stdio. |
--stdio |
on | Serve over stdio; overrides OPENQA_MCP_TRANSPORT=http. |
--server |
127.0.0.1 |
HTTP bind host. |
--port |
8000 |
HTTP bind port. |
--readonly |
off | Unregister all mutating tools (read-only server). |
Flags override the environment, which supplies the defaults:
| Variable | Default | Purpose |
|---|---|---|
OPENQA_MCP_TRANSPORT |
stdio |
Set to http to serve over HTTP. |
OPENQA_MCP_HOST |
127.0.0.1 |
Default HTTP bind host. |
OPENQA_MCP_PORT |
8000 |
Default HTTP bind port. |
OPENQA_READONLY |
false |
Set truthy (1/true/yes/on) to disable mutating tools. |
Press Ctrl-C to stop; the server shuts down cleanly and closes its client.
Development
uv run pytest # run the test suite
uv run ruff check . # lint
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openqa_mcp-0.1.0.tar.gz.
File metadata
- Download URL: openqa_mcp-0.1.0.tar.gz
- Upload date:
- Size: 6.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4216ac58b79f1513b1699c9275b64d8c7ca58668bec8c474e58319f6717989c2
|
|
| MD5 |
73c9efee2c6a8a6dd9448d86d9f84fe2
|
|
| BLAKE2b-256 |
1aed8c06bd0b0fb5e128d31912719be5ea34f135af488c0d14dcc9b27fea83fb
|
Provenance
The following attestation bundles were made for openqa_mcp-0.1.0.tar.gz:
Publisher:
release.yml on mimi1vx/openqa-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openqa_mcp-0.1.0.tar.gz -
Subject digest:
4216ac58b79f1513b1699c9275b64d8c7ca58668bec8c474e58319f6717989c2 - Sigstore transparency entry: 2088926248
- Sigstore integration time:
-
Permalink:
mimi1vx/openqa-mcp@8ba71e8ffc450cf40e2df355ef1911f89a9212fb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mimi1vx
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8ba71e8ffc450cf40e2df355ef1911f89a9212fb -
Trigger Event:
push
-
Statement type:
File details
Details for the file openqa_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: openqa_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e250106b5047b6f2310d3677c633f02b302e3ad47aba3bbb0563d0951ba9441
|
|
| MD5 |
6884531a5d2e7e50086fabb0f76a9bed
|
|
| BLAKE2b-256 |
515ab0089e6a9cea4da8ed57837c585bcd9b93a59f908be43415f07d15017579
|
Provenance
The following attestation bundles were made for openqa_mcp-0.1.0-py3-none-any.whl:
Publisher:
release.yml on mimi1vx/openqa-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openqa_mcp-0.1.0-py3-none-any.whl -
Subject digest:
3e250106b5047b6f2310d3677c633f02b302e3ad47aba3bbb0563d0951ba9441 - Sigstore transparency entry: 2088926421
- Sigstore integration time:
-
Permalink:
mimi1vx/openqa-mcp@8ba71e8ffc450cf40e2df355ef1911f89a9212fb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mimi1vx
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8ba71e8ffc450cf40e2df355ef1911f89a9212fb -
Trigger Event:
push
-
Statement type: