diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 47c938d..9ce169c 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -55,10 +55,8 @@ const App = () => { const [editingTaskId, setEditingTaskId] = useState(null); const [taskRuns, setTaskRuns] = useState({}); - // MCP state - const [mcpServers, setMcpServers] = useState([]); - const [showMcpForm, setShowMcpForm] = useState(false); - const [mcpForm, setMcpForm] = useState({ name: '', server_type: 'sse', url: '', command: '' }); + // Connected tools state (read-only, populated from Claude's system/init) + const [claudeTools, setClaudeTools] = useState(null); // ---- Data fetching ---- const fetchTasks = async () => { @@ -68,10 +66,10 @@ const App = () => { } catch (e) { /* ignore */ } }; - const fetchMcpServers = async () => { + const fetchClaudeTools = async () => { try { - const r = await fetch(`${API}/api/mcp/servers`); - if (r.ok) setMcpServers(await r.json()); + const r = await fetch(`${API}/api/claude/tools`); + if (r.ok) setClaudeTools(await r.json()); } catch (e) { /* ignore */ } }; @@ -95,12 +93,13 @@ const App = () => { useEffect(() => { fetchTasks(); - fetchMcpServers(); + fetchClaudeTools(); fetchChatSessions(); fetchClaudeStatus(); const interval = setInterval(() => { fetchTasks(); fetchClaudeStatus(); + fetchClaudeTools(); }, 8000); return () => clearInterval(interval); }, []); @@ -468,9 +467,9 @@ const App = () => { onClick={() => { setActiveView('tasks'); fetchTasks(); }}> πŸ“‹ Tasks - @@ -758,86 +757,58 @@ const App = () => { )} - {/* ====== MCP VIEW ====== */} - {activeView === 'mcp' && ( + {/* ====== TOOLS VIEW ====== */} + {activeView === 'tools' && (
-

MCP Servers

- +

Connected Tools

+

- Configure MCP servers that Claude can use as tools. These are saved and - passed to Claude via its config. Restart Claude after adding servers. + Tools available in the current Claude session β€” synced automatically from your account. + {claudeTools && ` ${claudeTools.total} tools across ${Object.keys(claudeTools.mcp_servers || {}).length} MCP servers.`}

- {showMcpForm && ( -
-

Add MCP Server

-
-
- - setMcpForm(p => ({ ...p, name: e.target.value }))} - placeholder="my-server" /> -
-
- - -
- {mcpForm.server_type === 'sse' && ( -
- - setMcpForm(p => ({ ...p, url: e.target.value }))} - placeholder="https://mcp.example.com/sse" /> + {!claudeTools || claudeTools.total === 0 ? ( +
+ {claudeTools === null + ? 'Loading tools…' + : 'No tools detected yet. Start Claude and wait for initialization.'} +
+ ) : ( +
+ {/* Built-in tools */} + {claudeTools.builtin_tools?.length > 0 && ( +
+
+
+ Built-in Tools + {claudeTools.builtin_tools.length} tools +
- )} - {mcpForm.server_type === 'stdio' && ( -
- - setMcpForm(p => ({ ...p, command: e.target.value }))} - placeholder="npx -y @my/mcp-server" /> +
{claudeTools.builtin_tools.join(', ')}
+
+ )} + {/* MCP servers */} + {Object.entries(claudeTools.mcp_servers || {}).map(([server, count]) => ( +
+
+
+ {server} + {count} tools + βœ“ connected +
- )} -
-
- - -
+
+ {(claudeTools.raw || []) + .filter(t => t.name?.startsWith(`mcp__${server}__`)) + .map(t => t.name.replace(`mcp__${server}__`, '')) + .join(', ')} +
+
+ ))}
)} - -
- {mcpServers.length === 0 && ( -
No MCP servers configured.
- )} - {mcpServers.map(s => ( -
-
-
- {s.name} - {s.type || 'sse'} -
- -
-
{s.url || s.command || ''}
-
- ))} -
)}