kagi-mcp 1.0.2

MCP stdio server for kagi-sdk
Documentation
use kagi_sdk::session_web::models::{SearchResponse, SummarizeResponse};

use crate::schema::{SearchResultCard, SearchToolOutput, SummarizeToolOutput};

pub fn normalize_search(response: SearchResponse, limit: usize) -> SearchToolOutput {
    let mut results = Vec::new();
    for item in response.results {
        if results.len() >= limit {
            break;
        }

        results.push(SearchResultCard {
            title: item.title,
            url: item.url,
            snippet: item.snippet,
        });
    }

    SearchToolOutput {
        total_returned: results.len(),
        results,
    }
}

pub fn normalize_summarize(
    response: SummarizeResponse,
    source_url_hint: Option<&str>,
) -> SummarizeToolOutput {
    let source_url = response
        .metadata
        .get("source_url")
        .and_then(serde_json::Value::as_str)
        .map(ToOwned::to_owned)
        .or_else(|| source_url_hint.map(ToOwned::to_owned));

    SummarizeToolOutput {
        markdown: response.markdown,
        text: response.text,
        source_url,
    }
}