mcpField
M
mcp-qiskit

mcp-qiskit

本地服务
github.com/daedalus科研与教育026 周前更新

关于 mcp-qiskit

mcp-qiskit 将 Qiskit 2.3.1 的量子计算功能提供给 LLM 和 MCP 客户端,支持构建、分析、可视化电路,并在模拟器或真实后端执行。

主要功能

  1. 01创建和编辑量子电路
  2. 02添加量子门与测量
  3. 03分析电路深度和量子门
  4. 04以多种格式绘制电路
  5. 05管理后端并执行电路

适用场景

  1. 01通过量子门和测量构建电路
  2. 02查看电路深度或量子门定义
  3. 03绘制电路以供检查
  4. 04在模拟器或后端运行电路

MCP 相关

该 MCP 服务提供量子计算工具和资源,包括电路操作,以及动态获取的后端和量子门列表。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"daedalus-mcp-qiskit": {
"command": "uvx",
"args": [
"mcp-qiskit"
]
}
}
}
启动命令uvx mcp-qiskit

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypimcp-qiskit0.1.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

mcp-qiskit

通过模型上下文协议公开 Qiskit 2.3.1 量子计算功能的 MCP 服务。借助标准化的 MCP 工具和资源,让大模型能够创建、操作和执行量子电路。

PyPI Python Ruff TestsAsk DeepWiki

mcp-name: io.github.daedalus/mcp-qiskit

概述

本项目提供一个模型上下文协议(MCP)服务,向大语言模型(LLM)公开 Qiskit 量子计算功能。它让 AI 助手能够:

  • 创建和操作量子电路
  • 在量子模拟器或真实后端上执行电路
  • 分析电路属性(深度、门、操作)
  • 以各种格式可视化电路
  • 管理量子后端
为什么使用它?
  • LLM 集成:让 AI 助手无需外部工具即可执行量子计算任务
  • 标准化接口:MCP 为量子操作提供一致的、基于工具的接口
  • 兼容 Qiskit 2.3.1:专为 Qiskit 2.3.1 设计,支持其所有功能
  • 可扩展:可轻松添加新工具或后端

安装

前置条件
  • Python 3.11 或更高版本
  • Qiskit 2.3.1
  • 正在运行的 MCP 客户端(Claude Desktop、Cursor 等)
从 PyPI 安装
pip install mcp-qiskit[qiskit]

[qiskit] extra 会安装所需的 Qiskit 依赖项。还提供其他 extras:

# Install with development dependencies
pip install mcp-qiskit[dev,test]

# Install with MCP server dependencies
pip install mcp-qiskit[mcp]
从源代码安装
git clone https://github.com/daedalus/mcp-qiskit.git
cd mcp-qiskit
pip install -e ".[all]"

快速入门

作为 Python 库使用
from mcp_qiskit import create_quantum_circuit, add_gate, add_gates, add_measurement, run_circuit

# Create a 2-qubit circuit with 2 classical bits
circuit = create_quantum_circuit(2, 2)

# Apply a Hadamard gate on qubit 0
circuit = add_gate(circuit, "h", [0])

# Apply CNOT gate (control: qubit 0, target: qubit 1)
circuit = add_gate(circuit, "cx", [0, 1])

# Or add multiple gates at once with add_gates
circuit = add_gates(circuit, [
    {"gate": "h", "qubits": [0]},
    {"gate": "cx", "qubits": [0, 1]},
])

# Measure all qubits
circuit = add_measurement(circuit, [0, 1])

# Execute on Aer simulator
result = run_circuit(circuit, "aer_simulator", shots=1024)
print(f"Measurement results: {result['counts']}")
作为 MCP 服务使用
Claude Desktop

将以下内容添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "mcp-qiskit": {
      "command": "mcp-qiskit",
      "env": {}
    }
  }
}
Cursor

在 MCP Servers 下的 Cursor 设置中添加:

{
  "mcpServers": {
    "mcp-qiskit": {
      "command": "mcp-qiskit",
      "args": []
    }
  }
}
其他 MCP 客户端
# Run as stdio server
mcp-qiskit

# Or use the Python module directly
python -m mcp_qiskit

MCP 工具参考

电路创建工具
create_quantum_circuit_tool

创建一个空量子电路,并指定量子比特和经典比特的数量。

参数:

  • num_qubits(int):量子比特数量
  • num_classical_bits(int):用于测量的经典比特数量

**返回值:**表示电路的字典

示例:

circuit = create_quantum_circuit_tool(num_qubits=3, num_classical_bits=3)
# Returns: {"num_qubits": 3, "num_clbits": 3, "operations": [], "name": "circuit"}
add_gate_tool

向电路添加量子门。此工具会在多次调用之间保留电路状态。

参数:

  • circuit(dict,可选):要修改的电路。如果为 None,则自动创建一个包含 8 个量子比特和 8 个经典比特的新电路。
  • gate_name(str):门的名称(例如,“h”、“x”、“cx”、“rx”)
  • qubits(list[int]):要应用门的量子比特索引列表。可以是单个量子比特(例如,[0]),也可以是多个量子比特(例如,[0, 1, 2, 3])。如果为单量子比特门指定了多个量子比特,则会将该门应用于每个量子比特。
  • params(list[float],可选):参数化门的参数

支持的门:

  • 单量子比特:h、x、y、z、s、t、sdg、tdg、i、id
  • 参数化:rx、ry、rz、u1、u2、u3、p
  • 多量子比特:cx、cy、cz、swap
  • 多控门:mcx、mct、mcp、ccx、toffoli、c3x、c3sx、c4x
  • 专用门:rxx、ryy、rzz、ch、cswap、cu、crx、cry、crz

状态维护模式: 始终将上一次调用返回的电路传入,以维护状态:

# Option 1: Pass circuit explicitly
circuit = add_gate_tool(circuit=None, gate_name="h", qubits=[0])  # Creates new circuit
circuit = add_gate_tool(circuit=circuit, gate_name="x", qubits=[1])  # Appends

# Option 2: Use returned circuit
circuit = add_gate_tool(None, "h", [0])
circuit = add_gate_tool(circuit, "cx", [0, 1])
circuit = add_gate_tool(circuit, "rx", [0], [0.5])

对多个量子比特应用单量子比特门: 同时对多个量子比特应用单量子比特门(如 h、x、y、z 等)时,请使用量子比特索引列表:

# Apply H gate to qubits 0, 1, 2, 3 simultaneously
circuit = add_gate_tool(circuit, "h", [0, 1, 2, 3])

# Apply X gate to qubits 4, 5, 6, 7 simultaneously  
circuit = add_gate_tool(circuit, "x", [4, 5, 6, 7])
add_gates_tool

在一次调用中向电路添加多个量子门。此工具会在多次调用之间保留电路状态,并减少所需的工具调用次数。

参数:

  • circuit (dict,可选):要修改的电路。如果为 None,则自动创建一个包含 8 个量子位和 8 个经典位的新电路。
  • gates (list[dict]):门规格列表,每项包含:
    • gate (str):门的名称(例如 "h"、"x"、"cx"、"rx")
    • qubits (list[int]):要应用该门的量子位索引
    • params (list[float],可选):参数化门的参数

示例:

# Add multiple gates in one call (reduces tool calls)
gates = [
    {"gate": "h", "qubits": [0]},
    {"gate": "cx", "qubits": [0, 1]},
    {"gate": "x", "qubits": [2]},
]
circuit = add_gates_tool(circuit=None, gates=gates)

# Can be chained to maintain state
circuit = add_gates_tool(None, [{"gate": "h", "qubits": [0, 1]}])
circuit = add_gates_tool(circuit, [{"gate": "rz", "qubits": [0], "params": [0.5]}])
add_measurement_tool

向量子位添加测量操作。此工具会在多次调用之间保留电路状态。

参数:

  • circuit (dict,可选):要修改的电路。如果为 None,则自动创建一个包含 8 个量子位和 8 个经典位的新电路。
  • qubits (list[int]):要测量的量子位索引
  • clbits (list[int],可选):用于存储结果的经典位索引

示例:

# Maintain state between calls
circuit = add_measurement_tool(circuit=None, qubits=[0, 1])           # Creates new circuit
circuit = add_measurement_tool(circuit=circuit, qubits=[2])          # Appends measurement

# Or use returned circuit
circuit = add_measurement_tool(None, [0, 1])           # Measure q0->c0, q1->c1
circuit = add_measurement_tool(circuit, [0, 1], [1, 0]) # Measure q0->c1, q1->c0
分析工具
get_circuit_depth_tool

返回电路的深度(层数)。

参数:

  • circuit (dict):要分析的电路

**返回值:**表示电路深度的整数

list_available_gates_tool

列出 Qiskit 中所有可用的量子门。

**返回值:**门名称字符串列表

get_gate_definition_tool

获取量子门的详细信息。

参数:

  • gate_name (str):门的名称

**返回值:**包含门属性的字典:

  • name:门名称
  • num_qubits:该门作用的量子位数量
  • num_parameters:参数数量(固定门为 0)
  • params:参数值列表
可视化工具
draw_circuit_tool

以多种格式呈现电路。

参数:

  • circuit (dict):要绘制的电路
  • output_format (str):输出格式——"ascii"、"text"、"mpl"、"latex"

**返回值:**电路的字符串表示

示例输出(ASCII):

     ┌───┐
q_0: ┤ H ├──■──
     └───┘┌─┴─┐
q_1: ────┤ X ├
         └───┘
c: 2/═══════╪═══
         0   1
后端工具
list_backends_tool

列出可用的量子后端。

参数:

  • filters (dict,可选):筛选条件(例如,{"status": "ONLINE"})

**返回值:**后端信息字典列表

get_backend_status_tool

获取后端的状态信息。

参数:

  • backend_name (str):后端名称

**返回值:**包含以下内容的字典:

  • name:后端名称
  • status:状态(ONLINE/OFFLINE)
  • num_qubits:量子位数量
get_backend_configuration_tool

获取后端的详细配置。

参数:

  • backend_name (str):后端名称

**返回值:**包含以下内容的字典:

  • name:后端名称
  • num_qubits:量子位数量
  • coupling_map:量子位连接关系(如适用)
  • basis_gates:可用基门列表
  • max_shots:允许的最大 shots 数
执行工具
run_circuit_tool

执行单个量子电路。

参数:

  • circuit (dict):要执行的电路
  • backend_name (str,可选):后端名称(默认值:"aer_simulator")
  • shots (int,可选):测量次数(默认值:1024)
  • seed (int,可选):用于确保可复现性的随机种子

**返回值:**包含以下内容的字典:

  • status:"COMPLETED" 或错误消息
  • backend:使用的后端
  • shots:测量次数
  • counts:测量结果计数(如果 shots > 0)
  • statevector:状态向量(如果 shots=None)
  • time_taken:执行时间(秒)

示例:

result = run_circuit_tool(circuit, "aer_simulator", shots=1000, seed=42)
# Returns: {"status": "COMPLETED", "counts": {"00": 512, "11": 488}, ...}
run_circuits_tool

批量执行多个电路。

参数:

  • circuits (list[dict]):要执行的电路列表
  • backend_name (str,可选):后端名称
  • shots (int,可选):测量次数
  • seed (int,可选):随机种子

**返回值:**结果字典列表

示例:

circuits = [circuit1, circuit2, circuit3]
results = run_circuits_tool(circuits, shots=100)
# Returns list of 3 result dictionaries
transpile_circuit_tool

转译电路以进行优化或适配特定后端。

参数:

  • circuit (dict):要转译的电路
  • optimization_level (int,可选):0-3(默认值:1)
  • basis_gates (list[str],可选):目标基门

**返回值:**转译后的电路字典

示例:

transpiled = transpile_circuit_tool(circuit, optimization_level=2)

MCP 资源

resource://backends

提供可用量子后端列表。该列表会根据可用提供方动态更新。

resource://gates

提供 Qiskit 中所有可用量子门的列表。

使用示例

创建 Bell 态
# Create 2-qubit circuit
circuit = create_quantum_circuit(2, 2)

# Create Bell state: |Φ+⟩ = (|00⟩ + |11⟩) / √2
circuit = add_gate(circuit, "h", [0])
circuit = add_gate(circuit, "cx", [0, 1])
circuit = add_measurement(circuit, [0, 1])

# Execute
result = run_circuit(circuit, "aer_simulator", shots=1000)
print(result["counts"])  # Approximately {"00": 500, "11": 500}
运行 Grover 算法
def create_grover_circuit(num_qubits, iterations):
    circuit = create_quantum_circuit(num_qubits, num_qubits)
    
    # Initial superposition
    for i in range(num_qubits):
        circuit = add_gate(circuit, "h", [i])
    
    # Grover iterations
    for _ in range(iterations):
        # Oracle (marked state |11...1⟩)
        for i in range(num_qubits):
            circuit = add_gate(circuit, "x", [i])
        circuit = add_gate(circuit, "cx", list(range(num_qubits - 1)), [num_qubits - 1])
        for i in range(num_qubits):
            circuit = add_gate(circuit, "x", [i])
        
        # Diffusion operator
        for i in range(num_qubits):
            circuit = add_gate(circuit, "h", [i])
        for i in range(num_qubits):
            circuit = add_gate(circuit, "x", [i])
        circuit = add_gate(circuit, "cx", list(range(num_qubits - 1)), [num_qubits - 1])
        for i in range(num_qubits):
            circuit = add_gate(circuit, "x", [i])
        for i in range(num_qubits):
            circuit = add_gate(circuit, "h", [i])
    
    # Measurement
    circuit = add_measurement(circuit, list(range(num_qubits)))
    return circuit

circuit = create_grover_circuit(3, 1)
result = run_circuit(circuit, "aer_simulator", shots=1000)
绘制和分析电路
circuit = create_quantum_circuit(2, 2)
circuit = add_gate(circuit, "h", [0])
circuit = add_gate(circuit, "cx", [0, 1])
circuit = add_measurement(circuit, [0, 1])

# Get depth
depth = get_circuit_depth(circuit)
print(f"Circuit depth: {depth}")

# List gates
gates = list_available_gates()
print(f"Available gates: {len(gates)}")

# Draw circuit
ascii_output = draw_circuit(circuit, "ascii")
print(ascii_output)
运行 Shor 算法
from mcp_qiskit import (
    create_quantum_circuit,
    add_gate,
    add_measurement,
    run_circuit,
)

def build_shor_circuit(N=15, a=2, n_count=8):
    """Build Shor's factoring circuit for N=15 using MCX gates."""
    n = N.bit_length()
    circuit = create_quantum_circuit(n_count + n, n_count)
    
    # Superposition on first register
    for i in range(n_count):
        circuit = add_gate(circuit, "h", [i])
    
    # Initialize second register to |1>
    circuit = add_gate(circuit, "x", [n_count])
    
    # Controlled modular exponentiation using MCX
    for i in range(n_count):
        power = pow(a, 2**i, N)
        for j in range(n):
            if (power >> j) & 1:
                circuit = add_gate(circuit, "mcx", [[i], [n_count + j]])
    
    # Inverse QFT (simplified)
    for i in range(n_count - 1, -1, -1):
        for j in range(i + 1, n_count):
            circuit = add_gate(circuit, "cp", [i, j], [3.14159 / (2 ** (j - i))])
        circuit = add_gate(circuit, "h", [i])
    
    # Measure first register
    circuit = add_measurement(circuit, list(range(n_count)))
    return circuit

# Run Shor's algorithm to factor 15
circuit = build_shor_circuit(N=15, a=2, n_count=8)
result = run_circuit(circuit, "aer_simulator", shots=1000)
print(f"Results: {result['counts']}")

完整实现(包含因数提取)请参见 examples/shor_example.py。

使用 MCP Qiskit 工具运行 Shor 算法

使用 MCP Qiskit 服务工具构建 Shor 算法电路,对 N=15 进行因数分解:

# Step 1: Create an 8-qubit circuit with 4 classical bits
circuit = create_quantum_circuit_tool(num_qubits=8, num_classical_bits=4)

# Step 2: Apply H gates to qubits 0-3 (superposition)
circuit = add_gate_tool(circuit=circuit, gate_name="h", qubits=[0, 1, 2, 3])

# Step 3: Apply X gates to qubits 4-7 (initialize to |1⟩)
circuit = add_gate_tool(circuit=circuit, gate_name="x", qubits=[4, 5, 6, 7])

# Step 4: Add modular exponentiation using CP gates
circuit = add_gate_tool(circuit=circuit, gate_name="cp", qubits=[0, 4], params=[3.14159/2])  # CP(π/2)
circuit = add_gate_tool(circuit=circuit, gate_name="cp", qubits=[1, 6], params=[3.14159/4])  # CP(π/4)
circuit = add_gate_tool(circuit=circuit, gate_name="cp", qubits=[2, 4], params=[3.14159])    # CP(π)
circuit = add_gate_tool(circuit=circuit, gate_name="cp", qubits=[3, 4], params=[3.14159])    # CP(π)

# Step 5: Apply inverse QFT using H and CP gates (reverse order)
# CP(π/4) on [2,3], CP(π/2) on [1,2], CP(π) on [0,1]
circuit = add_gate_tool(circuit=circuit, gate_name="cp", qubits=[2, 3], params=[3.14159/4])
circuit = add_gate_tool(circuit=circuit, gate_name="cp", qubits=[1, 2], params=[3.14159/2])
circuit = add_gate_tool(circuit=circuit, gate_name="cp", qubits=[0, 1], params=[3.14159])
# H gates in reverse order
circuit = add_gate_tool(circuit=circuit, gate_name="h", qubits=[3, 2, 1, 0])

# Step 6: Measure qubits 0-3
circuit = add_measurement_tool(circuit=circuit, qubits=[0, 1, 2, 3])

# Step 7: Run on aer_simulator
result = run_circuit_tool(circuit=circuit, backend_name="aer_simulator", shots=1024, seed=42)
print(f"Measurement results: {result['counts']}")

# Extract factors from the measurement result:
# 1. Compute the phase from measurement outcome
# 2. Find order r via continued fractions
# 3. Calculate gcd(a^(r/2) ± 1, N)
# Expected: Factorization of 15 = 3 × 5

架构

mcp-qiskit/
├── src/mcp_qiskit/
│   ├── __init__.py          # Package exports
│   ├── __main__.py          # CLI entry point
│   ├── _circuit.py           # Circuit operations
│   ├── _backend.py           # Backend management
│   ├── _execution.py         # Circuit execution
│   └── _mcp.py               # MCP server definition
├── tests/                    # Test suite
├── SPEC.md                   # Project specification
└── README.md                 # This file
模块职责
  • _circuit.py:量子电路创建、量子门、测量、可视化
  • _backend.py:后端发现、状态、配置
  • _execution.py:电路执行、转译
  • _mcp.py:FastMCP 服务定义、工具注册

要求

  • Python 3.11+
  • qiskit >= 2.3.1
  • qiskit-aer >= 0.14.0
  • fastmcp >= 2.0

开发

设置
git clone https://github.com/daedalus/mcp-qiskit.git
cd mcp-qiskit
pip install -e ".[all]"
运行测试
pytest -v
代码质量
# Format code
ruff format src/ tests/

# Lint
ruff check src/ tests/

# Type check
mypy src/
Pre-commit 钩子
pre-commit install

故障排查

API 密钥和凭据

此软件包支持两种类型的后端:

  1. Aer 模拟器(默认)——在本地运行,无需 API 密钥
  2. IBM Quantum——需要 IBM Quantum API 令牌
使用 IBM Quantum 后端

若要使用 IBM Quantum 后端,需要提供 API 令牌:

选项 1:环境变量

export IBM_QUANTUM_TOKEN="your_api_token_here"

或在 Python 代码中:

import os
os.environ["IBM_QUANTUM_TOKEN"] = "your_api_token_here"

选项 2:通过 Qiskit 保存凭据

from qiskit_ibm_provider import IBMProvider

# Save your account (only needs to be done once)
IBMProvider.save_account(token="your_api_token_here", overwrite=True)

# Now you can use IBM backends
from mcp_qiskit._backend import list_backends, get_backend

backends = list_backends()  # Will include IBM backends
backend = get_backend("ibm_qasm_simulator")  # Or specific IBM backend

获取 IBM Quantum 令牌:

  1. 在 IBM Quantum 创建账户
  2. 前往 Account > My Tokens
  3. 复制 API 令牌

MCP 服务的环境变量:

作为 MCP 服务运行时,请在启动前设置环境变量:

export IBM_QUANTUM_TOKEN="your_token"
mcp-qiskit

或在 MCP 客户端配置中设置:

{
  "mcpServers": {
    "mcp-qiskit": {
      "command": "mcp-qiskit",
      "env": {
        "IBM_QUANTUM_TOKEN": "your_token_here"
      }
    }
  }
}
未找到后端

如果出现“Backend not found”,请确认后端名称正确:

# List available backends
backends = list_backends()
print([b["name"] for b in backends])
导入错误

确保已正确安装 Qiskit:

pip install qiskit==2.3.1 qiskit-aer
MCP 连接问题

确认服务正在运行:

mcp-qiskit --help

许可证

MIT 许可证——详见 LICENSE 文件。

贡献

欢迎贡献!请在 GitHub 上提出问题或提交 PR。

相关项目

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。