1
1
use anyhow:: Result ;
2
2
use clap:: Parser ;
3
3
use rmcp:: transport:: sse_server:: SseServer ;
4
- use rmcp:: transport:: streamable_http_server:: axum:: StreamableHttpServer ;
4
+ use rmcp:: transport:: streamable_http_server:: {
5
+ StreamableHttpService , session:: local:: LocalSessionManager ,
6
+ } ;
5
7
use rmcp:: { ServiceExt , transport:: stdio} ;
6
8
use std:: path:: PathBuf ;
7
9
use tracing_subscriber:: { self , EnvFilter } ;
@@ -10,9 +12,6 @@ mod config;
10
12
mod oci;
11
13
mod plugins;
12
14
13
- pub const JSONRPC_VERSION : & str = "2.0" ;
14
- pub const SERVER_NAME : & str = "hyper-mcp" ;
15
- pub const SERVER_VERSION : & str = "0.1.0" ;
16
15
pub const DEFAULT_BIND_ADDRESS : & str = "127.0.0.1:3001" ;
17
16
18
17
#[ derive( Parser , Clone ) ]
@@ -138,7 +137,10 @@ async fn main() -> Result<()> {
138
137
service. waiting ( ) . await ?;
139
138
}
140
139
"sse" => {
141
- tracing:: info!( "Starting SSE server at {}" , cli. bind_address) ;
140
+ tracing:: info!(
141
+ "Starting hyper-mcp with SSE transport at {}" ,
142
+ cli. bind_address
143
+ ) ;
142
144
let ct = SseServer :: serve ( cli. bind_address . parse ( ) ?)
143
145
. await ?
144
146
. with_service ( move || plugin_service. clone ( ) ) ;
@@ -147,13 +149,29 @@ async fn main() -> Result<()> {
147
149
ct. cancel ( ) ;
148
150
}
149
151
"streamable-http" => {
150
- tracing:: info!( "Starting Streamable HTTP server at {}" , cli. bind_address) ;
151
- let ct = StreamableHttpServer :: serve ( cli. bind_address . parse ( ) ?)
152
- . await ?
153
- . with_service ( move || plugin_service. clone ( ) ) ;
154
-
155
- tokio:: signal:: ctrl_c ( ) . await ?;
156
- ct. cancel ( ) ;
152
+ tracing:: info!(
153
+ "Starting hyper-mcp with streamable-http transport at {}" ,
154
+ cli. bind_address
155
+ ) ;
156
+
157
+ let service = StreamableHttpService :: new (
158
+ move || plugin_service. clone ( ) ,
159
+ LocalSessionManager :: default ( ) . into ( ) ,
160
+ Default :: default ( ) ,
161
+ ) ;
162
+
163
+ let router = axum:: Router :: new ( ) . nest_service ( "/mcp" , service) ;
164
+
165
+ let tcp_listener = tokio:: net:: TcpListener :: bind ( cli. bind_address ) . await ?;
166
+ let _ = axum:: serve ( tcp_listener, router)
167
+ . with_graceful_shutdown ( async {
168
+ tokio:: signal:: ctrl_c ( ) . await . unwrap ( ) ;
169
+ tracing:: info!( "Received Ctrl+C, shutting down hyper-mcp server..." ) ;
170
+ // Give the log a moment to flush
171
+ tokio:: time:: sleep ( std:: time:: Duration :: from_millis ( 100 ) ) . await ;
172
+ std:: process:: exit ( 0 ) ;
173
+ } )
174
+ . await ;
157
175
}
158
176
_ => unreachable ! ( ) ,
159
177
}
0 commit comments