1
- use crate :: db:: McpDBHandler ;
2
- use crate :: db:: model:: McpServers ;
1
+ use crate :: db:: model:: { McpServers , SettingKey , SystemSettings } ;
2
+ use crate :: db:: { McpDBHandler , SystemSettingsDBHandler } ;
3
+ use crate :: event:: Event ;
3
4
use crate :: service:: { AppState , Response } ;
4
5
use axum:: Json ;
5
- use axum:: extract:: State ;
6
- use chrono:: NaiveDateTime ;
6
+ use axum:: extract:: { Query , State } ;
7
7
use http:: StatusCode ;
8
8
use serde:: { Deserialize , Serialize } ;
9
9
use uuid:: Uuid ;
10
10
11
+ #[ derive( Deserialize , Debug ) ]
12
+ pub struct ListAllRequest {
13
+ use_raw_endpoint : Option < bool > ,
14
+ }
15
+
11
16
pub async fn list_all (
12
17
State ( state) : State < AppState > ,
18
+ Query ( params) : Query < ListAllRequest > ,
13
19
) -> Result < Json < Response > , ( StatusCode , String ) > {
14
- let db_client = state. db . clone ( ) ;
15
- let handler = McpDBHandler :: new ( db_client) ;
16
- let servers = handler. list_all ( ) . await . map_err ( |e| {
20
+ let mcp_handler = McpDBHandler :: new ( state. db . clone ( ) ) ;
21
+ let settings_handler = SystemSettingsDBHandler :: new ( state. db . clone ( ) ) ;
22
+
23
+ let self_address = settings_handler
24
+ . get_system_settings ( SettingKey :: SelfAddress )
25
+ . await ;
26
+
27
+ let mut servers = mcp_handler. list_all ( ) . await . map_err ( |e| {
17
28
tracing:: error!( "Failed to list mcp servers {}" , e) ;
18
29
(
19
30
StatusCode :: INTERNAL_SERVER_ERROR ,
20
31
"Failed to list mcp servers" . to_string ( ) ,
21
32
)
22
33
} ) ?;
23
34
35
+ if params. use_raw_endpoint . is_none ( ) || !params. use_raw_endpoint . unwrap ( ) {
36
+ servers. iter_mut ( ) . for_each ( |server| {
37
+ server. endpoint = format ! (
38
+ "{self_address}/proxy/connect/{}/{}" ,
39
+ server. name, server. tag
40
+ ) ;
41
+ } )
42
+ }
43
+
24
44
let data = serde_json:: to_value ( servers) . map_err ( |e| {
25
45
tracing:: error!( "Failed to parse mcp servers {}" , e) ;
26
46
(
@@ -32,7 +52,7 @@ pub async fn list_all(
32
52
Ok ( Json ( Response :: new ( Some ( data) ) ) )
33
53
}
34
54
35
- #[ derive( Deserialize , Serialize , Clone ) ]
55
+ #[ derive( Deserialize , Serialize , Clone ) ]
36
56
pub struct McpRegisterRequest {
37
57
pub name : String ,
38
58
pub tag : String ,
@@ -47,24 +67,38 @@ pub async fn register_mcp_server(
47
67
Json ( server) : Json < McpRegisterRequest > ,
48
68
) -> Result < Json < Response > , ( StatusCode , String ) > {
49
69
let db_client = state. db . clone ( ) ;
50
- let res = McpDBHandler :: new ( db_client) . create_or_update ( & McpServers {
51
- id : Uuid :: new_v4 ( ) ,
52
- name : server. name . clone ( ) ,
53
- tag : server. tag . clone ( ) ,
54
- endpoint : server. endpoint . clone ( ) ,
55
- transport_type : server. transport_type . clone ( ) ,
56
- description : server. description . clone ( ) ,
57
- extra : server. extra . clone ( ) ,
58
- created_at : Default :: default ( ) ,
59
- updated_at : Default :: default ( ) ,
60
- deleted_at : None ,
61
- } ) . await . map_err ( |e| {
62
- tracing:: error!( "Failed to create mcp server {}" , e) ;
63
- (
64
- StatusCode :: INTERNAL_SERVER_ERROR ,
65
- "Failed to create mcp server" . to_string ( ) ,
66
- )
67
- } ) ?;
70
+ let res = McpDBHandler :: new ( db_client)
71
+ . create_or_update ( & McpServers {
72
+ id : Uuid :: new_v4 ( ) ,
73
+ name : server. name . clone ( ) ,
74
+ tag : server. tag . clone ( ) ,
75
+ endpoint : server. endpoint . clone ( ) ,
76
+ transport_type : server. transport_type . clone ( ) ,
77
+ description : server. description . clone ( ) ,
78
+ extra : server. extra . clone ( ) ,
79
+ created_at : Default :: default ( ) ,
80
+ updated_at : Default :: default ( ) ,
81
+ deleted_at : None ,
82
+ } )
83
+ . await
84
+ . map_err ( |e| {
85
+ tracing:: error!( "Failed to create mcp server {}" , e) ;
86
+ (
87
+ StatusCode :: INTERNAL_SERVER_ERROR ,
88
+ "Failed to create mcp server" . to_string ( ) ,
89
+ )
90
+ } ) ?;
91
+
92
+ tokio:: task:: spawn ( async move {
93
+ if let Err ( err) = state. event_sender . send ( Event :: CreateOrUpdate {
94
+ mcp_name : server. name . clone ( ) ,
95
+ tag : server. tag . clone ( ) ,
96
+ endpoint : server. endpoint . clone ( ) ,
97
+ } ) {
98
+ tracing:: error!( "Failed to send event {}" , err) ;
99
+ }
100
+ tracing:: info!( "MCP server {} registered" , server. name) ;
101
+ } ) ;
68
102
69
103
let data = serde_json:: to_value ( res) . map_err ( |e| {
70
104
tracing:: error!( "Failed to parse mcp servers {}" , e) ;
0 commit comments