use terraphim_config::{ConfigBuilder, Haystack, Role, ServiceType};
use terraphim_middleware::indexer::search_haystacks;
use terraphim_types::{RelevanceFunction, SearchQuery};
#[tokio::test]
#[ignore]
async fn mcp_live_haystack_smoke() {
dotenvy::dotenv().ok();
let base_url = match std::env::var("MCP_SERVER_URL") {
Ok(v) if !v.trim().is_empty() => v,
_ => {
eprintln!("MCP_SERVER_URL not set; skipping live MCP test");
return;
}
};
let role = Role {
shortname: Some("MCP".to_string()),
name: "MCP".into(),
relevance_function: RelevanceFunction::TitleScorer,
terraphim_it: false,
theme: "lumen".to_string(),
kg: None,
haystacks: vec![Haystack::new(base_url.clone(), ServiceType::Mcp, true)
.with_extra_parameter("base_url".into(), base_url.clone())
.with_extra_parameter("transport".into(), "sse".into())],
llm_enabled: false,
llm_api_key: None,
llm_model: None,
llm_auto_summarize: false,
llm_chat_enabled: false,
llm_chat_system_prompt: None,
llm_chat_model: None,
llm_context_window: None,
llm_router_enabled: false,
llm_router_config: None,
extra: ahash::AHashMap::new(),
};
let mut config = ConfigBuilder::new()
.add_role("MCP", role)
.default_role("MCP")
.unwrap()
.build()
.unwrap();
let config_state = terraphim_config::ConfigState::new(&mut config)
.await
.expect("config state");
let query = SearchQuery {
search_term: "work".into(),
skip: Some(0),
limit: Some(10),
role: Some("MCP".into()),
operator: None,
search_terms: None,
layer: Default::default(),
include_pinned: false,
};
let result = search_haystacks(config_state, query)
.await
.expect("search ok");
if !result.is_empty() {
assert!(
result.values().next().is_some(),
"expect at least one document"
);
}
}