""" MCP Server Schemas - JSON schemas defining input/output formats for circuits. Ensures the Agent sends valid structured data. """ from typing import Any from pydantic import BaseModel, Field class GateSchema(BaseModel): """Schema for a quantum gate.""" name: str = Field(..., description="Gate name (e.g., 'h', 'cx', 'rx')") qubits: list[int] = Field(..., description="Target qubit indices") params: list[float] = Field(default_factory=list, description="Gate parameters") classical_bits: list[int] = Field(default_factory=list, description="Classical bits for measurement") class CircuitSchema(BaseModel): """Schema for a quantum circuit.""" name: str = Field(default="", description="Circuit name") num_qubits: int = Field(..., ge=1, le=1000, description="Number of qubits") num_classical_bits: int = Field(default=0, ge=0, description="Number of classical bits") gates: list[GateSchema] = Field(default_factory=list, description="List of gates") parameters: list[str] = Field(default_factory=list, description="Parameter names for variational circuits") def to_dict(self) -> dict[str, Any]: """Convert to dictionary format used by plugins.""" return { "name": self.name, "num_qubits": self.num_qubits, "num_classical_bits": self.num_classical_bits, "gates": [g.model_dump() for g in self.gates], "parameters": self.parameters, } class QASMInput(BaseModel): """Schema for QASM input.""" qasm_string: str = Field(..., description="OpenQASM 2.0 or 3.0 code") class HardwareTarget(BaseModel): """Schema for hardware target specification.""" hardware_name: str = Field(..., description="Hardware profile name (e.g., 'ibm_brisbane')") class SimulationRequest(BaseModel): """Schema for simulation request.""" circuit: CircuitSchema shots: int = Field(default=1024, ge=1, le=1000000, description="Number of shots") seed: int | None = Field(default=None, description="Random seed for reproducibility") class ValidationResult(BaseModel): """Schema for validation result.""" valid: bool errors: list[str] = Field(default_factory=list) warnings: list[str] = Field(default_factory=list) summary: str = "" class CreationRequest(BaseModel): """Schema for circuit creation request.""" circuit_type: str = Field(..., description="Type of circuit to create") num_qubits: int = Field(default=2, ge=1, le=100) options: dict[str, Any] = Field(default_factory=dict, description="Additional options") class ScoringResult(BaseModel): """Schema for scoring result.""" score: float = Field(..., ge=0, le=10) grade: str = "" details: dict[str, Any] = Field(default_factory=dict) recommendations: list[str] = Field(default_factory=list) class ValidationResponse(BaseModel): """Schema for validation response.""" valid: bool = Field(..., description="Whether the circuit is valid") checks: dict[str, Any] = Field(default_factory=dict, description="Individual check results") errors: list[str] = Field(default_factory=list, description="List of validation errors") warnings: list[str] = Field(default_factory=list, description="List of warnings") circuit_info: dict[str, Any] = Field(default_factory=dict, description="Circuit metadata") class SimulationResponse(BaseModel): """Schema for simulation response.""" success: bool = Field(..., description="Whether simulation succeeded") num_qubits: int = Field(default=0, description="Number of qubits simulated") statevector: dict[str, Any] | None = Field(default=None, description="Statevector result") counts: dict[str, int] = Field(default_factory=dict, description="Measurement counts") probabilities: dict[str, float] = Field(default_factory=dict, description="State probabilities") noise_estimate: dict[str, Any] | None = Field(default=None, description="Noise estimation") estimated_fidelity: float | None = Field(default=None, description="Estimated fidelity") resources: dict[str, Any] = Field(default_factory=dict, description="Resource estimation") error: str | None = Field(default=None, description="Error message if failed") class ScoreResponse(BaseModel): """Schema for scoring response.""" success: bool = Field(..., description="Whether scoring succeeded") complexity: dict[str, Any] = Field(default_factory=dict, description="Complexity metrics") hardware_fitness: dict[str, Any] | None = Field(default=None, description="Hardware fitness score") estimated_fidelity: float | None = Field(default=None, description="Estimated fidelity") overall_score: float = Field(default=0.0, ge=0.0, le=1.0, description="Overall normalized score") error: str | None = Field(default=None, description="Error message if failed") # MCP Tool definitions for Gradio MCP_TOOLS = { "create_bell_state": { "description": "Create a Bell state (maximally entangled 2-qubit state)", "parameters": { "variant": { "type": "integer", "description": "Bell state variant (0-3): 0=Φ+, 1=Φ-, 2=Ψ+, 3=Ψ-", "default": 0, } }, }, "create_ghz_state": { "description": "Create a GHZ state (multi-qubit entangled state)", "parameters": { "num_qubits": { "type": "integer", "description": "Number of qubits (minimum 3)", "default": 3, } }, }, "create_qft": { "description": "Create a Quantum Fourier Transform circuit", "parameters": { "num_qubits": { "type": "integer", "description": "Number of qubits", "default": 3, } }, }, "create_grover": { "description": "Create Grover's search algorithm circuit", "parameters": { "num_qubits": { "type": "integer", "description": "Number of qubits", "default": 3, }, "iterations": { "type": "integer", "description": "Number of Grover iterations (default: optimal)", "default": None, } }, }, "create_vqe_ansatz": { "description": "Create a VQE variational ansatz for quantum chemistry", "parameters": { "num_qubits": { "type": "integer", "description": "Number of qubits", "default": 4, }, "layers": { "type": "integer", "description": "Number of variational layers", "default": 2, }, "entanglement": { "type": "string", "description": "Entanglement pattern: linear, full, circular", "default": "linear", } }, }, "create_qaoa": { "description": "Create a QAOA circuit for optimization problems", "parameters": { "num_qubits": { "type": "integer", "description": "Number of qubits", "default": 4, }, "p": { "type": "integer", "description": "Number of QAOA layers", "default": 1, } }, }, "validate_circuit": { "description": "Validate circuit syntax and structure", "parameters": { "circuit": { "type": "object", "description": "Circuit data as JSON", } }, }, "validate_connectivity": { "description": "Check if circuit is compatible with hardware topology", "parameters": { "circuit": { "type": "object", "description": "Circuit data as JSON", }, "hardware": { "type": "string", "description": "Hardware name (e.g., ibm_brisbane)", } }, }, "simulate_circuit": { "description": "Simulate circuit and get statevector/probabilities", "parameters": { "circuit": { "type": "object", "description": "Circuit data as JSON", } }, }, "estimate_noise": { "description": "Estimate circuit noise and expected fidelity", "parameters": { "circuit": { "type": "object", "description": "Circuit data as JSON", } }, }, "score_complexity": { "description": "Calculate circuit complexity metrics", "parameters": { "circuit": { "type": "object", "description": "Circuit data as JSON", } }, }, "score_hardware_fitness": { "description": "Score how well circuit fits specific hardware", "parameters": { "circuit": { "type": "object", "description": "Circuit data as JSON", }, "hardware": { "type": "string", "description": "Hardware name", } }, }, "get_available_hardware": { "description": "List available hardware profiles", "parameters": {}, }, }