mcp-server-milvus 0.1.1.dev6__py3-none-any.whl → 0.1.1.dev7__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.
Potentially problematic release.
This version of mcp-server-milvus might be problematic. Click here for more details.
- mcp_server_milvus/server.py +149 -95
- {mcp_server_milvus-0.1.1.dev6.dist-info → mcp_server_milvus-0.1.1.dev7.dist-info}/METADATA +1 -1
- {mcp_server_milvus-0.1.1.dev6.dist-info → mcp_server_milvus-0.1.1.dev7.dist-info}/RECORD +5 -5
- {mcp_server_milvus-0.1.1.dev6.dist-info → mcp_server_milvus-0.1.1.dev7.dist-info}/WHEEL +0 -0
- {mcp_server_milvus-0.1.1.dev6.dist-info → mcp_server_milvus-0.1.1.dev7.dist-info}/entry_points.txt +0 -0
mcp_server_milvus/server.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import argparse
|
|
2
|
-
import json
|
|
3
2
|
import os
|
|
4
3
|
from contextlib import asynccontextmanager
|
|
5
4
|
from typing import Any, AsyncIterator, Optional
|
|
@@ -16,8 +15,9 @@ from pymilvus import (
|
|
|
16
15
|
class MilvusConnector:
|
|
17
16
|
def __init__(self, uri: str, token: Optional[str] = None, db_name: Optional[str] = "default"):
|
|
18
17
|
self.uri = uri
|
|
19
|
-
self.token = token
|
|
20
|
-
self.
|
|
18
|
+
self.token = token if token is not None else ""
|
|
19
|
+
self.db_name = db_name if db_name is not None else "default"
|
|
20
|
+
self.client = MilvusClient(uri=uri, token=self.token, db_name=self.db_name)
|
|
21
21
|
|
|
22
22
|
@classmethod
|
|
23
23
|
def from_env(cls) -> "MilvusConnector":
|
|
@@ -43,14 +43,14 @@ class MilvusConnector:
|
|
|
43
43
|
try:
|
|
44
44
|
return self.client.list_collections()
|
|
45
45
|
except Exception as e:
|
|
46
|
-
raise ValueError(f"Failed to list collections: {str(e)}")
|
|
46
|
+
raise ValueError(f"Failed to list collections: {str(e)}") from e
|
|
47
47
|
|
|
48
48
|
async def get_collection_info(self, collection_name: str) -> dict:
|
|
49
49
|
"""Get detailed information about a collection."""
|
|
50
50
|
try:
|
|
51
51
|
return self.client.describe_collection(collection_name)
|
|
52
52
|
except Exception as e:
|
|
53
|
-
raise ValueError(f"Failed to get collection info: {str(e)}")
|
|
53
|
+
raise ValueError(f"Failed to get collection info: {str(e)}") from e
|
|
54
54
|
|
|
55
55
|
async def search_collection(
|
|
56
56
|
self,
|
|
@@ -83,7 +83,7 @@ class MilvusConnector:
|
|
|
83
83
|
)
|
|
84
84
|
return results
|
|
85
85
|
except Exception as e:
|
|
86
|
-
raise ValueError(f"Search failed: {str(e)}")
|
|
86
|
+
raise ValueError(f"Search failed: {str(e)}") from e
|
|
87
87
|
|
|
88
88
|
async def query_collection(
|
|
89
89
|
self,
|
|
@@ -101,7 +101,7 @@ class MilvusConnector:
|
|
|
101
101
|
limit=limit,
|
|
102
102
|
)
|
|
103
103
|
except Exception as e:
|
|
104
|
-
raise ValueError(f"Query failed: {str(e)}")
|
|
104
|
+
raise ValueError(f"Query failed: {str(e)}") from e
|
|
105
105
|
|
|
106
106
|
async def vector_search(
|
|
107
107
|
self,
|
|
@@ -135,11 +135,22 @@ class MilvusConnector:
|
|
|
135
135
|
search_params=search_params,
|
|
136
136
|
limit=limit,
|
|
137
137
|
output_fields=output_fields,
|
|
138
|
-
filter=filter_expr,
|
|
138
|
+
filter=filter_expr if filter_expr is not None else "",
|
|
139
139
|
)
|
|
140
|
-
|
|
140
|
+
# Flatten results if nested
|
|
141
|
+
def flatten(lst):
|
|
142
|
+
flat = []
|
|
143
|
+
for item in lst:
|
|
144
|
+
if isinstance(item, list):
|
|
145
|
+
flat.extend(flatten(item))
|
|
146
|
+
else:
|
|
147
|
+
flat.append(item)
|
|
148
|
+
return flat
|
|
149
|
+
if isinstance(results, list):
|
|
150
|
+
return flatten(results)
|
|
151
|
+
return []
|
|
141
152
|
except Exception as e:
|
|
142
|
-
raise ValueError(f"Vector search failed: {str(e)}")
|
|
153
|
+
raise ValueError(f"Vector search failed: {str(e)}") from e
|
|
143
154
|
|
|
144
155
|
async def hybrid_search(
|
|
145
156
|
self,
|
|
@@ -189,13 +200,15 @@ class MilvusConnector:
|
|
|
189
200
|
ranker=RRFRanker(60),
|
|
190
201
|
limit=limit,
|
|
191
202
|
output_fields=output_fields,
|
|
192
|
-
filter=filter_expr,
|
|
203
|
+
filter=filter_expr if filter_expr is not None else "",
|
|
193
204
|
)
|
|
194
|
-
|
|
195
|
-
|
|
205
|
+
# Flatten results if nested
|
|
206
|
+
if results and isinstance(results[0], list):
|
|
207
|
+
return [item for sublist in results for item in sublist]
|
|
208
|
+
return results if results else []
|
|
196
209
|
|
|
197
210
|
except Exception as e:
|
|
198
|
-
raise ValueError(f"Hybrid search failed: {str(e)}")
|
|
211
|
+
raise ValueError(f"Hybrid search failed: {str(e)}") from e
|
|
199
212
|
|
|
200
213
|
async def create_collection(
|
|
201
214
|
self,
|
|
@@ -239,7 +252,7 @@ class MilvusConnector:
|
|
|
239
252
|
|
|
240
253
|
return True
|
|
241
254
|
except Exception as e:
|
|
242
|
-
raise ValueError(f"Failed to create collection: {str(e)}")
|
|
255
|
+
raise ValueError(f"Failed to create collection: {str(e)}") from e
|
|
243
256
|
|
|
244
257
|
async def insert_data(self, collection_name: str, data: list[dict[str, Any]]) -> dict[str, Any]:
|
|
245
258
|
"""
|
|
@@ -253,7 +266,7 @@ class MilvusConnector:
|
|
|
253
266
|
result = self.client.insert(collection_name=collection_name, data=data)
|
|
254
267
|
return result
|
|
255
268
|
except Exception as e:
|
|
256
|
-
raise ValueError(f"Insert failed: {str(e)}")
|
|
269
|
+
raise ValueError(f"Insert failed: {str(e)}") from e
|
|
257
270
|
|
|
258
271
|
async def delete_entities(self, collection_name: str, filter_expr: str) -> dict[str, Any]:
|
|
259
272
|
"""
|
|
@@ -267,7 +280,7 @@ class MilvusConnector:
|
|
|
267
280
|
result = self.client.delete(collection_name=collection_name, expr=filter_expr)
|
|
268
281
|
return result
|
|
269
282
|
except Exception as e:
|
|
270
|
-
raise ValueError(f"Delete failed: {str(e)}")
|
|
283
|
+
raise ValueError(f"Delete failed: {str(e)}") from e
|
|
271
284
|
|
|
272
285
|
async def get_collection_stats(self, collection_name: str) -> dict[str, Any]:
|
|
273
286
|
"""
|
|
@@ -279,7 +292,7 @@ class MilvusConnector:
|
|
|
279
292
|
try:
|
|
280
293
|
return self.client.get_collection_stats(collection_name)
|
|
281
294
|
except Exception as e:
|
|
282
|
-
raise ValueError(f"Failed to get collection stats: {str(e)}")
|
|
295
|
+
raise ValueError(f"Failed to get collection stats: {str(e)}") from e
|
|
283
296
|
|
|
284
297
|
async def multi_vector_search(
|
|
285
298
|
self,
|
|
@@ -291,7 +304,7 @@ class MilvusConnector:
|
|
|
291
304
|
metric_type: str = "COSINE",
|
|
292
305
|
filter_expr: Optional[str] = None,
|
|
293
306
|
search_params: Optional[dict[str, Any]] = None,
|
|
294
|
-
) -> list[
|
|
307
|
+
) -> list[dict]:
|
|
295
308
|
"""
|
|
296
309
|
Perform vector similarity search with multiple query vectors.
|
|
297
310
|
|
|
@@ -316,11 +329,14 @@ class MilvusConnector:
|
|
|
316
329
|
search_params=search_params,
|
|
317
330
|
limit=limit,
|
|
318
331
|
output_fields=output_fields,
|
|
319
|
-
filter=filter_expr,
|
|
332
|
+
filter=filter_expr if filter_expr is not None else "",
|
|
320
333
|
)
|
|
321
|
-
|
|
334
|
+
# Flatten results if nested
|
|
335
|
+
if results and isinstance(results[0], list):
|
|
336
|
+
return [item for sublist in results for item in sublist]
|
|
337
|
+
return results if results else []
|
|
322
338
|
except Exception as e:
|
|
323
|
-
raise ValueError(f"Multi-vector search failed: {str(e)}")
|
|
339
|
+
raise ValueError(f"Multi-vector search failed: {str(e)}") from e
|
|
324
340
|
|
|
325
341
|
async def create_index(
|
|
326
342
|
self,
|
|
@@ -357,7 +373,7 @@ class MilvusConnector:
|
|
|
357
373
|
)
|
|
358
374
|
return True
|
|
359
375
|
except Exception as e:
|
|
360
|
-
raise ValueError(f"Failed to create index: {str(e)}")
|
|
376
|
+
raise ValueError(f"Failed to create index: {str(e)}") from e
|
|
361
377
|
|
|
362
378
|
async def bulk_insert(
|
|
363
379
|
self, collection_name: str, data: dict[str, list[Any]], batch_size: int = 1000
|
|
@@ -383,7 +399,7 @@ class MilvusConnector:
|
|
|
383
399
|
|
|
384
400
|
return results
|
|
385
401
|
except Exception as e:
|
|
386
|
-
raise ValueError(f"Bulk insert failed: {str(e)}")
|
|
402
|
+
raise ValueError(f"Bulk insert failed: {str(e)}") from e
|
|
387
403
|
|
|
388
404
|
async def load_collection(self, collection_name: str, replica_number: int = 1) -> bool:
|
|
389
405
|
"""
|
|
@@ -399,7 +415,7 @@ class MilvusConnector:
|
|
|
399
415
|
)
|
|
400
416
|
return True
|
|
401
417
|
except Exception as e:
|
|
402
|
-
raise ValueError(f"Failed to load collection: {str(e)}")
|
|
418
|
+
raise ValueError(f"Failed to load collection: {str(e)}") from e
|
|
403
419
|
|
|
404
420
|
async def release_collection(self, collection_name: str) -> bool:
|
|
405
421
|
"""
|
|
@@ -412,19 +428,9 @@ class MilvusConnector:
|
|
|
412
428
|
self.client.release_collection(collection_name=collection_name)
|
|
413
429
|
return True
|
|
414
430
|
except Exception as e:
|
|
415
|
-
raise ValueError(f"Failed to release collection: {str(e)}")
|
|
431
|
+
raise ValueError(f"Failed to release collection: {str(e)}") from e
|
|
416
432
|
|
|
417
|
-
|
|
418
|
-
"""
|
|
419
|
-
Get information about query segments.
|
|
420
|
-
|
|
421
|
-
Args:
|
|
422
|
-
collection_name: Name of collection
|
|
423
|
-
"""
|
|
424
|
-
try:
|
|
425
|
-
return self.client.get_query_segment_info(collection_name)
|
|
426
|
-
except Exception as e:
|
|
427
|
-
raise ValueError(f"Failed to get query segment info: {str(e)}")
|
|
433
|
+
# REMOVED: get_query_segment_info (unknown attribute on MilvusClient)
|
|
428
434
|
|
|
429
435
|
async def upsert_data(self, collection_name: str, data: dict[str, list[Any]]) -> dict[str, Any]:
|
|
430
436
|
"""
|
|
@@ -438,7 +444,7 @@ class MilvusConnector:
|
|
|
438
444
|
result = self.client.upsert(collection_name=collection_name, data=data)
|
|
439
445
|
return result
|
|
440
446
|
except Exception as e:
|
|
441
|
-
raise ValueError(f"Upsert failed: {str(e)}")
|
|
447
|
+
raise ValueError(f"Upsert failed: {str(e)}") from e
|
|
442
448
|
|
|
443
449
|
async def get_index_info(
|
|
444
450
|
self, collection_name: str, field_name: Optional[str] = None
|
|
@@ -452,10 +458,10 @@ class MilvusConnector:
|
|
|
452
458
|
"""
|
|
453
459
|
try:
|
|
454
460
|
return self.client.describe_index(
|
|
455
|
-
collection_name=collection_name, index_name=field_name
|
|
461
|
+
collection_name=collection_name, index_name=field_name if field_name is not None else ""
|
|
456
462
|
)
|
|
457
463
|
except Exception as e:
|
|
458
|
-
raise ValueError(f"Failed to get index info: {str(e)}")
|
|
464
|
+
raise ValueError(f"Failed to get index info: {str(e)}") from e
|
|
459
465
|
|
|
460
466
|
async def get_collection_loading_progress(self, collection_name: str) -> dict[str, Any]:
|
|
461
467
|
"""
|
|
@@ -467,14 +473,14 @@ class MilvusConnector:
|
|
|
467
473
|
try:
|
|
468
474
|
return self.client.get_load_state(collection_name)
|
|
469
475
|
except Exception as e:
|
|
470
|
-
raise ValueError(f"Failed to get loading progress: {str(e)}")
|
|
476
|
+
raise ValueError(f"Failed to get loading progress: {str(e)}") from e
|
|
471
477
|
|
|
472
478
|
async def list_databases(self) -> list[str]:
|
|
473
479
|
"""List all databases in the Milvus instance."""
|
|
474
480
|
try:
|
|
475
481
|
return self.client.list_databases()
|
|
476
482
|
except Exception as e:
|
|
477
|
-
raise ValueError(f"Failed to list databases: {str(e)}")
|
|
483
|
+
raise ValueError(f"Failed to list databases: {str(e)}") from e
|
|
478
484
|
|
|
479
485
|
async def use_database(self, db_name: str) -> bool:
|
|
480
486
|
"""Switch to a different database.
|
|
@@ -484,10 +490,10 @@ class MilvusConnector:
|
|
|
484
490
|
"""
|
|
485
491
|
try:
|
|
486
492
|
# Create a new client with the specified database
|
|
487
|
-
self.client = MilvusClient(uri=self.uri, token=self.token, db_name=db_name)
|
|
493
|
+
self.client = MilvusClient(uri=self.uri, token=self.token if self.token is not None else "", db_name=db_name if db_name is not None else "default")
|
|
488
494
|
return True
|
|
489
495
|
except Exception as e:
|
|
490
|
-
raise ValueError(f"Failed to switch database: {str(e)}")
|
|
496
|
+
raise ValueError(f"Failed to switch database: {str(e)}") from e
|
|
491
497
|
|
|
492
498
|
|
|
493
499
|
class MilvusContext:
|
|
@@ -510,13 +516,13 @@ mcp = FastMCP(name="Milvus", lifespan=server_lifespan)
|
|
|
510
516
|
|
|
511
517
|
@mcp.tool()
|
|
512
518
|
async def milvus_text_search(
|
|
519
|
+
ctx: Context,
|
|
513
520
|
collection_name: str,
|
|
514
521
|
query_text: str,
|
|
515
522
|
limit: int = 5,
|
|
516
523
|
output_fields: Optional[list[str]] = None,
|
|
517
524
|
drop_ratio: float = 0.2,
|
|
518
|
-
|
|
519
|
-
) -> str:
|
|
525
|
+
) -> dict:
|
|
520
526
|
"""
|
|
521
527
|
Search for documents using full text search in a Milvus collection.
|
|
522
528
|
|
|
@@ -536,29 +542,34 @@ async def milvus_text_search(
|
|
|
536
542
|
drop_ratio=drop_ratio,
|
|
537
543
|
)
|
|
538
544
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
545
|
+
return {
|
|
546
|
+
"collection_name": collection_name,
|
|
547
|
+
"query_text": query_text,
|
|
548
|
+
"limit": limit,
|
|
549
|
+
"output_fields": output_fields,
|
|
550
|
+
"drop_ratio": drop_ratio,
|
|
551
|
+
"results": results,
|
|
552
|
+
}
|
|
544
553
|
|
|
545
554
|
|
|
546
555
|
@mcp.tool()
|
|
547
|
-
async def milvus_list_collections(ctx: Context) ->
|
|
556
|
+
async def milvus_list_collections(ctx: Context) -> dict:
|
|
548
557
|
"""List all collections in the database."""
|
|
549
558
|
connector = ctx.request_context.lifespan_context.connector
|
|
550
559
|
collections = await connector.list_collections()
|
|
551
|
-
return
|
|
560
|
+
return {
|
|
561
|
+
"collections": collections
|
|
562
|
+
}
|
|
552
563
|
|
|
553
564
|
|
|
554
565
|
@mcp.tool()
|
|
555
566
|
async def milvus_query(
|
|
567
|
+
ctx: Context,
|
|
556
568
|
collection_name: str,
|
|
557
569
|
filter_expr: str,
|
|
558
570
|
output_fields: Optional[list[str]] = None,
|
|
559
571
|
limit: int = 10,
|
|
560
|
-
|
|
561
|
-
) -> str:
|
|
572
|
+
) -> dict:
|
|
562
573
|
"""
|
|
563
574
|
Query collection using filter expressions.
|
|
564
575
|
|
|
@@ -576,15 +587,18 @@ async def milvus_query(
|
|
|
576
587
|
limit=limit,
|
|
577
588
|
)
|
|
578
589
|
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
590
|
+
return {
|
|
591
|
+
"collection_name": collection_name,
|
|
592
|
+
"filter_expr": filter_expr,
|
|
593
|
+
"output_fields": output_fields,
|
|
594
|
+
"limit": limit,
|
|
595
|
+
"results": results,
|
|
596
|
+
}
|
|
584
597
|
|
|
585
598
|
|
|
586
599
|
@mcp.tool()
|
|
587
600
|
async def milvus_vector_search(
|
|
601
|
+
ctx: Context,
|
|
588
602
|
collection_name: str,
|
|
589
603
|
vector: list[float],
|
|
590
604
|
vector_field: str = "vector",
|
|
@@ -592,8 +606,7 @@ async def milvus_vector_search(
|
|
|
592
606
|
output_fields: Optional[list[str]] = None,
|
|
593
607
|
metric_type: str = "COSINE",
|
|
594
608
|
filter_expr: Optional[str] = None,
|
|
595
|
-
|
|
596
|
-
) -> str:
|
|
609
|
+
) -> dict:
|
|
597
610
|
"""
|
|
598
611
|
Perform vector similarity search on a collection.
|
|
599
612
|
|
|
@@ -617,15 +630,21 @@ async def milvus_vector_search(
|
|
|
617
630
|
filter_expr=filter_expr,
|
|
618
631
|
)
|
|
619
632
|
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
633
|
+
return {
|
|
634
|
+
"collection_name": collection_name,
|
|
635
|
+
"vector": vector,
|
|
636
|
+
"vector_field": vector_field,
|
|
637
|
+
"limit": limit,
|
|
638
|
+
"output_fields": output_fields,
|
|
639
|
+
"metric_type": metric_type,
|
|
640
|
+
"filter_expr": filter_expr,
|
|
641
|
+
"results": results,
|
|
642
|
+
}
|
|
625
643
|
|
|
626
644
|
|
|
627
645
|
@mcp.tool()
|
|
628
646
|
async def milvus_hybrid_search(
|
|
647
|
+
ctx: Context,
|
|
629
648
|
collection_name: str,
|
|
630
649
|
query_text: str,
|
|
631
650
|
text_field: str,
|
|
@@ -634,8 +653,7 @@ async def milvus_hybrid_search(
|
|
|
634
653
|
limit: int = 5,
|
|
635
654
|
output_fields: Optional[list[str]] = None,
|
|
636
655
|
filter_expr: Optional[str] = None,
|
|
637
|
-
|
|
638
|
-
) -> str:
|
|
656
|
+
) -> dict:
|
|
639
657
|
"""
|
|
640
658
|
Perform hybrid search combining text and vector search.
|
|
641
659
|
|
|
@@ -662,20 +680,26 @@ async def milvus_hybrid_search(
|
|
|
662
680
|
filter_expr=filter_expr,
|
|
663
681
|
)
|
|
664
682
|
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
683
|
+
return {
|
|
684
|
+
"collection_name": collection_name,
|
|
685
|
+
"query_text": query_text,
|
|
686
|
+
"text_field": text_field,
|
|
687
|
+
"vector": vector,
|
|
688
|
+
"vector_field": vector_field,
|
|
689
|
+
"limit": limit,
|
|
690
|
+
"output_fields": output_fields,
|
|
691
|
+
"filter_expr": filter_expr,
|
|
692
|
+
"results": results,
|
|
693
|
+
}
|
|
670
694
|
|
|
671
695
|
|
|
672
696
|
@mcp.tool()
|
|
673
697
|
async def milvus_create_collection(
|
|
698
|
+
ctx: Context,
|
|
674
699
|
collection_name: str,
|
|
675
700
|
collection_schema: dict[str, Any],
|
|
676
701
|
index_params: Optional[dict[str, Any]] = None,
|
|
677
|
-
|
|
678
|
-
) -> str:
|
|
702
|
+
) -> dict:
|
|
679
703
|
"""
|
|
680
704
|
Create a new collection with specified schema.
|
|
681
705
|
|
|
@@ -691,13 +715,17 @@ async def milvus_create_collection(
|
|
|
691
715
|
index_params=index_params,
|
|
692
716
|
)
|
|
693
717
|
|
|
694
|
-
return
|
|
718
|
+
return {
|
|
719
|
+
"collection_name": collection_name,
|
|
720
|
+
"success": success,
|
|
721
|
+
"message": f"Collection '{collection_name}' created successfully" if success else f"Failed to create collection '{collection_name}'"
|
|
722
|
+
}
|
|
695
723
|
|
|
696
724
|
|
|
697
725
|
@mcp.tool()
|
|
698
726
|
async def milvus_insert_data(
|
|
699
|
-
collection_name: str, data: list[dict[str, Any]]
|
|
700
|
-
) ->
|
|
727
|
+
ctx: Context, collection_name: str, data: list[dict[str, Any]]
|
|
728
|
+
) -> dict:
|
|
701
729
|
"""
|
|
702
730
|
Insert data into a collection.
|
|
703
731
|
|
|
@@ -708,13 +736,17 @@ async def milvus_insert_data(
|
|
|
708
736
|
connector = ctx.request_context.lifespan_context.connector
|
|
709
737
|
result = await connector.insert_data(collection_name=collection_name, data=data)
|
|
710
738
|
|
|
711
|
-
return
|
|
739
|
+
return {
|
|
740
|
+
"collection_name": collection_name,
|
|
741
|
+
"result": result,
|
|
742
|
+
"message": f"Data inserted into collection '{collection_name}'"
|
|
743
|
+
}
|
|
712
744
|
|
|
713
745
|
|
|
714
746
|
@mcp.tool()
|
|
715
747
|
async def milvus_delete_entities(
|
|
716
|
-
|
|
717
|
-
) ->
|
|
748
|
+
ctx: Context, collection_name: str, filter_expr: str
|
|
749
|
+
) -> dict:
|
|
718
750
|
"""
|
|
719
751
|
Delete entities from a collection based on filter expression.
|
|
720
752
|
|
|
@@ -727,13 +759,18 @@ async def milvus_delete_entities(
|
|
|
727
759
|
collection_name=collection_name, filter_expr=filter_expr
|
|
728
760
|
)
|
|
729
761
|
|
|
730
|
-
return
|
|
762
|
+
return {
|
|
763
|
+
"collection_name": collection_name,
|
|
764
|
+
"filter_expr": filter_expr,
|
|
765
|
+
"result": result,
|
|
766
|
+
"message": f"Entities deleted from collection '{collection_name}'"
|
|
767
|
+
}
|
|
731
768
|
|
|
732
769
|
|
|
733
770
|
@mcp.tool()
|
|
734
771
|
async def milvus_load_collection(
|
|
735
|
-
collection_name: str, replica_number: int = 1
|
|
736
|
-
) ->
|
|
772
|
+
ctx: Context, collection_name: str, replica_number: int = 1
|
|
773
|
+
) -> dict:
|
|
737
774
|
"""
|
|
738
775
|
Load a collection into memory for search and query.
|
|
739
776
|
|
|
@@ -746,11 +783,16 @@ async def milvus_load_collection(
|
|
|
746
783
|
collection_name=collection_name, replica_number=replica_number
|
|
747
784
|
)
|
|
748
785
|
|
|
749
|
-
return
|
|
786
|
+
return {
|
|
787
|
+
"collection_name": collection_name,
|
|
788
|
+
"replica_number": replica_number,
|
|
789
|
+
"success": success,
|
|
790
|
+
"message": f"Collection '{collection_name}' loaded successfully with {replica_number} replica(s)" if success else f"Failed to load collection '{collection_name}'"
|
|
791
|
+
}
|
|
750
792
|
|
|
751
793
|
|
|
752
794
|
@mcp.tool()
|
|
753
|
-
async def milvus_release_collection(
|
|
795
|
+
async def milvus_release_collection(ctx: Context, collection_name: str) -> dict:
|
|
754
796
|
"""
|
|
755
797
|
Release a collection from memory.
|
|
756
798
|
|
|
@@ -760,19 +802,25 @@ async def milvus_release_collection(collection_name: str, ctx: Context = None) -
|
|
|
760
802
|
connector = ctx.request_context.lifespan_context.connector
|
|
761
803
|
success = await connector.release_collection(collection_name=collection_name)
|
|
762
804
|
|
|
763
|
-
return
|
|
805
|
+
return {
|
|
806
|
+
"collection_name": collection_name,
|
|
807
|
+
"success": success,
|
|
808
|
+
"message": f"Collection '{collection_name}' released successfully" if success else f"Failed to release collection '{collection_name}'"
|
|
809
|
+
}
|
|
764
810
|
|
|
765
811
|
|
|
766
812
|
@mcp.tool()
|
|
767
|
-
async def milvus_list_databases(ctx: Context
|
|
813
|
+
async def milvus_list_databases(ctx: Context) -> dict:
|
|
768
814
|
"""List all databases in the Milvus instance."""
|
|
769
815
|
connector = ctx.request_context.lifespan_context.connector
|
|
770
816
|
databases = await connector.list_databases()
|
|
771
|
-
return
|
|
817
|
+
return {
|
|
818
|
+
"databases": databases
|
|
819
|
+
}
|
|
772
820
|
|
|
773
821
|
|
|
774
822
|
@mcp.tool()
|
|
775
|
-
async def milvus_use_database(
|
|
823
|
+
async def milvus_use_database(ctx: Context, db_name: str) -> dict:
|
|
776
824
|
"""
|
|
777
825
|
Switch to a different database.
|
|
778
826
|
|
|
@@ -782,11 +830,15 @@ async def milvus_use_database(db_name: str, ctx: Context = None) -> str:
|
|
|
782
830
|
connector = ctx.request_context.lifespan_context.connector
|
|
783
831
|
success = await connector.use_database(db_name)
|
|
784
832
|
|
|
785
|
-
return
|
|
833
|
+
return {
|
|
834
|
+
"db_name": db_name,
|
|
835
|
+
"success": success,
|
|
836
|
+
"message": f"Switched to database '{db_name}' successfully" if success else f"Failed to switch to database '{db_name}'"
|
|
837
|
+
}
|
|
786
838
|
|
|
787
839
|
|
|
788
840
|
@mcp.tool()
|
|
789
|
-
async def milvus_get_collection_info(
|
|
841
|
+
async def milvus_get_collection_info(ctx: Context, collection_name: str) -> dict:
|
|
790
842
|
"""
|
|
791
843
|
Lists detailed information about a specific collection
|
|
792
844
|
|
|
@@ -795,8 +847,10 @@ async def milvus_get_collection_info(collection_name: str, ctx: Context = None)
|
|
|
795
847
|
"""
|
|
796
848
|
connector = ctx.request_context.lifespan_context.connector
|
|
797
849
|
collection_info = await connector.get_collection_info(collection_name)
|
|
798
|
-
|
|
799
|
-
|
|
850
|
+
return {
|
|
851
|
+
"collection_name": collection_name,
|
|
852
|
+
"info": collection_info
|
|
853
|
+
}
|
|
800
854
|
|
|
801
855
|
def parse_arguments():
|
|
802
856
|
"""Parse command line arguments with environment variable fallbacks.
|
|
@@ -1520,8 +1520,8 @@ mcp_server_milvus/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZ
|
|
|
1520
1520
|
mcp_server_milvus/__init__.py,sha256=D3SNAB4nLWzf8mT79140AZCORuNGivn_qsaczlqfhqQ,182
|
|
1521
1521
|
mcp_server_milvus/blogpost.md,sha256=GwGlzSnWyotasaYjd_fxQ4dP_n9pMSitvVikNTqOmVc,1600
|
|
1522
1522
|
mcp_server_milvus/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1523
|
-
mcp_server_milvus/server.py,sha256=
|
|
1524
|
-
mcp_server_milvus-0.1.1.
|
|
1525
|
-
mcp_server_milvus-0.1.1.
|
|
1526
|
-
mcp_server_milvus-0.1.1.
|
|
1527
|
-
mcp_server_milvus-0.1.1.
|
|
1523
|
+
mcp_server_milvus/server.py,sha256=hh8RhnBjOqJSu5X_wZ-XewSvoTUjezGG3esMr0oJTpE,29755
|
|
1524
|
+
mcp_server_milvus-0.1.1.dev7.dist-info/WHEEL,sha256=Pi5uDq5Fdo_Rr-HD5h9BiPn9Et29Y9Sh8NhcJNnFU1c,79
|
|
1525
|
+
mcp_server_milvus-0.1.1.dev7.dist-info/entry_points.txt,sha256=zBWlHVxTww6CTumm7kNnkm3_mwCj0Af5BCPgUo1AeDY,69
|
|
1526
|
+
mcp_server_milvus-0.1.1.dev7.dist-info/METADATA,sha256=DrPiT2khD6TfUkoeje3-6ZsCeSHfn6bjVrXcZIS3FRA,14641
|
|
1527
|
+
mcp_server_milvus-0.1.1.dev7.dist-info/RECORD,,
|
|
File without changes
|
{mcp_server_milvus-0.1.1.dev6.dist-info → mcp_server_milvus-0.1.1.dev7.dist-info}/entry_points.txt
RENAMED
|
File without changes
|