kyma-mcp 0.0.1

JSON-RPC 2.0 Model Context Protocol server over Streamable HTTP.
use crate::tools::ToolDispatch;
use kyma_server::agent::SharedToolCtx;
use kyma_server::test_support::seeded_state_empty;

#[tokio::test]
async fn list_returns_all_named_tools() {
    let state = seeded_state_empty().await;
    let pool = sqlx::PgPool::connect(
        &std::env::var("KYMA_TEST_DATABASE_URL").expect("KYMA_TEST_DATABASE_URL"),
    )
    .await
    .unwrap();
    let shared = SharedToolCtx {
        catalog: state.catalog.clone(),
        format: state.format.clone(),
        pool: Some(pool),
    };
    let dispatch = ToolDispatch::new(shared);
    let listed = dispatch.list();
    let names: Vec<_> = listed.iter().map(|t| t["name"].as_str().unwrap()).collect();
    assert_eq!(names.len(), 19);
    for expected in [
        "list_databases", "describe_table", "run_sql", "run_kql",
        "sample_rows", "explore_schema", "find_references_to", "graph_traverse",
        "memory_search", "recall_memory", "save_memory", "list_memories",
        "link_memory_to_entity", "ingest_entity", "update_memory_status",
        "update_memory_importance", "memory_compare", "memory_judge",
        "memory_session_summary",
    ] {
        assert!(names.contains(&expected), "missing tool: {expected}");
    }
}

#[tokio::test]
async fn list_entries_have_inputschema_objects() {
    let state = seeded_state_empty().await;
    let pool = sqlx::PgPool::connect(
        &std::env::var("KYMA_TEST_DATABASE_URL").expect("KYMA_TEST_DATABASE_URL"),
    )
    .await
    .unwrap();
    let shared = SharedToolCtx {
        catalog: state.catalog.clone(),
        format: state.format.clone(),
        pool: Some(pool),
    };
    let dispatch = ToolDispatch::new(shared);
    for tool in dispatch.list() {
        assert!(tool.get("inputSchema").is_some());
        assert!(tool["description"].as_str().unwrap().len() > 10);
    }
}