| """ |
| Quantum Tools: MCP endpoint wrappers registered as tools. |
| All 23 MCP endpoints wrapped as callable tools for agents. |
| """ |
|
|
| from typing import Any, Dict, Optional |
| from .tool_registry import register_tool, ToolCategory, registry |
|
|
| |
| def _get_client(): |
| from client import get_client |
| return get_client() |
|
|
|
|
| |
|
|
| @register_tool( |
| name="create_from_template", |
| description="Create a quantum circuit from a predefined template (bell_state, ghz, qft, grover, etc.)", |
| category=ToolCategory.CREATION, |
| parameters={ |
| "template": {"type": "string", "description": "Template name", "required": True}, |
| "num_qubits": {"type": "integer", "description": "Number of qubits", "required": False} |
| }, |
| returns="QASM code of the created circuit" |
| ) |
| def create_from_template(template: str, num_qubits: int = 2) -> Dict: |
| response = _get_client().create_circuit_from_template(template, num_qubits) |
| return {"success": response.success, "qasm": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="generate_random_circuit", |
| description="Generate a random quantum circuit with specified parameters", |
| category=ToolCategory.CREATION, |
| parameters={ |
| "num_qubits": {"type": "integer", "description": "Number of qubits", "required": True}, |
| "depth": {"type": "integer", "description": "Circuit depth", "required": True}, |
| "gate_set": {"type": "string", "description": "Comma-separated gates (h,cx,rz)", "required": False} |
| }, |
| returns="QASM code of the random circuit" |
| ) |
| def generate_random_circuit(num_qubits: int, depth: int, gate_set: str = "h,cx,rz") -> Dict: |
| response = _get_client().generate_random_circuit(num_qubits, depth, gate_set) |
| return {"success": response.success, "qasm": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="generate_from_description", |
| description="Generate a circuit from natural language description", |
| category=ToolCategory.CREATION, |
| parameters={ |
| "description": {"type": "string", "description": "Natural language description of the circuit", "required": True} |
| }, |
| returns="QASM code of the generated circuit" |
| ) |
| def generate_from_description(description: str) -> Dict: |
| response = _get_client().generate_circuit_from_description(description) |
| return {"success": response.success, "qasm": response.data, "error": response.error} |
|
|
|
|
| |
|
|
| @register_tool( |
| name="parse_qasm", |
| description="Parse OpenQASM code and extract circuit structure", |
| category=ToolCategory.ANALYSIS, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Parsed circuit structure with gates, qubits, etc." |
| ) |
| def parse_qasm(qasm: str) -> Dict: |
| response = _get_client().parse_qasm(qasm) |
| return {"success": response.success, "structure": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="analyze_circuit", |
| description="Analyze circuit properties: depth, gate count, qubit usage", |
| category=ToolCategory.ANALYSIS, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Circuit analysis with depth, gate counts, etc." |
| ) |
| def analyze_circuit(qasm: str) -> Dict: |
| response = _get_client().analyze_circuit(qasm) |
| return {"success": response.success, "analysis": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="get_circuit_depth", |
| description="Get the depth of a quantum circuit", |
| category=ToolCategory.ANALYSIS, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Integer depth value" |
| ) |
| def get_circuit_depth(qasm: str) -> Dict: |
| response = _get_client().get_circuit_depth(qasm) |
| return {"success": response.success, "depth": response.data, "error": response.error} |
|
|
|
|
| |
|
|
| @register_tool( |
| name="validate_syntax", |
| description="Validate QASM syntax for correctness", |
| category=ToolCategory.VALIDATION, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Validation result with any syntax errors" |
| ) |
| def validate_syntax(qasm: str) -> Dict: |
| response = _get_client().validate_syntax(qasm) |
| return {"success": response.success, "valid": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="check_connectivity", |
| description="Check if circuit respects hardware qubit connectivity", |
| category=ToolCategory.VALIDATION, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True}, |
| "hardware": {"type": "string", "description": "Hardware profile (ibm_eagle, ionq_aria, rigetti_aspen)", "required": False} |
| }, |
| returns="Connectivity check result" |
| ) |
| def check_connectivity(qasm: str, hardware: str = "ibm_eagle") -> Dict: |
| response = _get_client().check_connectivity(qasm, hardware) |
| return {"success": response.success, "result": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="verify_unitary", |
| description="Verify that circuit produces a valid unitary matrix", |
| category=ToolCategory.VALIDATION, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Unitary verification result" |
| ) |
| def verify_unitary(qasm: str) -> Dict: |
| response = _get_client().verify_unitary(qasm) |
| return {"success": response.success, "result": response.data, "error": response.error} |
|
|
|
|
| |
|
|
| @register_tool( |
| name="simulate_circuit", |
| description="Simulate circuit execution and get measurement results", |
| category=ToolCategory.SIMULATION, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True}, |
| "shots": {"type": "integer", "description": "Number of measurement shots", "required": False} |
| }, |
| returns="Measurement results with counts" |
| ) |
| def simulate_circuit(qasm: str, shots: int = 1024) -> Dict: |
| response = _get_client().simulate_circuit(qasm, shots) |
| return {"success": response.success, "results": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="get_statevector", |
| description="Get the statevector of a circuit (no measurement)", |
| category=ToolCategory.SIMULATION, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Statevector as complex amplitudes" |
| ) |
| def get_statevector(qasm: str) -> Dict: |
| response = _get_client().get_statevector(qasm) |
| return {"success": response.success, "statevector": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="get_probabilities", |
| description="Get probability distribution from circuit", |
| category=ToolCategory.SIMULATION, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Probability distribution over computational basis states" |
| ) |
| def get_probabilities(qasm: str) -> Dict: |
| response = _get_client().get_probabilities(qasm) |
| return {"success": response.success, "probabilities": response.data, "error": response.error} |
|
|
|
|
| |
|
|
| @register_tool( |
| name="calculate_complexity", |
| description="Calculate circuit complexity score (lower is better)", |
| category=ToolCategory.SCORING, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Complexity score and breakdown" |
| ) |
| def calculate_complexity(qasm: str) -> Dict: |
| response = _get_client().calculate_complexity_score(qasm) |
| return {"success": response.success, "score": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="calculate_hardware_fitness", |
| description="Calculate how well circuit fits target hardware", |
| category=ToolCategory.SCORING, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True}, |
| "hardware": {"type": "string", "description": "Hardware profile", "required": False} |
| }, |
| returns="Hardware fitness score (higher is better)" |
| ) |
| def calculate_hardware_fitness(qasm: str, hardware: str = "ibm_eagle") -> Dict: |
| response = _get_client().calculate_hardware_fitness(qasm, hardware) |
| return {"success": response.success, "score": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="calculate_expressibility", |
| description="Calculate circuit expressibility (ability to explore state space)", |
| category=ToolCategory.SCORING, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Expressibility score" |
| ) |
| def calculate_expressibility(qasm: str) -> Dict: |
| response = _get_client().calculate_expressibility(qasm) |
| return {"success": response.success, "score": response.data, "error": response.error} |
|
|
|
|
| |
|
|
| @register_tool( |
| name="estimate_resources", |
| description="Estimate resource requirements (qubits, gates, depth)", |
| category=ToolCategory.RESOURCE, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Resource estimation breakdown" |
| ) |
| def estimate_resources(qasm: str) -> Dict: |
| response = _get_client().estimate_resources(qasm) |
| return {"success": response.success, "resources": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="estimate_noise", |
| description="Estimate noise impact on circuit execution", |
| category=ToolCategory.RESOURCE, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True}, |
| "hardware": {"type": "string", "description": "Hardware profile", "required": False} |
| }, |
| returns="Noise estimation" |
| ) |
| def estimate_noise(qasm: str, hardware: str = "ibm_eagle") -> Dict: |
| response = _get_client().estimate_noise(qasm, hardware) |
| return {"success": response.success, "noise": response.data, "error": response.error} |
|
|
|
|
| |
|
|
| @register_tool( |
| name="compose_circuits", |
| description="Compose two circuits sequentially", |
| category=ToolCategory.COMPOSITION, |
| parameters={ |
| "qasm1": {"type": "string", "description": "First circuit QASM", "required": True}, |
| "qasm2": {"type": "string", "description": "Second circuit QASM", "required": True}, |
| "qubit_mapping": {"type": "string", "description": "Qubit mapping (e.g., '0:1,1:0')", "required": False} |
| }, |
| returns="Composed circuit QASM" |
| ) |
| def compose_circuits(qasm1: str, qasm2: str, qubit_mapping: str = "") -> Dict: |
| response = _get_client().compose_circuits(qasm1, qasm2, qubit_mapping) |
| return {"success": response.success, "qasm": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="generate_inverse", |
| description="Generate the inverse (adjoint) of a circuit", |
| category=ToolCategory.COMPOSITION, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True} |
| }, |
| returns="Inverse circuit QASM" |
| ) |
| def generate_inverse(qasm: str) -> Dict: |
| response = _get_client().generate_inverse_circuit(qasm) |
| return {"success": response.success, "qasm": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="tensor_circuits", |
| description="Create tensor product of two circuits (parallel composition)", |
| category=ToolCategory.COMPOSITION, |
| parameters={ |
| "qasm1": {"type": "string", "description": "First circuit QASM", "required": True}, |
| "qasm2": {"type": "string", "description": "Second circuit QASM", "required": True} |
| }, |
| returns="Tensored circuit QASM" |
| ) |
| def tensor_circuits(qasm1: str, qasm2: str) -> Dict: |
| response = _get_client().tensor_circuits(qasm1, qasm2) |
| return {"success": response.success, "qasm": response.data, "error": response.error} |
|
|
|
|
| @register_tool( |
| name="repeat_circuit", |
| description="Repeat a circuit n times", |
| category=ToolCategory.COMPOSITION, |
| parameters={ |
| "qasm": {"type": "string", "description": "OpenQASM code", "required": True}, |
| "n": {"type": "integer", "description": "Number of repetitions", "required": True} |
| }, |
| returns="Repeated circuit QASM" |
| ) |
| def repeat_circuit(qasm: str, n: int) -> Dict: |
| response = _get_client().repeat_circuit(qasm, n) |
| return {"success": response.success, "qasm": response.data, "error": response.error} |
|
|
|
|
| |
|
|
| def get_all_tools(): |
| """Get all registered tools.""" |
| return registry.get_all() |
|
|
| def get_tools_by_category(category: ToolCategory): |
| """Get tools by category.""" |
| return registry.get_by_category(category) |
|
|
| def invoke_tool(name: str, **kwargs): |
| """Invoke a tool by name.""" |
| return registry.invoke(name, **kwargs) |
|
|