Ctrl K
ComunidadGuías…

scripts/live-codex-mcp-check.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * Feasibility gate for LLM-driven orchestration: prove that `codex exec` can
 * discover, call, and use a stdio MCP tool turn-by-turn. Mirrors the style of
 * live-codex-check.ts. Requires a logged-in Codex CLI; talks to the real model.
 *
 * Run:  npx tsx scripts/live-codex-mcp-check.ts
 * Exits non-zero (and prints why) if codex did not call the ping tool or did
 * not surface the secret it returned.
 */
import { spawn } from "node:child_process";
import { join } from "node:path";

// Neutral value + prompt: earlier wording like "secret token" intermittently
// tripped codex's cybersecurity moderation filter (a prompt artifact, not an
// MCP limitation). Launch via `node` (fast startup) to mirror the real bridge.
const SECRET = "CHORUS-OK-7788";
const pingServer = join(import.meta.dirname, "ping-mcp-server.mjs");

const args = [
  "exec",
  "--json",
  "--dangerously-bypass-approvals-and-sandbox",
  "--skip-git-repo-check",
  "-c",
  `mcp_servers.ping.command="node"`,
  "-c",
  `mcp_servers.ping.args=["${pingServer}"]`,
  "Call the ping tool with no arguments. Then report the exact text value it returns.",
];

console.log(`$ codex ${args.join(" ")}\n`);
const proc = spawn("codex", args, { stdio: ["ignore", "pipe", "pipe"] });

let stdout = "";
proc.stdout.on("data", (d: Buffer) => {
  stdout += d.toString();
});
proc.stderr.on("data", (d: Buffer) => {
  const s = d.toString();
  if (/error|mcp|ping/i.test(s)) process.stderr.write(s);
});

proc.on("close", (code) => {
  const lines = stdout.split("\n").filter(Boolean);
  let calledPing = false;
  let gotSecret = false;
  for (const line of lines) {
    try {
      const ev = JSON.parse(line);
      const item = ev.item ?? ev.msg ?? ev;
      if (item?.type === "mcp_tool_call" && item?.tool === "ping") {
        calledPing = true;
        const text = item?.result?.content?.map((c: { text?: string }) => c.text).join("") ?? "";
        if (text.includes(SECRET)) gotSecret = true;
      }
    } catch {
      // non-JSON line; ignore
    }
  }
  const reportedSecret = stdout.includes(SECRET);

  console.log("\n--- feasibility verdict ---");
  console.log(`codex exit code:           ${code} (non-zero is OK; codex often exits 1 after final output)`);
  console.log(`called ping MCP tool:      ${calledPing}`);
  console.log(`tool returned the secret:  ${gotSecret}`);
  console.log(`secret surfaced in output: ${reportedSecret}`);

  if (calledPing && (gotSecret || reportedSecret)) {
    console.log("\n✅ PASS: codex drives a stdio MCP server turn-by-turn.");
    process.exit(0);
  }
  console.error("\n❌ FAIL: codex did not call the MCP tool / use its result. Reconsider transport or backend.");
  process.exit(1);
});