quantumflow-sdk 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- api/__init__.py +1 -0
- api/auth.py +208 -0
- api/main.py +403 -0
- api/models.py +137 -0
- api/routes/__init__.py +1 -0
- api/routes/auth_routes.py +234 -0
- api/routes/teleport_routes.py +415 -0
- db/__init__.py +15 -0
- db/crud.py +319 -0
- db/database.py +93 -0
- db/models.py +197 -0
- quantumflow/__init__.py +47 -0
- quantumflow/algorithms/__init__.py +48 -0
- quantumflow/algorithms/compression/__init__.py +7 -0
- quantumflow/algorithms/compression/amplitude_amplification.py +189 -0
- quantumflow/algorithms/compression/qft_compression.py +133 -0
- quantumflow/algorithms/compression/token_compression.py +261 -0
- quantumflow/algorithms/cryptography/__init__.py +6 -0
- quantumflow/algorithms/cryptography/qkd.py +205 -0
- quantumflow/algorithms/cryptography/qrng.py +231 -0
- quantumflow/algorithms/machine_learning/__init__.py +7 -0
- quantumflow/algorithms/machine_learning/qnn.py +276 -0
- quantumflow/algorithms/machine_learning/qsvm.py +249 -0
- quantumflow/algorithms/machine_learning/vqe.py +229 -0
- quantumflow/algorithms/optimization/__init__.py +7 -0
- quantumflow/algorithms/optimization/grover.py +223 -0
- quantumflow/algorithms/optimization/qaoa.py +251 -0
- quantumflow/algorithms/optimization/quantum_annealing.py +237 -0
- quantumflow/algorithms/utility/__init__.py +6 -0
- quantumflow/algorithms/utility/circuit_optimizer.py +194 -0
- quantumflow/algorithms/utility/error_correction.py +330 -0
- quantumflow/api/__init__.py +1 -0
- quantumflow/api/routes/__init__.py +4 -0
- quantumflow/api/routes/billing_routes.py +520 -0
- quantumflow/backends/__init__.py +33 -0
- quantumflow/backends/base_backend.py +184 -0
- quantumflow/backends/braket_backend.py +345 -0
- quantumflow/backends/ibm_backend.py +112 -0
- quantumflow/backends/simulator_backend.py +86 -0
- quantumflow/billing/__init__.py +25 -0
- quantumflow/billing/models.py +126 -0
- quantumflow/billing/stripe_service.py +619 -0
- quantumflow/core/__init__.py +12 -0
- quantumflow/core/entanglement.py +164 -0
- quantumflow/core/memory.py +147 -0
- quantumflow/core/quantum_backprop.py +394 -0
- quantumflow/core/quantum_compressor.py +309 -0
- quantumflow/core/teleportation.py +386 -0
- quantumflow/integrations/__init__.py +107 -0
- quantumflow/integrations/autogen_tools.py +501 -0
- quantumflow/integrations/crewai_agents.py +425 -0
- quantumflow/integrations/crewai_tools.py +407 -0
- quantumflow/integrations/langchain_memory.py +385 -0
- quantumflow/integrations/langchain_tools.py +366 -0
- quantumflow/integrations/mcp_server.py +575 -0
- quantumflow_sdk-0.1.0.dist-info/METADATA +190 -0
- quantumflow_sdk-0.1.0.dist-info/RECORD +60 -0
- quantumflow_sdk-0.1.0.dist-info/WHEEL +5 -0
- quantumflow_sdk-0.1.0.dist-info/entry_points.txt +2 -0
- quantumflow_sdk-0.1.0.dist-info/top_level.txt +3 -0
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MCP (Model Context Protocol) Server for QuantumFlow.
|
|
3
|
+
|
|
4
|
+
Exposes quantum tools via MCP for use with Claude and other MCP clients.
|
|
5
|
+
|
|
6
|
+
Features:
|
|
7
|
+
- Quantum compression tool
|
|
8
|
+
- Quantum gradient computation
|
|
9
|
+
- Quantum memory operations
|
|
10
|
+
- Quantum search (Grover's)
|
|
11
|
+
- Quantum optimization (QAOA)
|
|
12
|
+
|
|
13
|
+
Requirements:
|
|
14
|
+
pip install mcp
|
|
15
|
+
|
|
16
|
+
Run:
|
|
17
|
+
python -m quantumflow.integrations.mcp_server
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import asyncio
|
|
21
|
+
import json
|
|
22
|
+
import math
|
|
23
|
+
from typing import Any, Dict, List, Optional
|
|
24
|
+
import numpy as np
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
from mcp.server import Server
|
|
28
|
+
from mcp.server.stdio import stdio_server
|
|
29
|
+
from mcp.types import (
|
|
30
|
+
Tool,
|
|
31
|
+
TextContent,
|
|
32
|
+
Resource,
|
|
33
|
+
ResourceTemplate,
|
|
34
|
+
)
|
|
35
|
+
MCP_AVAILABLE = True
|
|
36
|
+
except ImportError:
|
|
37
|
+
MCP_AVAILABLE = False
|
|
38
|
+
|
|
39
|
+
from quantumflow.core.quantum_compressor import QuantumCompressor
|
|
40
|
+
from quantumflow.core.quantum_backprop import QuantumBackprop
|
|
41
|
+
from quantumflow.core.memory import QuantumMemory
|
|
42
|
+
from quantumflow.core.entanglement import Entangler
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _check_mcp():
|
|
46
|
+
"""Check if MCP is available."""
|
|
47
|
+
if not MCP_AVAILABLE:
|
|
48
|
+
raise ImportError(
|
|
49
|
+
"MCP is not installed. "
|
|
50
|
+
"Install it with: pip install mcp"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class QuantumMCPServer:
|
|
55
|
+
"""
|
|
56
|
+
MCP Server exposing QuantumFlow tools.
|
|
57
|
+
|
|
58
|
+
Provides quantum-enhanced tools for AI assistants via MCP protocol.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
def __init__(self, backend: str = "simulator"):
|
|
62
|
+
"""
|
|
63
|
+
Initialize QuantumFlow MCP server.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
backend: Quantum backend ("simulator" or "ibm")
|
|
67
|
+
"""
|
|
68
|
+
_check_mcp()
|
|
69
|
+
|
|
70
|
+
self.backend = backend
|
|
71
|
+
self.server = Server("quantumflow")
|
|
72
|
+
|
|
73
|
+
# Initialize quantum components
|
|
74
|
+
self._compressor = QuantumCompressor(backend=backend)
|
|
75
|
+
self._backprop = QuantumBackprop(backend=backend)
|
|
76
|
+
self._memory = QuantumMemory(backend=backend)
|
|
77
|
+
self._entangler = Entangler(backend=backend)
|
|
78
|
+
|
|
79
|
+
# Register handlers
|
|
80
|
+
self._register_tools()
|
|
81
|
+
self._register_resources()
|
|
82
|
+
|
|
83
|
+
def _register_tools(self):
|
|
84
|
+
"""Register quantum tools with MCP server."""
|
|
85
|
+
|
|
86
|
+
@self.server.list_tools()
|
|
87
|
+
async def list_tools() -> List[Tool]:
|
|
88
|
+
"""List all available quantum tools."""
|
|
89
|
+
return [
|
|
90
|
+
Tool(
|
|
91
|
+
name="quantum_compress",
|
|
92
|
+
description=(
|
|
93
|
+
"Compress text using quantum amplitude encoding. "
|
|
94
|
+
"Achieves up to 53% token reduction while preserving information."
|
|
95
|
+
),
|
|
96
|
+
inputSchema={
|
|
97
|
+
"type": "object",
|
|
98
|
+
"properties": {
|
|
99
|
+
"text": {
|
|
100
|
+
"type": "string",
|
|
101
|
+
"description": "Text to compress",
|
|
102
|
+
},
|
|
103
|
+
"compression_level": {
|
|
104
|
+
"type": "integer",
|
|
105
|
+
"description": "Compression level (1-3)",
|
|
106
|
+
"default": 1,
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
"required": ["text"],
|
|
110
|
+
},
|
|
111
|
+
),
|
|
112
|
+
Tool(
|
|
113
|
+
name="quantum_gradient",
|
|
114
|
+
description=(
|
|
115
|
+
"Compute gradients using quantum teleportation protocol. "
|
|
116
|
+
"Achieves 97.78% similarity with classical gradients."
|
|
117
|
+
),
|
|
118
|
+
inputSchema={
|
|
119
|
+
"type": "object",
|
|
120
|
+
"properties": {
|
|
121
|
+
"input_values": {
|
|
122
|
+
"type": "array",
|
|
123
|
+
"items": {"type": "number"},
|
|
124
|
+
"description": "Input state values",
|
|
125
|
+
},
|
|
126
|
+
"target_values": {
|
|
127
|
+
"type": "array",
|
|
128
|
+
"items": {"type": "number"},
|
|
129
|
+
"description": "Target state values",
|
|
130
|
+
},
|
|
131
|
+
"weights": {
|
|
132
|
+
"type": "array",
|
|
133
|
+
"items": {"type": "number"},
|
|
134
|
+
"description": "Current weight values",
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
"required": ["input_values", "target_values", "weights"],
|
|
138
|
+
},
|
|
139
|
+
),
|
|
140
|
+
Tool(
|
|
141
|
+
name="quantum_memory_store",
|
|
142
|
+
description=(
|
|
143
|
+
"Store data in quantum memory with O(log n) complexity. "
|
|
144
|
+
"Provides exponential memory savings."
|
|
145
|
+
),
|
|
146
|
+
inputSchema={
|
|
147
|
+
"type": "object",
|
|
148
|
+
"properties": {
|
|
149
|
+
"key": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"description": "Memory key",
|
|
152
|
+
},
|
|
153
|
+
"values": {
|
|
154
|
+
"type": "array",
|
|
155
|
+
"items": {"type": "number"},
|
|
156
|
+
"description": "Values to store",
|
|
157
|
+
},
|
|
158
|
+
"compress": {
|
|
159
|
+
"type": "boolean",
|
|
160
|
+
"description": "Whether to compress",
|
|
161
|
+
"default": True,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
"required": ["key", "values"],
|
|
165
|
+
},
|
|
166
|
+
),
|
|
167
|
+
Tool(
|
|
168
|
+
name="quantum_memory_retrieve",
|
|
169
|
+
description="Retrieve data from quantum memory.",
|
|
170
|
+
inputSchema={
|
|
171
|
+
"type": "object",
|
|
172
|
+
"properties": {
|
|
173
|
+
"key": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"description": "Memory key to retrieve",
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
"required": ["key"],
|
|
179
|
+
},
|
|
180
|
+
),
|
|
181
|
+
Tool(
|
|
182
|
+
name="quantum_search",
|
|
183
|
+
description=(
|
|
184
|
+
"Search database using Grover's quantum algorithm. "
|
|
185
|
+
"Provides quadratic speedup: O(sqrt(N)) vs O(N)."
|
|
186
|
+
),
|
|
187
|
+
inputSchema={
|
|
188
|
+
"type": "object",
|
|
189
|
+
"properties": {
|
|
190
|
+
"query": {
|
|
191
|
+
"type": "string",
|
|
192
|
+
"description": "Search query",
|
|
193
|
+
},
|
|
194
|
+
"database": {
|
|
195
|
+
"type": "array",
|
|
196
|
+
"items": {"type": "string"},
|
|
197
|
+
"description": "List of items to search",
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
"required": ["query", "database"],
|
|
201
|
+
},
|
|
202
|
+
),
|
|
203
|
+
Tool(
|
|
204
|
+
name="quantum_optimize",
|
|
205
|
+
description=(
|
|
206
|
+
"Solve optimization problems using QAOA quantum algorithm. "
|
|
207
|
+
"Supports MaxCut and portfolio optimization."
|
|
208
|
+
),
|
|
209
|
+
inputSchema={
|
|
210
|
+
"type": "object",
|
|
211
|
+
"properties": {
|
|
212
|
+
"problem_type": {
|
|
213
|
+
"type": "string",
|
|
214
|
+
"enum": ["maxcut", "portfolio"],
|
|
215
|
+
"description": "Type of optimization problem",
|
|
216
|
+
},
|
|
217
|
+
"edges": {
|
|
218
|
+
"type": "array",
|
|
219
|
+
"items": {
|
|
220
|
+
"type": "array",
|
|
221
|
+
"items": {"type": "integer"},
|
|
222
|
+
},
|
|
223
|
+
"description": "Graph edges for MaxCut",
|
|
224
|
+
},
|
|
225
|
+
"n_nodes": {
|
|
226
|
+
"type": "integer",
|
|
227
|
+
"description": "Number of nodes for MaxCut",
|
|
228
|
+
},
|
|
229
|
+
"returns": {
|
|
230
|
+
"type": "array",
|
|
231
|
+
"items": {"type": "number"},
|
|
232
|
+
"description": "Asset returns for portfolio",
|
|
233
|
+
},
|
|
234
|
+
"risk_factor": {
|
|
235
|
+
"type": "number",
|
|
236
|
+
"description": "Risk factor for portfolio",
|
|
237
|
+
"default": 0.5,
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
"required": ["problem_type"],
|
|
241
|
+
},
|
|
242
|
+
),
|
|
243
|
+
Tool(
|
|
244
|
+
name="quantum_entangle",
|
|
245
|
+
description=(
|
|
246
|
+
"Create quantum entanglement between contexts. "
|
|
247
|
+
"Creates Bell pairs (2 contexts) or GHZ states (3+ contexts)."
|
|
248
|
+
),
|
|
249
|
+
inputSchema={
|
|
250
|
+
"type": "object",
|
|
251
|
+
"properties": {
|
|
252
|
+
"contexts": {
|
|
253
|
+
"type": "array",
|
|
254
|
+
"items": {"type": "string"},
|
|
255
|
+
"description": "List of contexts to entangle",
|
|
256
|
+
"minItems": 2,
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
"required": ["contexts"],
|
|
260
|
+
},
|
|
261
|
+
),
|
|
262
|
+
]
|
|
263
|
+
|
|
264
|
+
@self.server.call_tool()
|
|
265
|
+
async def call_tool(name: str, arguments: Dict[str, Any]) -> List[TextContent]:
|
|
266
|
+
"""Execute a quantum tool."""
|
|
267
|
+
try:
|
|
268
|
+
if name == "quantum_compress":
|
|
269
|
+
result = self._compress(
|
|
270
|
+
arguments["text"],
|
|
271
|
+
arguments.get("compression_level", 1),
|
|
272
|
+
)
|
|
273
|
+
elif name == "quantum_gradient":
|
|
274
|
+
result = self._gradient(
|
|
275
|
+
arguments["input_values"],
|
|
276
|
+
arguments["target_values"],
|
|
277
|
+
arguments["weights"],
|
|
278
|
+
)
|
|
279
|
+
elif name == "quantum_memory_store":
|
|
280
|
+
result = self._memory_store(
|
|
281
|
+
arguments["key"],
|
|
282
|
+
arguments["values"],
|
|
283
|
+
arguments.get("compress", True),
|
|
284
|
+
)
|
|
285
|
+
elif name == "quantum_memory_retrieve":
|
|
286
|
+
result = self._memory_retrieve(arguments["key"])
|
|
287
|
+
elif name == "quantum_search":
|
|
288
|
+
result = self._search(
|
|
289
|
+
arguments["query"],
|
|
290
|
+
arguments["database"],
|
|
291
|
+
)
|
|
292
|
+
elif name == "quantum_optimize":
|
|
293
|
+
result = self._optimize(
|
|
294
|
+
arguments["problem_type"],
|
|
295
|
+
arguments,
|
|
296
|
+
)
|
|
297
|
+
elif name == "quantum_entangle":
|
|
298
|
+
result = self._entangle(arguments["contexts"])
|
|
299
|
+
else:
|
|
300
|
+
result = {"error": f"Unknown tool: {name}"}
|
|
301
|
+
|
|
302
|
+
return [TextContent(type="text", text=json.dumps(result, indent=2))]
|
|
303
|
+
|
|
304
|
+
except Exception as e:
|
|
305
|
+
return [TextContent(type="text", text=json.dumps({"error": str(e)}))]
|
|
306
|
+
|
|
307
|
+
def _register_resources(self):
|
|
308
|
+
"""Register quantum resources with MCP server."""
|
|
309
|
+
|
|
310
|
+
@self.server.list_resources()
|
|
311
|
+
async def list_resources() -> List[Resource]:
|
|
312
|
+
"""List available quantum resources."""
|
|
313
|
+
return [
|
|
314
|
+
Resource(
|
|
315
|
+
uri="quantum://memory/stats",
|
|
316
|
+
name="Quantum Memory Statistics",
|
|
317
|
+
description="Current quantum memory usage and compression stats",
|
|
318
|
+
mimeType="application/json",
|
|
319
|
+
),
|
|
320
|
+
Resource(
|
|
321
|
+
uri="quantum://backends",
|
|
322
|
+
name="Quantum Backends",
|
|
323
|
+
description="Available quantum computing backends",
|
|
324
|
+
mimeType="application/json",
|
|
325
|
+
),
|
|
326
|
+
]
|
|
327
|
+
|
|
328
|
+
@self.server.read_resource()
|
|
329
|
+
async def read_resource(uri: str) -> str:
|
|
330
|
+
"""Read a quantum resource."""
|
|
331
|
+
if uri == "quantum://memory/stats":
|
|
332
|
+
stats = self._memory.get_stats()
|
|
333
|
+
return json.dumps({
|
|
334
|
+
"total_items": stats.total_items,
|
|
335
|
+
"classical_size": stats.classical_size,
|
|
336
|
+
"quantum_size": stats.quantum_size,
|
|
337
|
+
"compression_ratio": stats.compression_ratio,
|
|
338
|
+
"memory_saved_percent": stats.memory_saved_percent,
|
|
339
|
+
})
|
|
340
|
+
elif uri == "quantum://backends":
|
|
341
|
+
return json.dumps({
|
|
342
|
+
"current": self.backend,
|
|
343
|
+
"available": ["simulator", "ibm"],
|
|
344
|
+
"simulator": {"status": "online", "max_qubits": 30},
|
|
345
|
+
"ibm": {"status": "available", "max_qubits": 156},
|
|
346
|
+
})
|
|
347
|
+
else:
|
|
348
|
+
return json.dumps({"error": f"Unknown resource: {uri}"})
|
|
349
|
+
|
|
350
|
+
# ============== Tool Implementations ==============
|
|
351
|
+
|
|
352
|
+
def _compress(self, text: str, compression_level: int) -> Dict:
|
|
353
|
+
"""Compress text using quantum encoding."""
|
|
354
|
+
words = text.split()
|
|
355
|
+
if len(words) < 2:
|
|
356
|
+
return {"error": f"Text too short ({len(words)} words)"}
|
|
357
|
+
|
|
358
|
+
tokens = [hash(w) % 10000 for w in words]
|
|
359
|
+
result = self._compressor.compress(tokens, compression_level)
|
|
360
|
+
|
|
361
|
+
return {
|
|
362
|
+
"input_tokens": result.input_token_count,
|
|
363
|
+
"output_qubits": result.n_qubits,
|
|
364
|
+
"tokens_saved": result.tokens_saved,
|
|
365
|
+
"compression_ratio": round(result.compression_ratio, 2),
|
|
366
|
+
"reduction_percent": round(result.compression_percentage, 1),
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
def _gradient(
|
|
370
|
+
self,
|
|
371
|
+
input_values: List[float],
|
|
372
|
+
target_values: List[float],
|
|
373
|
+
weights: List[float],
|
|
374
|
+
) -> Dict:
|
|
375
|
+
"""Compute quantum gradients."""
|
|
376
|
+
result = self._backprop.compute_gradient(
|
|
377
|
+
input_state=np.array(input_values),
|
|
378
|
+
target_state=np.array(target_values),
|
|
379
|
+
weights=np.array(weights),
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
return {
|
|
383
|
+
"gradients": result.gradients.tolist(),
|
|
384
|
+
"direction": result.gradient_direction,
|
|
385
|
+
"magnitude": round(result.gradient_magnitude, 4),
|
|
386
|
+
"classical_similarity": round(abs(result.similarity), 4),
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
def _memory_store(self, key: str, values: List[float], compress: bool) -> Dict:
|
|
390
|
+
"""Store in quantum memory."""
|
|
391
|
+
slot = self._memory.store(key, values, compress=compress)
|
|
392
|
+
|
|
393
|
+
return {
|
|
394
|
+
"key": key,
|
|
395
|
+
"stored_count": len(values),
|
|
396
|
+
"qubits_used": slot.compressed.n_qubits if slot.compressed else None,
|
|
397
|
+
"compression_ratio": round(slot.compressed.compression_ratio, 2) if slot.compressed else None,
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
def _memory_retrieve(self, key: str) -> Dict:
|
|
401
|
+
"""Retrieve from quantum memory."""
|
|
402
|
+
try:
|
|
403
|
+
values = self._memory.retrieve(key)
|
|
404
|
+
return {
|
|
405
|
+
"key": key,
|
|
406
|
+
"values": values[:10] if len(values) > 10 else values,
|
|
407
|
+
"total_values": len(values),
|
|
408
|
+
}
|
|
409
|
+
except KeyError:
|
|
410
|
+
return {"error": f"Key '{key}' not found"}
|
|
411
|
+
|
|
412
|
+
def _search(self, query: str, database: List[str]) -> Dict:
|
|
413
|
+
"""Quantum search using Grover's algorithm."""
|
|
414
|
+
from quantumflow.algorithms.optimization import GroverSearch
|
|
415
|
+
|
|
416
|
+
query_lower = query.lower()
|
|
417
|
+
marked_indices = [
|
|
418
|
+
i for i, item in enumerate(database)
|
|
419
|
+
if query_lower in str(item).lower()
|
|
420
|
+
]
|
|
421
|
+
|
|
422
|
+
if not marked_indices:
|
|
423
|
+
return {"query": query, "matches": [], "message": "No matches found"}
|
|
424
|
+
|
|
425
|
+
n_qubits = max(2, math.ceil(math.log2(len(database))))
|
|
426
|
+
grover = GroverSearch(backend=self.backend)
|
|
427
|
+
result = grover.search(n_qubits=n_qubits, marked_states=marked_indices)
|
|
428
|
+
|
|
429
|
+
matches = [database[i] for i in marked_indices]
|
|
430
|
+
|
|
431
|
+
return {
|
|
432
|
+
"query": query,
|
|
433
|
+
"matches": matches[:5],
|
|
434
|
+
"total_matches": len(matches),
|
|
435
|
+
"quantum_iterations": result.iterations,
|
|
436
|
+
"success_probability": round(result.probability, 4),
|
|
437
|
+
"speedup": f"{len(database) / max(1, result.iterations):.1f}x",
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
def _optimize(self, problem_type: str, args: Dict) -> Dict:
|
|
441
|
+
"""Quantum optimization with QAOA."""
|
|
442
|
+
from quantumflow.algorithms.optimization import QAOA
|
|
443
|
+
|
|
444
|
+
qaoa = QAOA(backend=self.backend, p=1)
|
|
445
|
+
|
|
446
|
+
if problem_type == "maxcut":
|
|
447
|
+
edges = args.get("edges", [(0, 1), (1, 2), (2, 0)])
|
|
448
|
+
edges = [tuple(e) if isinstance(e, list) else e for e in edges]
|
|
449
|
+
n_nodes = args.get("n_nodes", 3)
|
|
450
|
+
|
|
451
|
+
result = qaoa.maxcut(edges, n_nodes, max_iterations=20)
|
|
452
|
+
|
|
453
|
+
return {
|
|
454
|
+
"problem": "maxcut",
|
|
455
|
+
"solution": result.best_solution,
|
|
456
|
+
"cost": round(result.best_cost, 2),
|
|
457
|
+
"iterations": result.n_iterations,
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
elif problem_type == "portfolio":
|
|
461
|
+
returns = np.array(args.get("returns", [0.1, 0.05, 0.15]))
|
|
462
|
+
risk_factor = args.get("risk_factor", 0.5)
|
|
463
|
+
n = len(returns)
|
|
464
|
+
|
|
465
|
+
# Simple QUBO formulation
|
|
466
|
+
Q = np.diag(-returns + risk_factor * np.ones(n) * 0.1)
|
|
467
|
+
result = qaoa.optimize_qubo(Q, max_iterations=20)
|
|
468
|
+
|
|
469
|
+
return {
|
|
470
|
+
"problem": "portfolio",
|
|
471
|
+
"allocation": result.best_solution,
|
|
472
|
+
"cost": round(result.best_cost, 4),
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
return {"error": f"Unknown problem type: {problem_type}"}
|
|
476
|
+
|
|
477
|
+
def _entangle(self, contexts: List[str]) -> Dict:
|
|
478
|
+
"""Create quantum entanglement."""
|
|
479
|
+
if len(contexts) < 2:
|
|
480
|
+
return {"error": "Need at least 2 contexts"}
|
|
481
|
+
|
|
482
|
+
# Convert string contexts to numeric representations
|
|
483
|
+
numeric_contexts = []
|
|
484
|
+
for ctx in contexts:
|
|
485
|
+
# Convert string to list of character codes normalized
|
|
486
|
+
values = [ord(c) / 255.0 for c in ctx[:10]] # Use first 10 chars
|
|
487
|
+
if len(values) < 2:
|
|
488
|
+
values = values + [0.5] * (2 - len(values))
|
|
489
|
+
numeric_contexts.append(values)
|
|
490
|
+
|
|
491
|
+
if len(contexts) == 2:
|
|
492
|
+
state = self._entangler.entangle_contexts(
|
|
493
|
+
numeric_contexts[0],
|
|
494
|
+
numeric_contexts[1],
|
|
495
|
+
)
|
|
496
|
+
else:
|
|
497
|
+
state = self._entangler.create_ghz_state(len(contexts))
|
|
498
|
+
|
|
499
|
+
return {
|
|
500
|
+
"n_qubits": state.n_qubits,
|
|
501
|
+
"n_parties": state.n_parties,
|
|
502
|
+
"entropy": round(state.entropy, 4),
|
|
503
|
+
"maximally_entangled": state.is_maximally_entangled,
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
async def run(self):
|
|
507
|
+
"""Run the MCP server."""
|
|
508
|
+
async with stdio_server() as (read_stream, write_stream):
|
|
509
|
+
await self.server.run(
|
|
510
|
+
read_stream,
|
|
511
|
+
write_stream,
|
|
512
|
+
self.server.create_initialization_options(),
|
|
513
|
+
)
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
# ============== Standalone Functions ==============
|
|
517
|
+
|
|
518
|
+
def create_mcp_server(backend: str = "simulator") -> QuantumMCPServer:
|
|
519
|
+
"""
|
|
520
|
+
Create a QuantumFlow MCP server.
|
|
521
|
+
|
|
522
|
+
Args:
|
|
523
|
+
backend: Quantum backend to use
|
|
524
|
+
|
|
525
|
+
Returns:
|
|
526
|
+
Configured MCP server
|
|
527
|
+
|
|
528
|
+
Example:
|
|
529
|
+
server = create_mcp_server()
|
|
530
|
+
asyncio.run(server.run())
|
|
531
|
+
"""
|
|
532
|
+
return QuantumMCPServer(backend=backend)
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
def get_mcp_config() -> Dict:
|
|
536
|
+
"""
|
|
537
|
+
Get MCP configuration for Claude Desktop.
|
|
538
|
+
|
|
539
|
+
Returns:
|
|
540
|
+
Configuration dict for claude_desktop_config.json
|
|
541
|
+
|
|
542
|
+
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
|
|
543
|
+
{
|
|
544
|
+
"mcpServers": {
|
|
545
|
+
"quantumflow": {
|
|
546
|
+
"command": "python",
|
|
547
|
+
"args": ["-m", "quantumflow.integrations.mcp_server"]
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
"""
|
|
552
|
+
return {
|
|
553
|
+
"mcpServers": {
|
|
554
|
+
"quantumflow": {
|
|
555
|
+
"command": "python",
|
|
556
|
+
"args": ["-m", "quantumflow.integrations.mcp_server"],
|
|
557
|
+
"env": {
|
|
558
|
+
"PYTHONPATH": "src",
|
|
559
|
+
},
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
# ============== Main Entry Point ==============
|
|
566
|
+
|
|
567
|
+
async def main():
|
|
568
|
+
"""Main entry point for MCP server."""
|
|
569
|
+
server = QuantumMCPServer(backend="simulator")
|
|
570
|
+
await server.run()
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
if __name__ == "__main__":
|
|
574
|
+
_check_mcp()
|
|
575
|
+
asyncio.run(main())
|