MCP server returned: smitline · version 0.3.0.
MCP tools returned: start_call, check_call_brief, wait_for_call, get_call, list_calls, save_call_note, list_contacts, send_call_instruction, reply_to_call_request, end_call, transfer_call_to_me, list_voices, get_profile, update_profile. Tool listing does not establish authenticated tool-call success.
The run recorded a missing prerequisite and where it got stuck, so the pass did not exercise the product's real operations.
What the agent did
Run the Smitline container from the README and call its MCP tools (list_voices works; placing a phone call needs an OpenAI key)
cd <guest-path> && pwd && ls -la && git status 2>&1 | head -3; id -u; python3 --version; cat README.md 2>/dev/null | head -200
cd <guest-path> && which docker node npm uv 2>&1; docker --version 2>&1; ls .coldpass; sed -n 1,80p docs/development.md; echo ----; sed -n 1,60p SETUP.md; echo; ls /inputs 2>&1; cat <guest-path> >/dev/null 2>&1 && echo checker-present
sudo -n true && echo SUDO_OK; cat /etc/os-release | head -2; (sudo -n apt-get update -qq 2>&1 | tail -3); sudo -n apt-get install -y -qq docker.io 2>&1 | tail -5; which docker && docker --version
sudo -n systemctl start docker 2>&1; sleep 3; sudo -n docker info 2>&1 | head -15; echo ---; curl -sS -m 20 -o /dev/null -w '%{http_code}\n' https://ghcr.io/v2/ 2>&1; echo env: $HTTPS_PROXY $https_proxy
sudo -n docker run -d --name smitline --restart unless-stopped --network host -v smitline:/data ghcr.io/kaelorlabs/smitline 2>&1 | tail -5; sleep 15; sudo -n docker ps -a --filter name=smitline 2>&1; sudo -n docker logs --tail 30 smitline 2>&1 | tail -30
cd <guest-path> && sed -n 1,120p docs/agents.md; echo ----; curl -fsS -m 10 -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8095/calls; sudo -n docker exec smitline smitline --help 2>&1 | head -40
mkdir -p <guest-path> && cat > <guest-path> <<'EOF'
import json, subprocess, sys
argv = json.loads(sys.argv[1]); tool = sys.argv[2] if len(sys.argv) > 2 else None
args = json.loads(sys.argv[3]) if len(sys.argv) > 3 else {}
p = subprocess.Popen(argv, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
def send(m): p.stdin.write(json.dumps(m)+"\n"); p.stdin.flush()
def recv():
while True:
line = p.stdout.readline()
if not line: raise SystemExit("EOF; stderr=" + p.stderr.read())
msg = json.loads(line)
if "id" in msg: return msg
send({"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"h","version":"1"}}})
print(json.dumps(recv().get("result",{}).get("serverInfo")))
send({"jsonrpc":"2.0","method":"notifications/initialized"})
if tool is None:
send({"jsonrpc":"2.0","id":2,"method":"tools/list"})
for t in recv()["result"]["tools"]: print(t["name"])
else:
send({"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":tool,"arguments":args}})
print(json.dumps(recv(), indent=1)[:3000])
p.stdin.close(); p.wait(timeout=20)
EOF
cd <guest-path> && timeout 120 python3 -I mcpcall.py '["sudo","-n","docker","exec","-i","smitline","smitline","mcp"]' 2>&1 | head -60
cd <guest-path> && timeout 120 python3 -I mcpcall.py '["sudo","-n","docker","exec","-i","smitline","smitline","mcp"]' list_voices '{}' 2>&1 | head -40; echo ====; timeout 120 python3 -I mcpcall.py '["sudo","-n","docker","exec","-i","smitline","smitline","mcp"]' check_call_brief '{"channel":"phone","to":"+14155550142","objective":"Book a table for 4 at 7pm","onBehalfOf":"Sam"}' 2>&1 | head -60
cd <guest-path> && grep -rniE "setInterval|cron|--once|--now|schedule|setTimeout\(.*loop|while \(true\)|for await" --include=*.mjs --include=*.js --include=*.py --include=*.ts --include=*.sh meeting-runtime packages control-panel docker start-*.sh scripts 2>/dev/null | grep -v node_modules | head -30; echo ----; cat package.json; echo; sudo -n docker exec smitline smitline voices 2>&1 | head -5
cd <guest-path> && grep -n "Works with your agent" README.md; grep -n "MCP, a CLI or a REST API" README.md | cut -c1-300; grep -n "Smitline makes the call" README.md | cut -c1-200
cd <guest-path> && mkdir -p .coldpass && cat > .coldpass/probe.json <<'EOF'
{"kind":"mcp","argv":["sudo","-n","docker","exec","-i","smitline","smitline","mcp"],"cwd":"<guest-path>","tool":"list_voices","arguments":{},"expected_text":"marin"}
EOF
cat > .coldpass/claims.json <<'EOF'
[
{"kind":"claim","claim":"Smitline exposes call tools to MCP-capable agents such as Claude Desktop","source":"**Works with your agent.** Claude Code, Codex, Cursor, Claude Desktop, OpenClaw, Hermes, and anything that can use MCP, a CLI or a REST API.","input":"list_voices with no arguments","expected":"the GPT-Live voice list, default marin","probe_kind":"mcp","argv":["sudo","-n","docker","exec","-i","smitline","smitline","mcp"],"tool":"list_voices","arguments":{},"expected_text":"marin","cwd":"<guest-path>"},
{"kind":"claim","claim":"Calls need your own OpenAI key; without it the brief check reports the missing key","source":"**Runs on your computer.** One Docker container, your own OpenAI and phone keys, open source under Apache-2.0.","input":"check_call_brief for a phone call with no OPENAI_API_KEY set","expected":"ok false with problem 'openai is not configured'","probe_kind":"mcp","argv":["sudo","-n","docker","exec","-i","smitline","smitline","mcp"],"tool":"check_call_brief","arguments":{"channel":"phone","to":"+14155550142","objective":"Book a table for 4 at 7pm","onBehalfOf":"Sam"},"expected_text":"openai is not configured","cwd":"<guest-path>"}
]
EOF
cat > .coldpass/examples.json <<'EOF'
[
{"kind":"example","claim":"The smitline CLI lists GPT-Live voices inside the running container","source":"README.md Prefer to set it up yourself? / docs/agents.md CLI","input":"voices","expected":"JSON with default marin","argv":["sudo","-n","docker","exec","smitline","smitline","voices"],"cwd":"<guest-path>","env":{},"expected_text":"marin"}
]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":false,"reason":"Entry points inspected (start-*.sh, Dockerfile, packages/cli, meeting-runtime, control-panel). No cron, --once/--now, or product scheduler loop was found. The only setInterval calls are console UI refresh timers in control-panel/app.js and calls.js. The daemon is a request-driven HTTP/MCP server; calls are placed on demand, not on a schedule.","checks":[]}
EOF
for f in probe claims examples cycles; do python3 -I -m json.tool .coldpass/$f.json >/dev/null && echo "$f ok"; done; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | tail -40
cd <guest-path> && sudo -n docker stop smitline >/dev/null && sudo -n docker ps -a --filter name=smitline --format '{{.Names}} {{.Status}}'; mkdir -p .coldpass && cat > .coldpass/report.json <<'EOF'
{"outcome":"needs_credentials","fault_owner":"prerequisite","operation":"Run the Smitline container from the README and call its MCP tools (list_voices works; placing a phone call needs an OpenAI key)","operation_scope":"Linux Ubuntu 24.04 guest, Docker Engine 29.1.3 installed via apt (sudo), image ghcr.io/kaelorlabs/smitline pulled from GHCR, phone-only run (no Docker socket). Not tested: placing a real phone call (needs OpenAI key plus SignalWire/Twilio account), meetings, the Node 22 npm test suite, the meeting image build.","steps":["sudo apt-get install -y docker.io (Docker prerequisite from README 'What you need'; Docker was missing, installed 29.1.3)","sudo systemctl start docker","docker run -d --name smitline --restart unless-stopped --network host -v smitline:/data ghcr.io/kaelorlabs/smitline (README 'Prefer to set it up yourself?', phone-only variant)","curl http://127.0.0.1:8095/calls returned 200","smitline mcp over stdio: tools/call list_voices returned default marin and 13 voices","smitline mcp: tools/call check_call_brief returned ok false, problem 'openai is not configured: set OPENAI_API_KEY'","docker exec smitline smitline voices returned the voice list","docker stop smitline"],"deviations":["Docker was not installed in the guest; installed docker.io via apt with sudo (the README requires Docker but the guest lacked it).","Probes use 'sudo -n docker exec' because the ubuntu user is not in the docker group.","Used the README's phone-only docker run to avoid mounting the Docker socket; the meeting option was not exercised.","Node 22 and the documented npm test and meeting-image test suite were not run; they are repo tests, not product operations.","No OpenAI key or phone provider credentials are available in this guest, so no call was placed; the README says keys go on the local setup <email>:8095, which was not completed."],"stuck_step":"Placing a call: the brief check fails with 'openai is not configured: set OPENAI_API_KEY'","main_blocker":"No OpenAI API key (and no SignalWire/Twilio phone account) is available in this disposable guest, and I was not given credentials.","plain_failure":"The Smitline app starts and its agent tools respond, but it cannot place a phone call here because it has no OpenAI key or phone account. Adding those keys on its local setup page is needed to test calls.","suggested_fix":"Provide an OpenAI key with GPT-Live access and a SignalWire or Twilio account, enter them on the setup page at http://127.0.0.1:8095 (not in chat), then rerun the check_call_brief and a real call."}
EOF
python3 -I -m json.tool .coldpass/report.json >/dev/null && echo report ok; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | python3 -I -c "import json,sys; d=json.load(sys.stdin); print(d['valid'], d['problems'], d['replay']['status'])"
cd <guest-path> && sudo -n docker start smitline >/dev/null && sleep 12 && curl -fsS -m 10 -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8095/calls; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | python3 -I -c "import json,sys; d=json.load(sys.stdin); print(d['valid'], d['problems'], d['replay']['status'])"
cd <guest-path> && python3 -I - <<'EOF'
import json
p='.coldpass/report.json'
r=json.load(open(p))
r['deviations'].append("The smitline container is intentionally left RUNNING after the run: the probe, claims and examples call 'docker exec smitline smitline mcp/voices', which need it up for the checker replay. Stop it with: sudo docker rm -f smitline (the console on 127.0.0.1:8095 and the stdio MCP are the only processes; they are the product's own runtime, not background processes I spawned separately).")
r['steps'].append("docker stop smitline then docker start smitline were needed because the first stop broke the checker replay; final container state: running")
json.dump(r,open(p,'w'),indent=1)
EOF
python3 -I -m json.tool .coldpass/report.json >/dev/null && echo report ok; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | python3 -I -c "import json,sys; d=json.load(sys.stdin); print(d['valid'], d['problems'], d['replay']['status'])"; sudo -n docker ps --filter name=smitline --format '{{.Names}} {{.Status}}'; ls -la .coldpass