feat(mcp): add .info mcp-server, .set mcp_tools, and filtered-server listing to the REPL

This commit is contained in:
2026-08-27 15:45:39 -06:00
parent c0224e20cb
commit e7811a6b87
4 changed files with 671 additions and 51 deletions
+18 -3
View File
@@ -55,7 +55,7 @@ pub const DEFAULT_CONTINUATION_PROMPT: &str = indoc! {"
4. Continue with the next pending item now. Call tools immediately."
};
static REPL_COMMANDS: LazyLock<[ReplCommand; 62]> = LazyLock::new(|| {
static REPL_COMMANDS: LazyLock<[ReplCommand; 63]> = LazyLock::new(|| {
[
ReplCommand::new(".help", "Show this help guide", AssertState::pass()),
ReplCommand::new(".info", "Show system info", AssertState::pass()),
@@ -64,6 +64,11 @@ static REPL_COMMANDS: LazyLock<[ReplCommand; 62]> = LazyLock::new(|| {
"Show the list of enabled tools to be passed to the LLM",
AssertState::True(StateFlags::FUNCTION_CALLING),
),
ReplCommand::new(
".info mcp-server",
"Show an MCP server's tool filters and effective catalog",
AssertState::pass(),
),
ReplCommand::new(
".authenticate",
"Authenticate the current model client via OAuth (if configured)",
@@ -639,6 +644,16 @@ pub async fn run_repl_command(
let info = ctx.todo_info()?;
print!("{info}");
}
Some(arg) if arg.starts_with("mcp-server") => {
let mut parts = arg.splitn(2, char::is_whitespace);
parts.next();
let name = parts.next().map(str::trim).unwrap_or("");
if name.is_empty() {
bail!("Usage: .info mcp-server <server>");
}
let info = ctx.mcp_server_info(name).await?;
print!("{info}");
}
Some(_) => unknown_command()?,
None => {
let app = Arc::clone(&ctx.app.config);
@@ -1959,8 +1974,8 @@ mod tests {
}
#[test]
fn repl_commands_has_62_entries() {
assert_eq!(REPL_COMMANDS.len(), 62);
fn repl_commands_has_63_entries() {
assert_eq!(REPL_COMMANDS.len(), 63);
}
#[test]