From 81e8c37f2987b4eb7335abf53aff20ea7c9beef6 Mon Sep 17 00:00:00 2001 From: Auto Date: Wed, 11 Feb 2026 17:09:22 +0200 Subject: [PATCH] feat: expose read-only MCP tools to all agent types, fix settings base URL handling Add feature_get_ready, feature_get_blocked, and feature_get_graph to CODING_AGENT_TOOLS, TESTING_AGENT_TOOLS, and INITIALIZER_AGENT_TOOLS. These read-only tools were available on the MCP server but blocked by the allowed_tools lists, causing "blocked/not allowed" errors when agents tried to query project state. Fix SettingsModal custom base URL input: - Remove fallback to current settings value when saving, so empty input is not silently replaced with the existing URL - Remove .trim() on the input value to prevent cursor jumping while typing - Fix "Change" button pre-fill using empty string instead of space Co-Authored-By: Claude Opus 4.6 --- client.py | 10 +++++++++- ui/src/components/SettingsModal.tsx | 9 ++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/client.py b/client.py index d44ab41..7547121 100644 --- a/client.py +++ b/client.py @@ -141,7 +141,6 @@ def get_extra_read_paths() -> list[Path]: # overhead and preventing agents from calling tools meant for other roles. # # Tools intentionally omitted from ALL agent lists (UI/orchestrator only): -# feature_get_ready, feature_get_blocked, feature_get_graph, # feature_remove_dependency # # The ghost tool "feature_release_testing" was removed entirely -- it was @@ -151,6 +150,9 @@ CODING_AGENT_TOOLS = [ "mcp__features__feature_get_stats", "mcp__features__feature_get_by_id", "mcp__features__feature_get_summary", + "mcp__features__feature_get_ready", + "mcp__features__feature_get_blocked", + "mcp__features__feature_get_graph", "mcp__features__feature_claim_and_get", "mcp__features__feature_mark_in_progress", "mcp__features__feature_mark_passing", @@ -163,12 +165,18 @@ TESTING_AGENT_TOOLS = [ "mcp__features__feature_get_stats", "mcp__features__feature_get_by_id", "mcp__features__feature_get_summary", + "mcp__features__feature_get_ready", + "mcp__features__feature_get_blocked", + "mcp__features__feature_get_graph", "mcp__features__feature_mark_passing", "mcp__features__feature_mark_failing", ] INITIALIZER_AGENT_TOOLS = [ "mcp__features__feature_get_stats", + "mcp__features__feature_get_ready", + "mcp__features__feature_get_blocked", + "mcp__features__feature_get_graph", "mcp__features__feature_create_bulk", "mcp__features__feature_create", "mcp__features__feature_add_dependency", diff --git a/ui/src/components/SettingsModal.tsx b/ui/src/components/SettingsModal.tsx index dbd9ed4..284e6f1 100644 --- a/ui/src/components/SettingsModal.tsx +++ b/ui/src/components/SettingsModal.tsx @@ -83,9 +83,8 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { } const handleSaveCustomBaseUrl = () => { - const effectiveBaseUrl = customBaseUrlInput || settings?.api_base_url || '' - if (effectiveBaseUrl.trim() && !updateSettings.isPending) { - updateSettings.mutate({ api_base_url: effectiveBaseUrl.trim() }) + if (customBaseUrlInput.trim() && !updateSettings.isPending) { + updateSettings.mutate({ api_base_url: customBaseUrlInput.trim() }) setCustomBaseUrlInput('') } } @@ -299,7 +298,7 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { variant="ghost" size="sm" className="h-auto py-0.5 px-2 text-xs shrink-0" - onClick={() => setCustomBaseUrlInput(settings.api_base_url || ' ')} + onClick={() => setCustomBaseUrlInput(settings.api_base_url || '')} > Change @@ -309,7 +308,7 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) {
setCustomBaseUrlInput(e.target.value)} placeholder={currentProvider === 'azure' ? 'https://your-resource.services.ai.azure.com/anthropic' : 'https://api.example.com/v1'} className="flex-1 py-1.5 px-3 text-sm border rounded-md bg-background"