Files
codeg/src-tauri/src/web/handlers/mcp.rs

134 lines
3.9 KiB
Rust

use axum::Json;
use serde::Deserialize;
use serde_json::Value;
use crate::app_error::AppCommandError;
use crate::commands::mcp as mcp_commands;
use crate::commands::mcp::{
LocalMcpServer, McpAppType, McpMarketplaceItem, McpMarketplaceProvider,
McpMarketplaceServerDetail,
};
// ---------------------------------------------------------------------------
// Param structs
// ---------------------------------------------------------------------------
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SearchMarketplaceParams {
pub provider_id: String,
pub query: Option<String>,
pub limit: Option<u32>,
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetMarketplaceServerDetailParams {
pub provider_id: String,
pub server_id: String,
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InstallFromMarketplaceParams {
pub provider_id: String,
pub server_id: String,
pub apps: Vec<McpAppType>,
pub spec_override: Option<Value>,
pub option_id: Option<String>,
pub protocol: Option<String>,
pub parameter_values: Option<Value>,
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpsertLocalServerParams {
pub server_id: String,
pub spec: Value,
pub apps: Vec<McpAppType>,
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SetServerAppsParams {
pub server_id: String,
pub apps: Vec<McpAppType>,
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoveServerParams {
pub server_id: String,
pub apps: Option<Vec<McpAppType>>,
}
// ---------------------------------------------------------------------------
// Handlers
// ---------------------------------------------------------------------------
pub async fn mcp_scan_local() -> Result<Json<Vec<LocalMcpServer>>, AppCommandError> {
let result = mcp_commands::mcp_scan_local().await?;
Ok(Json(result))
}
pub async fn mcp_list_marketplaces() -> Result<Json<Vec<McpMarketplaceProvider>>, AppCommandError> {
let result = mcp_commands::mcp_list_marketplaces().await?;
Ok(Json(result))
}
pub async fn mcp_search_marketplace(
Json(params): Json<SearchMarketplaceParams>,
) -> Result<Json<Vec<McpMarketplaceItem>>, AppCommandError> {
let result =
mcp_commands::mcp_search_marketplace(params.provider_id, params.query, params.limit)
.await?;
Ok(Json(result))
}
pub async fn mcp_get_marketplace_server_detail(
Json(params): Json<GetMarketplaceServerDetailParams>,
) -> Result<Json<McpMarketplaceServerDetail>, AppCommandError> {
let result =
mcp_commands::mcp_get_marketplace_server_detail(params.provider_id, params.server_id)
.await?;
Ok(Json(result))
}
pub async fn mcp_install_from_marketplace(
Json(params): Json<InstallFromMarketplaceParams>,
) -> Result<Json<LocalMcpServer>, AppCommandError> {
let result = mcp_commands::mcp_install_from_marketplace(
params.provider_id,
params.server_id,
params.apps,
params.spec_override,
params.option_id,
params.protocol,
params.parameter_values,
)
.await?;
Ok(Json(result))
}
pub async fn mcp_upsert_local_server(
Json(params): Json<UpsertLocalServerParams>,
) -> Result<Json<LocalMcpServer>, AppCommandError> {
let result =
mcp_commands::mcp_upsert_local_server(params.server_id, params.spec, params.apps).await?;
Ok(Json(result))
}
pub async fn mcp_set_server_apps(
Json(params): Json<SetServerAppsParams>,
) -> Result<Json<Option<LocalMcpServer>>, AppCommandError> {
let result = mcp_commands::mcp_set_server_apps(params.server_id, params.apps).await?;
Ok(Json(result))
}
pub async fn mcp_remove_server(
Json(params): Json<RemoveServerParams>,
) -> Result<Json<bool>, AppCommandError> {
let result = mcp_commands::mcp_remove_server(params.server_id, params.apps).await?;
Ok(Json(result))
}