Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 0 additions & 30 deletions .github/workflows/publish-mcp-registry.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ on:
options:
- all
- qiskit
- code-assistant
- docs
- runtime
- transpiler
Expand Down Expand Up @@ -49,35 +48,6 @@ jobs:
working-directory: ./qiskit-mcp-server
run: mcp-publisher publish

publish-code-assistant-mcp-registry:
if: |
(github.event_name == 'release' && contains(github.ref, 'code-assistant')) ||
(github.event_name == 'workflow_dispatch' && (github.event.inputs.package == 'all' || github.event.inputs.package == 'code-assistant'))
runs-on: ubuntu-latest
permissions:
id-token: write # Required for GitHub OIDC authentication
contents: read

steps:
- uses: actions/checkout@v4

- name: Wait for PyPI availability
working-directory: ./qiskit-code-assistant-mcp-server
run: ${{ github.workspace }}/.github/scripts/wait-for-pypi.sh

- name: Download mcp-publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64.tar.gz" | tar xz mcp-publisher
sudo mv mcp-publisher /usr/local/bin/
mcp-publisher --help

- name: Login to MCP Registry (OIDC)
run: mcp-publisher login github-oidc

- name: Publish to MCP Registry
working-directory: ./qiskit-code-assistant-mcp-server
run: mcp-publisher publish

publish-runtime-mcp-registry:
if: |
(github.event_name == 'release' && contains(github.ref, 'runtime')) ||
Expand Down
43 changes: 1 addition & 42 deletions .github/workflows/publish-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ on:
- all
- meta-package
- qiskit
- code-assistant
- docs
- runtime
- transpiler
Expand Down Expand Up @@ -60,45 +59,6 @@ jobs:
packages-dir: qiskit-mcp-server/dist/
verbose: true

publish-code-assistant:
if: |
(github.event_name == 'release' && contains(github.ref, 'code-assistant')) ||
(github.event_name == 'workflow_dispatch' && (github.event.inputs.package == 'all' || github.event.inputs.package == 'code-assistant'))
runs-on: ubuntu-latest
permissions:
id-token: write # Required for trusted publishing
contents: read

steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v3
with:
version: "latest"

- name: Set up Python
run: uv python install 3.12

- name: Build package
working-directory: ./qiskit-code-assistant-mcp-server
run: |
uv build --out-dir dist

- name: Verify build output
run: |
ls -la qiskit-code-assistant-mcp-server/dist/
if [ ! -d "qiskit-code-assistant-mcp-server/dist" ] || [ -z "$(ls -A qiskit-code-assistant-mcp-server/dist)" ]; then
echo "ERROR: Build did not produce any distribution files"
exit 1
fi

- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: qiskit-code-assistant-mcp-server/dist/
verbose: true

publish-runtime:
if: |
(github.event_name == 'release' && contains(github.ref, 'runtime')) ||
Expand Down Expand Up @@ -258,12 +218,11 @@ jobs:
publish-meta-package:
runs-on: ubuntu-latest
# Meta-package should be published after individual servers
needs: [publish-qiskit, publish-code-assistant, publish-docs, publish-runtime, publish-transpiler, publish-gym]
needs: [publish-qiskit, publish-docs, publish-runtime, publish-transpiler, publish-gym]
# Allow meta-package to run even if individual packages were skipped (already published)
if: |
always() &&
(needs.publish-qiskit.result == 'success' || needs.publish-qiskit.result == 'skipped') &&
(needs.publish-code-assistant.result == 'success' || needs.publish-code-assistant.result == 'skipped') &&
(needs.publish-docs.result == 'success' || needs.publish-docs.result == 'skipped') &&
(needs.publish-runtime.result == 'success' || needs.publish-runtime.result == 'skipped') &&
(needs.publish-transpiler.result == 'success' || needs.publish-transpiler.result == 'skipped') &&
Expand Down
53 changes: 5 additions & 48 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,87 +24,44 @@ jobs:

- name: Install dependencies
run: |
cd qiskit-code-assistant-mcp-server && uv sync --group dev
cd ../qiskit-docs-mcp-server && uv sync --group dev
cd qiskit-docs-mcp-server && uv sync --group dev
cd ../qiskit-ibm-runtime-mcp-server && uv sync --group dev
cd ../qiskit-ibm-transpiler-mcp-server && uv sync --group dev
cd ../qiskit-mcp-server && uv sync --group dev
cd ../qiskit-gym-mcp-server && uv sync --group dev

- name: Run ruff linting
run: |
cd qiskit-code-assistant-mcp-server && uv run ruff check src tests
cd ../qiskit-docs-mcp-server && uv run ruff check src tests
cd qiskit-docs-mcp-server && uv run ruff check src tests
cd ../qiskit-ibm-runtime-mcp-server && uv run ruff check src tests
cd ../qiskit-ibm-transpiler-mcp-server && uv run ruff check src tests
cd ../qiskit-mcp-server && uv run ruff check src tests
cd ../qiskit-gym-mcp-server && uv run ruff check src tests

- name: Run ruff formatting check
run: |
cd qiskit-code-assistant-mcp-server && uv run ruff format --check src tests
cd ../qiskit-docs-mcp-server && uv run ruff format --check src tests
cd qiskit-docs-mcp-server && uv run ruff format --check src tests
cd ../qiskit-ibm-runtime-mcp-server && uv run ruff format --check src tests
cd ../qiskit-ibm-transpiler-mcp-server && uv run ruff format --check src tests
cd ../qiskit-mcp-server && uv run ruff format --check src tests
cd ../qiskit-gym-mcp-server && uv run ruff format --check src tests

- name: Run type checking
run: |
cd qiskit-code-assistant-mcp-server && uv run mypy --config-file ../mypy.ini src
cd ../qiskit-docs-mcp-server && uv run mypy --config-file ../mypy.ini src
cd qiskit-docs-mcp-server && uv run mypy --config-file ../mypy.ini src
cd ../qiskit-ibm-runtime-mcp-server && uv run mypy --config-file ../mypy.ini src
cd ../qiskit-ibm-transpiler-mcp-server && uv run mypy --config-file ../mypy.ini src
cd ../qiskit-mcp-server && uv run mypy --config-file ../mypy.ini src
cd ../qiskit-gym-mcp-server && uv run mypy --config-file ../mypy.ini src

- name: Run security checks
run: |
cd qiskit-code-assistant-mcp-server && uv run bandit -c pyproject.toml -r src
cd ../qiskit-docs-mcp-server && uv run bandit -c pyproject.toml -r src
cd qiskit-docs-mcp-server && uv run bandit -c pyproject.toml -r src
cd ../qiskit-ibm-runtime-mcp-server && uv run bandit -c pyproject.toml -r src
cd ../qiskit-ibm-transpiler-mcp-server && uv run bandit -c pyproject.toml -r src
cd ../qiskit-mcp-server && uv run bandit -c pyproject.toml -r src
cd ../qiskit-gym-mcp-server && uv run bandit -c pyproject.toml -r src

test-code-assistant:
runs-on: ubuntu-latest
needs: lint
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]

steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v3
with:
version: "latest"
enable-cache: true

- name: Set up Python ${{ matrix.python-version }}
run: uv python install ${{ matrix.python-version }}

- name: Install dependencies for Code Assistant server
working-directory: ./qiskit-code-assistant-mcp-server
run: |
uv sync --group dev --group test

- name: Run tests for Code Assistant server
working-directory: ./qiskit-code-assistant-mcp-server
env:
QISKIT_IBM_TOKEN: ${{ secrets.QISKIT_IBM_TOKEN }}
run: |
uv run pytest tests/ -v --cov=src --cov-report=xml --cov-report=term-missing

- name: Upload coverage for Code Assistant server
uses: codecov/codecov-action@v3
with:
file: ./qiskit-code-assistant-mcp-server/coverage.xml
flags: code-assistant
name: code-assistant-coverage

test-runtime:
runs-on: ubuntu-latest
needs: lint
Expand Down
87 changes: 9 additions & 78 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,11 @@ qiskit-mcp-servers is a collection of **Model Context Protocol (MCP)** servers t

### Repository Structure

This is a **monorepo** using uv workspace containing six independent MCP servers:
This is a **monorepo** using uv workspace containing five independent MCP servers:

```
qiskit-mcp-servers/
├── qiskit-mcp-server/ # Core Qiskit transpilation
├── qiskit-code-assistant-mcp-server/ # AI code completion
├── qiskit-docs-mcp-server/ # Documentation retrieval
├── qiskit-ibm-runtime-mcp-server/ # IBM Quantum cloud services
├── qiskit-ibm-transpiler-mcp-server/ # AI-powered transpilation
Expand Down Expand Up @@ -72,7 +71,6 @@ The root `pyproject.toml` defines a uv workspace:
[tool.uv.workspace]
members = [
"qiskit-mcp-server",
"qiskit-code-assistant-mcp-server",
"qiskit-docs-mcp-server",
"qiskit-ibm-runtime-mcp-server",
"qiskit-ibm-transpiler-mcp-server",
Expand All @@ -82,9 +80,11 @@ members = [

The root package is also a **meta-package** that installs all servers:
```bash
pip install qiskit-mcp-servers # Installs all six servers
pip install qiskit-mcp-servers # Installs all five servers
```

> **Removed:** A `qiskit-code-assistant-mcp-server` previously lived in this monorepo. It was removed because the underlying Qiskit Code Assistant service has been [discontinued by IBM Quantum](https://quantum.cloud.ibm.com/announcements/en/product-updates/2026-04-28-qiskit-code-assistant-service-to-sunset). The PyPI package `qiskit-code-assistant-mcp-server` is archived. Do not re-introduce references to it.

### Component Structure

Each MCP server follows this standard structure:
Expand Down Expand Up @@ -153,43 +153,7 @@ Each MCP server follows this standard structure:

---

### 2. Qiskit Code Assistant MCP Server

**Purpose**: Intelligent quantum code completion and assistance

**Directory**: [`qiskit-code-assistant-mcp-server/`](qiskit-code-assistant-mcp-server/)

**Core Files**:
- `server.py`: FastMCP server with tool/resource definitions
- `qca.py`: Qiskit Code Assistant API integration (async)
- `constants.py`: API endpoints and configuration
- `utils.py`: HTTP client management and utilities

**Tools Provided**:
| Tool | Description |
|------|-------------|
| `get_completion_tool` | Get code completion for quantum code prompts |
| `get_rag_completion_tool` | RAG-based completion with documentation context |
| `accept_completion_tool` | Mark a completion as accepted (telemetry) |
| `accept_model_disclaimer_tool` | Accept disclaimer for a model |

**Resources Provided**:
| Resource URI | Description |
|--------------|-------------|
| `qca://status` | Service status and connection info |
| `qca://models` | List available models |
| `qca://model/{model_id}` | Specific model information |
| `qca://disclaimer/{model_id}` | Model disclaimer information |

**Environment Variables**:
- `QISKIT_IBM_TOKEN`: IBM Quantum API token (required)
- `QCA_TOOL_API_BASE`: API base URL (default: https://qiskit-code-assistant.quantum.ibm.com)
- `QCA_TOOL_MODEL_NAME`: Model to use for completions
- `QCA_MCP_DEBUG_LEVEL`: Logging level (default: INFO)

---

### 3. Qiskit Documentation MCP Server
### 2. Qiskit Documentation MCP Server

**Purpose**: Query and retrieve Qiskit documentation, guides, and API references

Expand Down Expand Up @@ -237,7 +201,7 @@ Each MCP server follows this standard structure:

---

### 4. Qiskit IBM Runtime MCP Server
### 3. Qiskit IBM Runtime MCP Server

**Purpose**: Complete access to IBM Quantum cloud services

Expand Down Expand Up @@ -304,7 +268,7 @@ Each MCP server follows this standard structure:

---

### 5. Qiskit IBM Transpiler MCP Server
### 4. Qiskit IBM Transpiler MCP Server

**Purpose**: AI-powered circuit transpilation with routing and synthesis

Expand Down Expand Up @@ -341,7 +305,7 @@ Each MCP server follows this standard structure:

---

### 6. Qiskit Gym MCP Server
### 5. Qiskit Gym MCP Server

**Purpose**: Reinforcement learning-based quantum circuit synthesis

Expand Down Expand Up @@ -467,17 +431,6 @@ AI Assistant → MCP Client → transpile_circuit_tool
Transpiled circuit (QPY format)
```

### Qiskit Code Assistant Server
```
AI Assistant → MCP Client → get_completion_tool
qca.py (async functions)
IBM Qiskit Code Assistant API
Code completion response
```

### Qiskit Documentation Server
```
AI Assistant → MCP Client → search_docs_tool / get_page_tool
Expand Down Expand Up @@ -559,7 +512,6 @@ AI Assistant → MCP Client → create_*_env_tool → start_training_tool
```bash
# Run specific servers
uv run qiskit-mcp-server
uv run qiskit-code-assistant-mcp-server
uv run qiskit-ibm-runtime-mcp-server
uv run qiskit-ibm-transpiler-mcp-server
uv run qiskit-docs-mcp-server
Expand Down Expand Up @@ -830,7 +782,6 @@ When adding a new MCP server, you must update the following GitHub configuration
| Server | Release Tag Pattern |
|--------|---------------------|
| qiskit-mcp-server | `qiskit-v*` |
| qiskit-code-assistant-mcp-server | `code-assistant*` |
| qiskit-ibm-runtime-mcp-server | `runtime*` |
| qiskit-ibm-transpiler-mcp-server | `transpiler*` |
| qiskit-docs-mcp-server | `docs*` |
Expand Down Expand Up @@ -978,7 +929,7 @@ Each server is also published to the [MCP Registry](https://registry.modelcontex

**Automated publishing** (recommended):
- Publishing happens automatically via GitHub Actions when a release is created
- Uses the same release tags as PyPI (`qiskit-v*`, `code-assistant*`, `runtime*`, `transpiler*`, `docs*`, `gym*`)
- Uses the same release tags as PyPI (`qiskit-v*`, `runtime*`, `transpiler*`, `docs*`, `gym*`)
- Uses GitHub OIDC authentication (no secrets required)

**Manual publishing**:
Expand Down Expand Up @@ -1016,7 +967,6 @@ Each server has a `server.json` file that defines its MCP Registry metadata:

### Server-Specific Documentation
- `qiskit-mcp-server/README.md`: Core Qiskit server docs
- `qiskit-code-assistant-mcp-server/README.md`: Code Assistant server docs
- `qiskit-ibm-runtime-mcp-server/README.md`: IBM Runtime server docs
- `qiskit-ibm-transpiler-mcp-server/README.md`: IBM Transpiler server docs
- `qiskit-docs-mcp-server/README.md`: Documentation server docs
Expand Down Expand Up @@ -1155,25 +1105,6 @@ qiskit-mcp-servers/
│ ├── LICENSE
│ ├── README.md
│ └── run_tests.sh
├── qiskit-code-assistant-mcp-server/
│ ├── src/qiskit_code_assistant_mcp_server/
│ │ ├── __init__.py
│ │ ├── server.py # FastMCP server
│ │ ├── qca.py # Core async functions
│ │ ├── constants.py # Configuration
│ │ └── utils.py # Utilities
│ ├── tests/
│ │ ├── conftest.py
│ │ └── test_*.py
│ ├── examples/
│ │ ├── README.md
│ │ ├── langchain_agent.ipynb
│ │ └── langchain_agent.py
│ ├── pyproject.toml
│ ├── pytest.ini
│ ├── LICENSE
│ ├── README.md
│ └── run_tests.sh
├── qiskit-docs-mcp-server/
│ ├── src/qiskit_docs_mcp_server/
│ │ ├── __init__.py
Expand Down
Loading
Loading