use axum::http::request::Parts;
use rmcp::ErrorData;
use rmcp::handler::server::common::Extension;
use rmcp::handler::server::wrapper::Parameters;
use rmcp::model::CallToolResult;
use rmcp::tool;
use rmcp::tool_router;
use schemars::JsonSchema;
use serde::Deserialize;
use yorishiro_core::models::import;
use yorishiro_core::services::auth::ApiKeyScope;
use super::{YorishiroMcpServer, authorized, mcp_try, ok_json};
#[derive(Debug, Deserialize, JsonSchema)]
pub struct ImportJsonlArgs {
pub jsonl: String,
}
#[tool_router(vis = "pub(crate)", router = tool_router_import)]
impl YorishiroMcpServer {
#[tool(
description = "Bulk-import schemas/entities/relations from a JSON Lines document in the \
export format (requires schema scope, since importing schemas is itself \
a schema-scope-only operation). Runs as a single transaction: either \
every record in `jsonl` is applied, or the first error rolls back \
everything imported so far."
)]
pub async fn import_jsonl(
&self,
Parameters(args): Parameters<ImportJsonlArgs>,
Extension(parts): Extension<Parts>,
) -> Result<CallToolResult, ErrorData> {
let mut authorized = authorized!(&self.state, &parts, ApiKeyScope::Schema);
let tenant_id = authorized.ctx.tenant_id;
let workspace_id = authorized.ctx.workspace_id;
let result = mcp_try!(
import::import_jsonl(
authorized.conn(),
tenant_id,
workspace_id,
args.jsonl.as_bytes()
)
.await
);
ok_json(result)
}
}
#[cfg(test)]
#[path = "../../../tests/http/mcp/import.rs"]
mod tests;