// Phase 2B: Deep MCP Tool Schema Discovery // Discover new DNS/networking capabilities via MCP tools/list const CUMIN_TOKEN = "cumin_GjynCIFJtyoZ_73wasCoWNYf7Y-Pk0jMffHEdRzblBg"; const PROJECT_ID = "178bfad9-5edc-409f-833c-6fffca7aed5a"; const API = "https://api.cumin.dev"; const fs = require("fs"); let SESSION_ID = null; async function mcpRequest(method, params, id) { const body = { jsonrpc: "2.0", method, id }; if (params) body.params = params; const headers = { Authorization: `Bearer ${CUMIN_TOKEN}`, "Content-Type": "application/json", Accept: "application/json, text/event-stream" }; if (SESSION_ID) headers["Mcp-Session-Id"] = SESSION_ID; const res = await fetch(`${API}/mcp`, { method: "POST", headers, body: JSON.stringify(body) }); const sid = res.headers.get("Mcp-Session-Id"); if (sid) SESSION_ID = sid; const data = await res.json(); if (data.error) throw new Error(`MCP: ${JSON.stringify(data.error)}`); return data.result; } async function callTool(name, args) { const r = await mcpRequest("tools/call", { name, arguments: args }, Date.now()); const text = r.content?.map(c => c.text || "").join("") || JSON.stringify(r); return text; } async function main() { console.log("=== DEEP MCP DISCOVERY ===\n"); // Initialize await mcpRequest("initialize", { protocolVersion: "2024-11-05", capabilities: {}, clientInfo: { name: "ghaymah-deep-recon", version: "1.0" } }, 1); console.log("✅ MCP Connected\n"); // 1. Get full tool schemas (look for DNS/networking/tag related) const toolsList = await mcpRequest("tools/list", {}, 2); const tools = toolsList.tools || []; const networkTools = tools.filter(t => t.name.includes("constellation") || t.name.includes("network") || t.name.includes("dns") || t.name.includes("policy") || t.name.includes("tag") || t.name.includes("app") || t.name.includes("exec") || t.name.includes("update") ); console.log(`📋 Total tools: ${tools.length}`); console.log(`🔍 Network/DNS/App related tools: ${networkTools.length}\n`); for (const t of networkTools) { console.log(`--- ${t.name} ---`); console.log(`Description: ${t.description || "N/A"}`); console.log(`Schema: ${JSON.stringify(t.inputSchema?.properties || {}, null, 2).substring(0, 800)}`); console.log(); } // 2. Check existing constellation details console.log("\n=== CONSTELLATION DETAILS ==="); const constellations = await callTool("list_constellations", { project_id: PROJECT_ID }); console.log("Constellations:", constellations); // 3. Check existing apps for tags console.log("\n=== APP DETAILS (with tags) ==="); const apps = await callTool("list_apps", { project_id: PROJECT_ID }); const appsList = JSON.parse(apps); for (const app of appsList) { console.log(`\nApp: ${app.name} (${app.id})`); console.log(` Status: ${app.status}`); console.log(` Tags: ${JSON.stringify(app.tags)}`); console.log(` Ports: ${JSON.stringify(app.ports)}`); console.log(` Env vars: ${app.env?.map(e => e.name).join(", ")}`); console.log(` Image: ${app.image}`); if (app.dns) console.log(` DNS: ${JSON.stringify(app.dns)}`); if (app.network) console.log(` Network: ${JSON.stringify(app.network)}`); if (app.internal_dns) console.log(` Internal DNS: ${JSON.stringify(app.internal_dns)}`); if (app.mesh) console.log(` Mesh: ${JSON.stringify(app.mesh)}`); // Print ALL app keys console.log(` ALL KEYS: ${Object.keys(app).join(", ")}`); } // 4. List projects to understand scope console.log("\n=== PROJECTS ==="); const projects = await callTool("list_projects", {}); console.log(projects); // 5. Get app logs to see networking info console.log("\n=== APP LOGS (gateway, last 20 lines) ==="); try { const logs = await callTool("app_logs", { project_id: PROJECT_ID, id: appsList[0].id }); console.log(logs.substring(0, 2000)); } catch (e) { console.log("Logs error:", e.message); } // 6. Exec in backend to check DNS config console.log("\n=== DNS CONFIG IN BACKEND CONTAINER ==="); try { const resolv = await callTool("exec_in_app", { project_id: PROJECT_ID, id: appsList.find(a => a.name === "soc-backend").id, command: ["cat", "/etc/resolv.conf"] }); console.log("resolv.conf:", resolv); } catch (e) { console.log("Exec error:", e.message); } // 7. Check hosts file try { const hosts = await callTool("exec_in_app", { project_id: PROJECT_ID, id: appsList.find(a => a.name === "soc-backend").id, command: ["cat", "/etc/hosts"] }); console.log("\nhosts:", hosts); } catch (e) { console.log("Hosts error:", e.message); } // 8. Try DNS resolution of sibling app try { const nslookup = await callTool("exec_in_app", { project_id: PROJECT_ID, id: appsList.find(a => a.name === "soc-backend").id, command: ["nslookup", "soc-gateway"] }); console.log("\nnslookup soc-gateway:", nslookup); } catch (e) { console.log("nslookup error:", e.message); } // 9. Try various DNS name patterns const dnsPatterns = [ "soc-gateway", "soc-gateway.local", "soc-gateway.mesh", "soc-gateway.soc-private-net", "soc-gateway.project.mesh", "soc-gateway.cumin.internal" ]; console.log("\n=== DNS RESOLUTION TESTS ==="); for (const name of dnsPatterns) { try { const result = await callTool("exec_in_app", { project_id: PROJECT_ID, id: appsList.find(a => a.name === "soc-backend").id, command: ["getent", "hosts", name] }); console.log(`${name} → ${result}`); } catch (e) { console.log(`${name} → ERROR: ${e.message}`); } } console.log("\n=== DEEP DISCOVERY COMPLETE ==="); } main().catch(e => { console.error("FATAL:", e.message); process.exit(1); });