@@ -38,11 +38,19 @@ use qdrant_client::qdrant::{ScoredPoint, PointStruct};
38
38
// Import BoxFuture for mock impl signature
39
39
use futures:: future:: BoxFuture ;
40
40
41
+ use std:: time:: Duration ;
42
+ use std:: thread:: sleep;
43
+
41
44
const PREBUILT_INDEX_URL : & str = "https://github.com/metacontract/mc-mcp/releases/latest/download/prebuilt_index.jsonl.gz" ;
42
45
const PREBUILT_INDEX_DEST : & str = "artifacts/prebuilt_index.jsonl.gz" ;
43
46
44
47
#[ tokio:: main]
45
48
async fn main ( ) -> Result < ( ) > {
49
+ // Qdrant起動確認(Docker経由)
50
+ if let Err ( e) = ensure_qdrant_via_docker ( ) {
51
+ eprintln ! ( "{e}" ) ;
52
+ std:: process:: exit ( 1 ) ;
53
+ }
46
54
env_logger:: Builder :: from_env ( env_logger:: Env :: default ( ) . default_filter_or ( "info" ) ) . init ( ) ;
47
55
log:: info!( "mc-mcp server (MCP over stdio) started." ) ;
48
56
@@ -475,3 +483,48 @@ mod tests {
475
483
} ;
476
484
}
477
485
}
486
+
487
+ fn ensure_qdrant_via_docker ( ) -> Result < ( ) , String > {
488
+ // 1. Check if Docker is installed
489
+ let docker_check = std:: process:: Command :: new ( "docker" ) . arg ( "--version" ) . output ( ) ;
490
+ if docker_check. is_err ( ) {
491
+ return Err ( "Docker is not installed" . to_string ( ) ) ;
492
+ }
493
+
494
+ // 2. Check if Qdrant container is already running
495
+ let ps = std:: process:: Command :: new ( "docker" )
496
+ . args ( [ "ps" , "--filter" , "name=qdrant" , "--format" , "{{.Names}}" ] )
497
+ . output ( )
498
+ . map_err ( |e| format ! ( "Failed to execute docker ps: {e}" ) ) ?;
499
+ let ps_stdout = String :: from_utf8_lossy ( & ps. stdout ) ;
500
+ if ps_stdout. contains ( "qdrant" ) {
501
+ println ! ( "✅ Qdrant is already running in Docker." ) ;
502
+ } else {
503
+ // 3. Start Qdrant container
504
+ println ! ( "Qdrant container not found. Starting Qdrant in Docker..." ) ;
505
+ let run = std:: process:: Command :: new ( "docker" )
506
+ . args ( [ "run" , "-d" , "--name" , "qdrant" , "-p" , "6333:6333" , "-p" , "6334:6334" , "qdrant/qdrant" ] )
507
+ . output ( )
508
+ . map_err ( |e| format ! ( "Failed to execute docker run: {e}" ) ) ?;
509
+ if !run. status . success ( ) {
510
+ return Err ( format ! ( "Failed to start Qdrant container: {}" , String :: from_utf8_lossy( & run. stderr) ) ) ;
511
+ }
512
+ println ! ( "Qdrant container started." ) ;
513
+ }
514
+
515
+ // 4. Health check (HTTP endpoint retry)
516
+ let endpoint = "http://localhost:6333/collections" ;
517
+ for i in 1 ..=5 {
518
+ match ureq:: get ( endpoint) . timeout ( std:: time:: Duration :: from_millis ( 1000 ) ) . call ( ) {
519
+ Ok ( resp) if resp. status ( ) == 200 => {
520
+ println ! ( "✅ Qdrant is running and connected!" ) ;
521
+ return Ok ( ( ) ) ;
522
+ }
523
+ _ => {
524
+ println ! ( "Waiting for Qdrant to start... (Retry {i}/5)" ) ;
525
+ sleep ( Duration :: from_secs ( 2 ) ) ;
526
+ }
527
+ }
528
+ }
529
+ Err ( "Failed to connect to Qdrant. Check Docker and network settings." . to_string ( ) )
530
+ }
0 commit comments