{
  "run_id": "aas-ee--open-websearch-claude-haiku-5-5-1793199152070992688",
  "date": "2026-10-28T14:57:42.005118+00:00",
  "repo": "aas-ee/open-websearch",
  "kind": "mcp",
  "source": "https://github.com/aas-ee/open-websearch",
  "commit": "fb11fd94df736819a0d2765bf7645224f98b2c6b",
  "model": "claude-haiku-5-5",
  "model_version": "claude-haiku-5-5",
  "test_version": "readme-2d57868128a84902c09a58991c46c5fe288928e55b1de8282ab5003e13159c2f",
  "pass": true,
  "outcome": "pass",
  "time_to_working_s": 241.55421019200003,
  "total_s": 309.9340891838074,
  "steps": [
    "cd <guest-path> && ls -la && git status 2>&1 | head -3; python3 --version; node --version 2>&1; npm --version 2>&1; cat README.md | head -c 6000",
    "echo $CDP_URL $<env-var>; ls /inputs 2>&1; ls <guest-path> 2>&1",
    "cd <guest-path> && grep -n '^#' README.md | head -80; grep -n -A4 '\"engines\"' package.json; grep -n '\"scripts\"' -A30 package.json | head -45",
    "cd <guest-path> && sed -n 143,200p README.md; sed -n 294,330p README.md",
    "cd <guest-path> && git init -q && git remote add origin https://github.com/aas-ee/open-websearch && git fetch --depth 1 origin fb11fd94df736819a0d2765bf7645224f98b2c6b 2>&1 | tail -3; git reset --mixed FETCH_HEAD 2>&1 | tail -2; git log --oneline -1 2>&1",
    "cd <guest-path> && timeout 900 npm install 2>&1 | tail -15; echo EXIT=$?",
    "cd <guest-path> && npm run build 2>&1 | tail -8; echo EXIT=$?; ls build/index.js && cat .coldpass/* 2>/dev/null | head -c 500; ls .coldpass",
    "cd <guest-path> && timeout 120 npm run search:cli -- \"open web search\" --json 2>&1 | head -c 2500; echo; echo EXIT=${PIPESTATUS[0]}",
    "cd <guest-path> && node build/index.js search --help 2>&1 | head -40",
    "cd <guest-path> && for e in duckduckgo brave startpage hackernews; do echo \"== $e\"; timeout 120 node build/index.js search \"open web search\" --engine $e --limit 3 --json 2>/dev/null | tail -n +1 | head -c 900; echo; done",
    "cd <guest-path> && grep -rn \"query:\\|limit:\" src/tools/*.ts 2>/dev/null | head -10; ls src; grep -rln \"MCP_TOOL_SEARCH_NAME\" src | head",
    "cd <guest-path> && sed -n 105,120p src/tools/setupTools.ts; grep -n \"Returns structured results\" README.md; grep -n \"Configurable number of results\" README.md",
    "mkdir -p <guest-path> && cat > <guest-path> <<'EOF'\n{\"kind\":\"mcp\",\"argv\":[\"node\",\"build/index.js\"],\"cwd\":\"<guest-path>\",\"env\":{\"MODE\":\"stdio\",\"DEFAULT_SEARCH_ENGINE\":\"duckduckgo\"},\"tool\":\"search\",\"arguments\":{\"query\":\"open web search\",\"limit\":3,\"engines\":[\"duckduckgo\"]},\"expected_text\":\"open-websearch\"}\nEOF\ncat > <guest-path> <<'EOF'\n[{\"kind\":\"claim\",\"claim\":\"MCP search returns structured results with titles, URLs and descriptions\",\"source\":\"README.md\",\"quote\":\"Returns structured results with titles, URLs, and descriptions\",\"input\":\"query open web search via MCP search tool\",\"expected\":\"result text containing a result\",\"probe_kind\":\"mcp\",\"argv\":[\"node\",\"build/index.js\"],\"env\":{\"MODE\":\"stdio\",\"DEFAULT_SEARCH_ENGINE\":\"duckduckgo\"},\"tool\":\"search\",\"arguments\":{\"query\":\"open web search\",\"limit\":3,\"engines\":[\"duckduckgo\"]},\"expected_text\":\"open-websearch\",\"cwd\":\"<guest-path>\"},\n{\"kind\":\"claim\",\"claim\":\"No API keys required\",\"source\":\"README.md\",\"quote\":\"No API keys or authentication required\",\"input\":\"CLI search with duckduckgo, no key\",\"expected\":\"ok status with results\",\"probe_kind\":\"cli\",\"argv\":[\"node\",\"build/index.js\",\"search\",\"open web search\",\"--engine\",\"duckduckgo\",\"--limit\",\"3\",\"--json\"],\"expected_text\":\"\\\"status\\\": \\\"ok\\\"\",\"cwd\":\"<guest-path>\"}]\nEOF\ncd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | tail -c 4000",
    "cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay > <guest-path> 2>&1; echo EXIT=$?; python3 -I -c \"\nimport json,sys\nt=open('<guest-path>').read()\ni=t.find('{')\nd=json.loads(t[i:])\nprint({k:(v if not isinstance(v,(dict,list)) else type(v).__name__) for k,v in d.items()})\n\" 2>&1 | head -c 1500",
    "cd <guest-path> && grep -rniE \"cron|setInterval|--once|--now|webhook\" README.md src --include=*.ts | head -8; echo ---; grep -n \"test\" README.md | head -20; echo ---; timeout 300 npm run test:local-daemon 2>&1 | tail -6; echo EXIT=${PIPESTATUS[0]}",
    "cd <guest-path> && cat > cycles.json <<'EOF'\n{\"detected\":false,\"checks\":[],\"reason\":\"Inspected README.md and src/*.ts for cron, setInterval, webhook, --once or --now scheduler triggers; none found. The only long-running entrypoint is the local daemon (open-websearch serve), which is request-driven, not a scheduled cycle.\"}\nEOF\ncat > examples.json <<'EOF'\n[{\"kind\":\"example\",\"claim\":\"Repository offline local daemon test suite runs (documented npm test script; not product behavior proof)\",\"source\":\"package.json scripts test:local-daemon\",\"input\":\"npm run test:local-daemon\",\"expected\":\"Local daemon tests passed.\",\"argv\":[\"npm\",\"run\",\"test:local-daemon\"],\"cwd\":\"<guest-path>\",\"env\":{},\"expected_text\":\"Local daemon tests passed.\"}]\nEOF\npython3 -I -c \"import json;json.load(open('cycles.json'));json.load(open('examples.json'));print('ok')\"; cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay > <guest-path> 2>&1; echo EXIT=$?; python3 -I -c \"\nimport json\nt=open('<guest-path>').read(); d=json.loads(t[t.find('{'):])\nprint(d['valid'], d['problems'])\" 2>&1 | head -c 2000",
    "cd <guest-path> && cat > report.json <<'EOF'\n{\"outcome\":\"working\",\"fault_owner\":null,\"operation\":\"Run open-websearch MCP stdio server and call the search tool; one-shot CLI search; local daemon test suite\",\"operation_scope\":\"Node.js 22 (v22.23.4) and npm 10.9.9 on Linux; pinned commit fb11fd94df736819a0d2765bf7645224f98b2c6b; no API keys; DuckDuckGo engine used because Bing and Brave were not usable from this network\",\"steps\":[\"git init; git remote add origin https://github.com/aas-ee/open-websearch; git fetch --depth 1 origin fb11fd94df736819a0d2765bf7645224f98b2c6b; git reset --mixed FETCH_HEAD\",\"npm install\",\"npm run build\",\"npm run search:cli -- \\\"open web search\\\" --json (README CLI section)\",\"node build/index.js search \\\"open web search\\\" --engine duckduckgo --limit 3 --json\",\"MODE=stdio DEFAULT_SEARCH_ENGINE=duckduckgo node build/index.js (MCP stdio), tool search\",\"npm run test:local-daemon\"],\"deviations\":[\"Default engine bing returned engine_error 'Bing exceeded the regional redirect limit (1)' from this network; switched to duckduckgo, which returned results\",\"brave returned HTTP 429 rate limit; not used for evidence\",\"npm install reported 14 vulnerabilities (4 moderate, 10 high); not remediated because the pinned lockfile was used as-is\",\"Workspace had no .git; initialized git metadata at the pinned commit as the task instructed\",\"Did not start Playwright or a browser; no CDP endpoint was needed for these operations\"],\"stuck_step\":null,\"main_blocker\":null,\"plain_failure\":null,\"suggested_fix\":\"None required for the working path. For Bing in restricted networks, configure USE_PROXY/PROXY_URL per the README runtime-proxy section.\"}\nEOF\npython3 -I -c \"import json;d=json.load(open('report.json'));print(d['outcome'])\"; ls -la <guest-path> <guest-path> 2>&1",
    "cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay > <guest-path> 2>&1; echo EXIT=$?; python3 -I -c \"\nimport json\nt=open('<guest-path>').read(); d=json.loads(t[t.find('{'):])\nprint(d['valid'], d['problems'])\"; git -C <guest-path> log --oneline -1"
  ],
  "stuck_step": null,
  "error_excerpt": null,
  "what_it_did": "Run open-websearch MCP stdio server and call the search tool; one-shot CLI search; local daemon test suite",
  "suggested_fix": null,
  "tokens_in": 361169,
  "tokens_out": 7814,
  "cost_usd": 0.0128767,
  "usage_complete": true,
  "checks": [
    {
      "check": "operation",
      "status": "PASS",
      "details": {
        "working": true,
        "argv": [
          "node",
          "build/index.js"
        ],
        "kind": "mcp",
        "serverInfo": {
          "name": "web-search",
          "version": "1.2.0"
        },
        "tools": [
          "search",
          "fetchLinuxDoArticle",
          "fetchCsdnArticle",
          "fetchGithubReadme",
          "fetchWebContent",
          "fetchJuejinArticle"
        ],
        "tool_schema_bytes": 2606,
        "tool_result": {
          "content": [
            {
              "type": "text",
              "text": "{\n  \"query\": \"open web search\",\n  \"engines\": [\n    \"duckduckgo\"\n  ],\n  \"totalResults\": 3,\n  \"results\": [\n    {\n      \"title\": \"Open-WebSearch - GitHub\",\n      \"url\": \"https://github.com/Aas-ee/open-webSearch\",\n      \"description\": \"<b>open-websearch</b> provides an MCP server, CLI, and local daemon, and can also be paired with skill-guided agent workflows for live <b>web</b> <b>search</b> and content retrieval without API keys. On first use, the skill typically follows this path: detect whether a usable <b>open-websearch</b> path already exists, guide ...\",\n      \"source\": \"github.com\",\n      \"engine\": \"duckduckgo\"\n    },\n    {\n      \"title\": \"Open Web Search - Promoting Europe&#x27;s Independence in Web Search\",\n      \"url\": \"https://openwebsearch.eu/\",\n      \"description\": \"The <b>Open</b> <b>Web</b> Index serves as a basis for free and unbiased internet <b>search</b>, innovatives <b>search</b> engines and as a backbone for AI applications. Would you like to test the OWI? At www.openwebindex.eu you will find comprehensive information, data shards for download and statistics daily updated.\",\n      \"source\": \"openwebsearch.eu\",\n      \"engine\": \"duckduckgo\"\n    },\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/xhtml/search\",\n      \"description\": \"<b>Search</b> the world&#x27;s information, including webpages, images, videos and more. Google has many special features to help you find exactly what you&#x27;re looking for.\",\n      \"source\": \"www.google.com\",\n      \"engine\": \"duckduckgo\"\n    }\n  ],\n  \"partialFailures\": []\n}"
            }
          ]
        },
        "tool_result_checked": true,
        "scope": "product operation"
      }
    }
  ],
  "safety": {
    "version": "z2x-1",
    "rules_version": "z2x-1",
    "summary": "Review signals: 1 connection review, 76 known vulnerability.",
    "expected": "Reviewed as expected for a test run: attempted writes that failed, so nothing was written; resolver address lookups that send no data.",
    "findings": [
      {
        "kind": "connection-review",
        "count": 1,
        "note": "Repository processes attempted these non-loopback connections; proxies can hide the final hostname.",
        "location_count": 7,
        "process_count": 20
      },
      {
        "kind": "known-vulnerability",
        "count": 76,
        "note": "OSV reports a known vulnerability in this dependency version.",
        "location_count": 13
      }
    ],
    "context": [],
    "limitations": [
      "A short run cannot establish that code is safe.",
      "Connections show IP addresses; proxies can hide the final hostname.",
      "Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing."
    ],
    "static": {
      "dependency_note": "OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check."
    },
    "evidence_url": "/safety/?run=aas-ee--open-websearch-claude-haiku-5-5-1793199152070992688",
    "evidence_file": "/data/safety/aas-ee--open-websearch-claude-haiku-5-5-1793199152070992688.json.gz"
  },
  "agent_execution": "native_agent",
  "agent_runtime": "claude-code",
  "agent_runtime_version": "2.1.310 (Claude Code)",
  "tool_transport": "mcp-assigned-vm",
  "platform": "linux",
  "reasoning": "low",
  "service_tier": null,
  "resources": {
    "cpus": 2,
    "memory_mib": 4096,
    "disk_mib": 32768
  },
  "native_tool_calls": 18,
  "native_bundle": null,
  "architecture": null,
  "backend": "hyperv",
  "platform_details": {
    "backend": "hyperv",
    "os": "linux"
  },
  "platform_conflicts": null,
  "sandbox_source": null,
  "source_pin": {
    "commit": "fb11fd94df736819a0d2765bf7645224f98b2c6b",
    "url": "https://github.com/aas-ee/open-websearch"
  },
  "purpose": "initial",
  "profile": {
    "model": "claude-haiku-5-5",
    "reasoning": "low"
  },
  "fault": {
    "owner": null,
    "status": "resolved",
    "reason": null
  },
  "fix_id": null,
  "verifies_run_id": null,
  "hosting": null,
  "operation_scope": "product operation",
  "tool_calls": 18,
  "guest_setup": null,
  "runtime": null,
  "runtime_version": null,
  "runtime_revision": null,
  "source_revision": null,
  "evidence_version": null,
  "failure_origin": null,
  "evidence_strength": "readme_checked",
  "works": "yes",
  "install_s": null,
  "first_use_s": null,
  "mcp": "local",
  "needs": [],
  "needs_which": null,
  "agent_interface": [
    "mcp"
  ],
  "license": "Apache-2.0",
  "repo_url": "https://github.com/aas-ee/open-websearch",
  "cost_to_try": "free",
  "hardware": null,
  "what_failed": null,
  "local_or_hosted": "local",
  "cycle_checks": [
    {
      "kind": "cycle",
      "claim": "Scheduled or looping main behavior",
      "source": "repository entry points",
      "input": "source inspection",
      "expected": "identify the product trigger",
      "verdict": "yes",
      "outcome": "Inspected README.md and src/*.ts for cron, setInterval, webhook, --once or --now scheduler triggers; none found. The only long-running entrypoint is the local daemon (open-websearch serve), which is request-driven, not a scheduled cycle.",
      "evidence": "Inspected README.md and src/*.ts for cron, setInterval, webhook, --once or --now scheduler triggers; none found. The only long-running entrypoint is the local daemon (open-websearch serve), which is request-driven, not a scheduled cycle.",
      "command": ""
    }
  ],
  "claims": [
    {
      "kind": "claim",
      "claim": "MCP search returns structured results with titles, URLs and descriptions",
      "source": "README.md",
      "input": "{\"tool\": \"search\", \"arguments\": {\"query\": \"open web search\", \"limit\": 3, \"engines\": [\"duckduckgo\"]}}",
      "expected": "result text containing a result",
      "command": "node build/index.js tools/call {\"tool\": \"search\", \"arguments\": {\"query\": \"open web search\", \"limit\": 3, \"engines\": [\"duckduckgo\"]}}",
      "verdict": "yes",
      "outcome": "Real input produced the expected result: open-websearch",
      "evidence": "\u2026open-websearch</b> provides an MCP server, CLI, and local daemon, and can also be paired with skill-guided agent workflows for live <b>web</b> <b>search</b> and content retrieval without API keys. On first use, the skill typically follows this path: detect whether a usable <b>open-websearch</b> path already exists, guide ...\\\",\\n      \\\"source\\\": \\\"github.com\\\",\\n      \\\"engine\\\": \\\"duckduckgo\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"Google\\\",\\n      \\\"url\\\": \\\"https://www.google.com/xhtml/search\\\",\\n      \\\"description\\\": \\\"<b>Search</b> the world&#x27;s information, including webpages, images, v",
      "source_checked": true,
      "source_file": "README.md"
    },
    {
      "kind": "claim",
      "claim": "No API keys required",
      "source": "README.md",
      "input": "CLI search with duckduckgo, no key",
      "expected": "ok status with results",
      "command": "node build/index.js search 'open web search' --engine duckduckgo --limit 3 --json",
      "verdict": "yes",
      "outcome": "Real input produced the expected result: \"status\": \"ok\"",
      "evidence": "\u2026\"status\": \"ok\",\n  \"data\": {\n    \"query\": \"open web search\",\n    \"engines\": [\n      \"duckduckgo\"\n    ],\n    \"totalResults\": 3,\n    \"results\": [\n      {\n        \"title\": \"Open-WebSearch - GitHub\",\n        \"url\": \"https://github.com/Aas-ee/open-webSearch\",\n        \"description\": \"<b>open-websearch</b> provides an MCP server, CLI, and local daemon, and can also be paired with skill-guided agent workflows for live <b>web</b> <b>search</b> and content retrieval without API keys. On first use, the skill typically follows this path: detect whether a usable <b>open-websearch</b> path already exists, gu",
      "returncode": 0,
      "source_checked": true,
      "source_file": "README.md"
    }
  ],
  "claims_note": null,
  "example_checks": [
    {
      "kind": "example",
      "claim": "Repository offline local daemon test suite runs (documented npm test script; not product behavior proof)",
      "source": "package.json scripts test:local-daemon",
      "input": "npm run test:local-daemon",
      "command": "npm run test:local-daemon",
      "evidence": "daemon health and status routes\n\u2705 local daemon operation routes\n\u2705 CLI status json success\n\u2705 CLI status unavailable path\n\u2705 CLI status error envelope\n\u2705 CLI serve waits for signal\n\nLocal daemon tests passed.\n\ud83d\udd0d Default search engine: duckduckgo\n\ud83d\udd0d No search engine restrictions, all available engines can be used\n\ud83d\udd0d Search mode: AUTO, effective: REQUEST (currently only affects Bing)\n\ud83c\udf10 No proxy configured (set USE_PROXY=true to enable)\n\ud83d\udd10 fetchWebContent TLS verification is enabled\n\ud83e\udded Playwright client source: auto\n\ud83e\udded Playwright headless: true\n\ud83e\udded Playwright navigation timeout: 20000ms\n\ud83d\udda5\ufe0f Server mode: STDIO",
      "deferred": false,
      "expected": "Local daemon tests passed.",
      "returncode": 0,
      "verdict": "yes",
      "outcome": "command completed successfully"
    }
  ],
  "does_what_it_says": "yes",
  "maintenance": {
    "last_commit_at": "2026-10-08T05:52:08Z",
    "commits_90d": 28,
    "merged_prs_90d": 15,
    "open_issues": 11,
    "open_prs": 3,
    "reply_share": 0.77,
    "reply_threads": 35,
    "median_reply_hours": 5.9,
    "last_release_at": "2026-09-28T10:15:08Z",
    "archived": false,
    "verdict": "maintained",
    "note": "actively maintained: last commit 20 days ago; 28 commits and 15 merged PRs in 90 days; 11 open issues, 3 open PRs; 27 of 35 recent threads got a maintainer reply, median first reply 5.9h; latest release 2026-09-28"
  },
  "maintenance_verdict": "maintained",
  "maintenance_note": "actively maintained: last commit 20 days ago; 28 commits and 15 merged PRs in 90 days; 11 open issues, 3 open PRs; 27 of 35 recent threads got a maintainer reply, median first reply 5.9h; latest release 2026-09-28",
  "maintained": "active",
  "maintained_note": "last commit 20 days ago; 8 open issues, 5 answered or closed",
  "last_commit_at": "2026-10-08T05:52:09Z",
  "last_release_at": "2026-09-28T10:15:08Z",
  "open_issues": 8,
  "answered_issues": 5,
  "platforms_claimed": [
    "linux",
    "mac",
    "windows"
  ],
  "topic": "mcp-server",
  "agent_interfaces": [
    {
      "interface": "mcp",
      "evidence": "independent checker",
      "observed": true,
      "operation_checked": true
    },
    {
      "interface": "cli",
      "evidence": "README metadata",
      "observed": false,
      "operation_checked": false
    }
  ],
  "agent_interfaces_note": "README metadata is a discovery hint, not pinned documentation proof. Observed interfaces were exercised in this run. An empty list means unknown.",
  "mcp_context": {
    "tool_count": 6,
    "schema_bytes": 2606,
    "tokens_approx": 652,
    "estimate_method": "ceil(compact UTF-8 tools/list JSON bytes / 4)",
    "scope": "returned tools/list page only; excludes client framing and tool results"
  },
  "tested_at": "2026-10-28T14:57:42.005118+00:00",
  "tested_commit": "fb11fd94df736819a0d2765bf7645224f98b2c6b",
  "tested_with": {
    "agent": "claude-code",
    "agent_version": "2.1.310 (Claude Code)",
    "model": "claude-haiku-5-5",
    "model_route": "claude-haiku-5-5",
    "reasoning": "low",
    "os": "linux",
    "backend": "hyperv",
    "transport": "mcp-assigned-vm"
  },
  "setup_identity": {
    "repo": "aas-ee/open-websearch",
    "source": "https://github.com/aas-ee/open-websearch",
    "commit": "fb11fd94df736819a0d2765bf7645224f98b2c6b",
    "source_revision": null,
    "os": "linux",
    "architecture": null,
    "backend": "hyperv",
    "model": "claude-haiku-5-5",
    "model_version": "claude-haiku-5-5",
    "agent_execution": "native_agent",
    "agent_runtime": "claude-code",
    "agent_runtime_version": "2.1.310 (Claude Code)",
    "tool_transport": "mcp-assigned-vm",
    "runtime": null,
    "runtime_version": null,
    "runtime_revision": null,
    "sandbox_source": null,
    "guest_setup": null,
    "source_pin": {
      "commit": "fb11fd94df736819a0d2765bf7645224f98b2c6b",
      "url": "https://github.com/aas-ee/open-websearch"
    },
    "platform_details": {
      "os": "linux",
      "backend": "hyperv"
    },
    "platform_conflicts": null,
    "reasoning": "low",
    "service_tier": null,
    "resources": {
      "cpus": 2,
      "memory_mib": 4096,
      "disk_mib": 32768
    },
    "operation": "Run open-websearch MCP stdio server and call the search tool; one-shot CLI search; local daemon test suite",
    "operation_scope": "product operation",
    "hosting": null,
    "kind": "mcp",
    "test_version": "readme-2d57868128a84902c09a58991c46c5fe288928e55b1de8282ab5003e13159c2f",
    "evidence_version": null
  },
  "other_model": null,
  "other_run_id": null,
  "models_agree": null,
  "furthest_model": null,
  "transcript_url": "/transcripts/aas-ee--open-websearch-claude-haiku-5-5-1793199152070992688.txt",
  "report_url": "/reports/aas-ee--open-websearch-claude-haiku-5-5-1793199152070992688.json"
}
