Skip to content

Commit 7b6a21e

Browse files
committed
feat: register mcp server, update proxy cache and change endpoint for list mcps
1 parent 62c9db0 commit 7b6a21e

File tree

8 files changed

+128
-33
lines changed

8 files changed

+128
-33
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
CREATE TABLE IF NOT EXISTS tb_system_settings
2+
(
3+
setting_name TEXT PRIMARY KEY,
4+
setting_value TEXT NOT NULL
5+
);
6+
7+
COMMENT ON TABLE tb_system_settings IS 'MCP-Center system settings';
8+
9+
COMMENT ON COLUMN tb_system_settings.setting_name IS 'MCP-Center system setting name';
10+
COMMENT ON COLUMN tb_system_settings.setting_value IS 'MCP-Center system setting value';
11+
12+
INSERT INTO tb_system_settings (setting_name, setting_value)
13+
VALUES ('SELF_ADDRESS', 'http://127.0.0.1');

mc-service/src/db/mcp_handler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ impl McpDBHandler {
2727
sqlx::query_as::<_, McpServers>(
2828
r#"
2929
INSERT INTO tb_mcp_servers
30-
(id,name, tag, endpoint, transport_type, description, extra)
31-
VALUES ($1, $2, $3, $4, $5, $6)
30+
(id, name, tag, endpoint, transport_type, description, extra)
31+
VALUES ($1, $2, $3, $4, $5, $6, $7)
3232
RETURNING *
3333
"#,
3434
)

mc-service/src/db/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
pub mod model;
22
mod mcp_handler;
33
mod token_handler;
4+
mod settings_handler;
45

56
pub use mcp_handler::*;
6-
pub use token_handler::*;
7+
pub use settings_handler::*;
78

89
use sqlx::postgres::PgPoolOptions;
910
use std::error::Error;
10-
use std::sync::Arc;
1111
use sqlx::{Pool, Postgres};
1212

1313
#[derive(Clone)]

mc-service/src/db/model/mcp_servers.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
use serde::{Deserialize, Serialize};
22
use sqlx::FromRow;
33
use sqlx::types::chrono::NaiveDateTime;
4-
use std::fmt::Display;
5-
use std::str::FromStr;
64
use uuid::Uuid;
75

86
#[derive(Debug, Serialize, Deserialize, FromRow)]

mc-service/src/db/model/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
mod mcp_servers;
2+
mod system_settings;
23

3-
pub use mcp_servers::*;
4+
pub use mcp_servers::*;
5+
pub use system_settings::*;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
use std::fmt::Display;
2+
use serde::{Deserialize, Serialize};
3+
use sqlx::FromRow;
4+
5+
#[derive(Debug, Serialize, Deserialize, FromRow)]
6+
pub struct SystemSettings {
7+
pub setting_name: String,
8+
pub setting_value: String,
9+
}
10+
11+
pub enum SettingKey {
12+
SelfAddress,
13+
}
14+
15+
impl Display for SettingKey {
16+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17+
write!(f, "{}", match self {
18+
SettingKey::SelfAddress => "SELF_ADDRESS".to_string(),
19+
})
20+
}
21+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use crate::db::DBClient;
2+
use crate::db::model::{SettingKey, SystemSettings};
3+
use std::sync::Arc;
4+
5+
pub struct SystemSettingsDBHandler {
6+
client: Arc<DBClient>,
7+
}
8+
9+
impl SystemSettingsDBHandler {
10+
pub fn new(client: Arc<DBClient>) -> Self {
11+
SystemSettingsDBHandler { client }
12+
}
13+
14+
pub async fn get_system_settings(&self, key: SettingKey) -> String {
15+
if let Ok(settings) = sqlx::query_as::<_, SystemSettings>(
16+
"SELECT * FROM tb_system_settings where setting_name = $1",
17+
)
18+
.bind(key.to_string())
19+
.fetch_one(&self.client.pool)
20+
.await
21+
{
22+
settings.setting_value.trim_end_matches('/').to_string()
23+
} else {
24+
String::from("http://127.0.0.1")
25+
}
26+
}
27+
}

mc-service/src/service/mcp_server.rs

Lines changed: 60 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,46 @@
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;
34
use crate::service::{AppState, Response};
45
use axum::Json;
5-
use axum::extract::State;
6-
use chrono::NaiveDateTime;
6+
use axum::extract::{Query, State};
77
use http::StatusCode;
88
use serde::{Deserialize, Serialize};
99
use uuid::Uuid;
1010

11+
#[derive(Deserialize, Debug)]
12+
pub struct ListAllRequest {
13+
use_raw_endpoint: Option<bool>,
14+
}
15+
1116
pub async fn list_all(
1217
State(state): State<AppState>,
18+
Query(params): Query<ListAllRequest>,
1319
) -> 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| {
1728
tracing::error!("Failed to list mcp servers {}", e);
1829
(
1930
StatusCode::INTERNAL_SERVER_ERROR,
2031
"Failed to list mcp servers".to_string(),
2132
)
2233
})?;
2334

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+
2444
let data = serde_json::to_value(servers).map_err(|e| {
2545
tracing::error!("Failed to parse mcp servers {}", e);
2646
(
@@ -32,7 +52,7 @@ pub async fn list_all(
3252
Ok(Json(Response::new(Some(data))))
3353
}
3454

35-
#[derive(Deserialize,Serialize,Clone)]
55+
#[derive(Deserialize, Serialize, Clone)]
3656
pub struct McpRegisterRequest {
3757
pub name: String,
3858
pub tag: String,
@@ -47,24 +67,38 @@ pub async fn register_mcp_server(
4767
Json(server): Json<McpRegisterRequest>,
4868
) -> Result<Json<Response>, (StatusCode, String)> {
4969
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+
});
68102

69103
let data = serde_json::to_value(res).map_err(|e| {
70104
tracing::error!("Failed to parse mcp servers {}", e);

0 commit comments

Comments
 (0)