diff --git a/src/gateway/http.rs b/src/gateway/http.rs index 65d330b..c26d6e2 100644 --- a/src/gateway/http.rs +++ b/src/gateway/http.rs @@ -820,6 +820,30 @@ pub async fn get_status(State(state): State>) -> Result>) -> Result, ApiError> { + let metrics = crate::observability::metrics::global_metrics(); + let registry = state.session_manager.tools(); + let mut entries = registry.iter(); + entries.sort_by(|(a, _), (b, _)| a.cmp(b)); + let tools: Vec = entries + .into_iter() + .map(|(name, tool)| { + let source = if name.contains("__") { "mcp" } else { "builtin" }; + json!({ + "name": name, + "description": tool.description(), + "parameters_schema": tool.parameters_schema(), + "source": source, + "read_only": tool.read_only(), + "exclusive": tool.exclusive(), + "concurrency_safe": tool.concurrency_safe(), + "call_count": metrics.tool_call_count(&name), + }) + }) + .collect(); + Ok(Json(json!({ "tools": tools }))) +} + pub async fn get_tasks( State(state): State>, Query(query): Query, diff --git a/src/gateway/mod.rs b/src/gateway/mod.rs index 152543b..9153051 100644 --- a/src/gateway/mod.rs +++ b/src/gateway/mod.rs @@ -594,6 +594,7 @@ fn build_router(state: Arc) -> Router { .route("/api/logs", routing::get(http::get_logs)) .route("/api/tasks", routing::get(http::get_tasks)) .route("/api/status", routing::get(http::get_status)) + .route("/api/tools", routing::get(http::get_tools)) .route("/api/jobs", routing::get(http::get_jobs)) .route("/api/jobs/{id}/runs", routing::get(http::get_job_runs)) .route("/api/memories", routing::get(http::get_memories))