Skip to content

Commit 9d67772

Browse files
authored
Respect required_providers config for all providers (#573)
- Add conditional initialization for Databricks and GoogleSheets based on required_providers - Extract inject_engine_guide helper to avoid duplication - Fix ENGINE_GUIDE injection for scaffold_data_app early return - Use match instead of if for consistency
1 parent 144fd0a commit 9d67772

File tree

2 files changed

+38
-23
lines changed

2 files changed

+38
-23
lines changed

edda/edda_mcp/src/main.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use clap::{Parser, Subcommand};
22
use edda_mcp::paths;
33
use edda_mcp::providers::{
44
CombinedProvider, DatabricksProvider, DeploymentProvider, GoogleSheetsProvider, IOProvider,
5-
WorkspaceTools,
5+
ProviderType, WorkspaceTools,
66
};
77
use edda_mcp::session::SessionContext;
88
use edda_mcp::trajectory::TrajectoryTrackingProvider;
@@ -220,6 +220,11 @@ async fn warmup_sandbox() -> Result<()> {
220220
Ok(())
221221
}
222222

223+
/// helper to check if provider should be enabled based on config
224+
fn should_enable_provider(config: &edda_mcp::config::Config, provider: ProviderType) -> bool {
225+
config.required_providers.contains(&provider)
226+
}
227+
223228
/// check environment configuration and prerequisites
224229
async fn check_environment(config: &edda_mcp::config::Config) -> Result<()> {
225230
use edda_mcp::providers::ProviderType;
@@ -397,22 +402,26 @@ async fn run_server(config: edda_mcp::config::Config) -> Result<()> {
397402
});
398403

399404
// initialize all available providers
400-
let databricks = DatabricksProvider::new().ok();
401-
let deployment = if config.with_deployment {
402-
DeploymentProvider::new().ok()
403-
} else {
404-
None
405+
let databricks = match should_enable_provider(&config, ProviderType::Databricks) {
406+
true => DatabricksProvider::new().ok(),
407+
false => None,
408+
};
409+
let deployment = match config.with_deployment {
410+
true => DeploymentProvider::new().ok(),
411+
false => None,
412+
};
413+
let google_sheets = match should_enable_provider(&config, ProviderType::GoogleSheets) {
414+
true => GoogleSheetsProvider::new().await.ok(),
415+
false => None,
405416
};
406-
let google_sheets = GoogleSheetsProvider::new().await.ok();
407417
let io = IOProvider::new(config.io_config.clone()).ok();
408418

409419
// create session context (session_id populated earlier)
410420
let session_ctx = SessionContext::new(session_id.clone());
411421

412-
let workspace = if config.with_workspace_tools {
413-
WorkspaceTools::new(session_ctx.clone()).ok()
414-
} else {
415-
None
422+
let workspace = match config.with_workspace_tools {
423+
true => WorkspaceTools::new(session_ctx.clone()).ok(),
424+
false => None,
416425
};
417426

418427
// print startup banner to stderr (won't interfere with stdio MCP transport)

edda/edda_mcp/src/providers/mod.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::session::SessionContext;
1414
use eyre::Result;
1515
use rmcp::model::{
1616
CallToolRequestParam, CallToolResult, Implementation, PaginatedRequestParam, ProtocolVersion,
17-
ServerCapabilities, ServerInfo,
17+
RawContent, ServerCapabilities, ServerInfo,
1818
};
1919
use rmcp::service::{RequestContext, RoleServer};
2020
use rmcp::{ErrorData, ServerHandler};
@@ -38,6 +38,17 @@ enum TargetProvider {
3838
Workspace(Arc<WorkspaceTools>),
3939
}
4040

41+
/// inject ENGINE_GUIDE into the first text content of a tool result
42+
fn inject_engine_guide(result: &mut CallToolResult) {
43+
use crate::engine_guide::ENGINE_GUIDE;
44+
45+
if let Some(first_content) = result.content.first_mut() {
46+
if let RawContent::Text(text_content) = &mut first_content.raw {
47+
text_content.text = format!("{}\n\n---\n\n{}", ENGINE_GUIDE, text_content.text);
48+
}
49+
}
50+
}
51+
4152
#[derive(Clone)]
4253
pub struct CombinedProvider {
4354
session_ctx: SessionContext,
@@ -302,7 +313,7 @@ impl ServerHandler for CombinedProvider {
302313
// intercept scaffold_data_app to set work_dir in session context
303314
if params.name == "scaffold_data_app" {
304315
if let Some(ref io) = self.io {
305-
let result = io.call_tool(params.clone(), context.clone()).await?;
316+
let mut result = io.call_tool(params.clone(), context.clone()).await?;
306317

307318
// extract work_dir from arguments and set it in session context
308319
if let Some(args) = params.arguments {
@@ -319,6 +330,10 @@ impl ServerHandler for CombinedProvider {
319330
}
320331
}
321332

333+
if is_first_call {
334+
inject_engine_guide(&mut result);
335+
}
336+
322337
return Ok(result);
323338
}
324339
}
@@ -331,17 +346,8 @@ impl ServerHandler for CombinedProvider {
331346
TargetProvider::Workspace(provider) => provider.call_tool(params, context).await,
332347
}?;
333348

334-
// inject engine guide on first tool call
335349
if is_first_call {
336-
use crate::engine_guide::ENGINE_GUIDE;
337-
use rmcp::model::RawContent;
338-
339-
// prepend engine guide to the first content item
340-
if let Some(first_content) = result.content.first_mut() {
341-
if let RawContent::Text(text_content) = &mut first_content.raw {
342-
text_content.text = format!("{}\n\n---\n\n{}", ENGINE_GUIDE, text_content.text);
343-
}
344-
}
350+
inject_engine_guide(&mut result);
345351
}
346352

347353
Ok(result)

0 commit comments

Comments
 (0)