assay-lua 0.11.2

General-purpose enhanced Lua runtime. Batteries-included scripting, automation, and web services.
Documentation
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Assay — MCP Server Replacement</title>
  <meta name="description" content="Assay covers 26 domains that would otherwise need separate MCP servers. One binary, zero npm dependencies.">
  <link rel="stylesheet" href="style.css">
</head>
<body class="page-comparison">
  __HEADER__


  <main>
    <h1>Comparison</h1>

    <!-- Size & Speed Charts -->
    <h2>Size &amp; Speed</h2>
    <p><code>FROM scratch</code> &mdash; no shell, no package manager. Rust-level cold start.</p>

    <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; margin-bottom: 2rem;">
      <div>
        <h3 style="margin-top: 0; font-size: 1rem;">Docker Image Size (compressed)</h3>
        <div style="font-size: 0.75rem;">
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--accent); padding: 0.3rem; border-radius: 3px; width: 4.7%; min-width: 4px;">&nbsp;</div>
            <span style="color: var(--accent); font-weight: 700;">Assay 9 MB</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 13.3%;">&nbsp;</div>
            <span class="text-muted">alpine/python 17 MB</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 27.3%;">&nbsp;</div>
            <span class="text-muted">kubectl 35 MB</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 33.6%;">&nbsp;</div>
            <span class="text-muted">python slim 43 MB</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 44.5%;">&nbsp;</div>
            <span class="text-muted">alpine/node 57 MB</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 46.9%;">&nbsp;</div>
            <span class="text-muted">alpine/k8s 60 MB</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 58.6%;">&nbsp;</div>
            <span class="text-muted">Deno 75 MB</span>
          </div>
          <div style="margin-bottom: 2px;">
            <div style="background: var(--border); color: var(--text); padding: 0.3rem 0.5rem; border-radius: 3px; width: 82%; white-space: nowrap;">node slim 105 MB</div>
          </div>
          <div style="margin-bottom: 2px;">
            <div style="background: var(--border); color: var(--text); padding: 0.3rem 0.5rem; border-radius: 3px; width: 89.8%; white-space: nowrap;">Bun 115 MB</div>
          </div>
          <div style="margin-bottom: 2px;">
            <div style="background: var(--border); color: var(--text); padding: 0.3rem 0.5rem; border-radius: 3px; width: 100%; white-space: nowrap;">newman 128 MB</div>
          </div>
        </div>
      </div>

      <div>
        <h3 style="margin-top: 0; font-size: 1rem;">Cold Start Time</h3>
        <div style="font-size: 0.75rem;">
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--accent); width: 3px; height: 18px; border-radius: 2px;"></div>
            <span style="color: var(--accent); font-weight: 700;">Assay 5 ms</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 3.75%;">&nbsp;</div>
            <span class="text-muted">Bun ~30 ms</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 6.25%;">&nbsp;</div>
            <span class="text-muted">Deno ~50 ms</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 25%;">&nbsp;</div>
            <span class="text-muted">kubectl ~200 ms</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 25%;">&nbsp;</div>
            <span class="text-muted">alpine/k8s ~200 ms</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 37.5%;">&nbsp;</div>
            <span class="text-muted">alpine/python ~300 ms</span>
          </div>
          <div style="display: flex; align-items: center; gap: 0.4rem; margin-bottom: 2px;">
            <div style="background: var(--border); padding: 0.3rem; border-radius: 3px; width: 37.5%;">&nbsp;</div>
            <span class="text-muted">python slim ~300 ms</span>
          </div>
          <div style="margin-bottom: 2px;">
            <div style="background: var(--border); color: var(--text); padding: 0.3rem 0.5rem; border-radius: 3px; width: 62.5%; white-space: nowrap;">alpine/node ~500 ms</div>
          </div>
          <div style="margin-bottom: 2px;">
            <div style="background: var(--border); color: var(--text); padding: 0.3rem 0.5rem; border-radius: 3px; width: 62.5%; white-space: nowrap;">node slim ~500 ms</div>
          </div>
          <div style="margin-bottom: 2px;">
            <div style="background: var(--border); color: var(--text); padding: 0.3rem 0.5rem; border-radius: 3px; width: 100%; white-space: nowrap;">newman ~800 ms</div>
          </div>
        </div>
      </div>
    </div>
    <p class="text-muted" style="font-size: 0.8rem;">Docker compressed pull size. Cold start = time to first instruction.</p>

    <!-- Domain Coverage -->
    <h2>Domains Covered</h2>
    <p>26 domains with full coverage, 3 partial. Each would otherwise need a separate MCP server (npm process).</p>

    <h2>How to Use</h2>
    <p>Assay is a Lua scripting runtime, not an MCP server. Your AI agent writes scripts using Assay's stdlib modules. Use <code>assay context "&lt;query&gt;"</code> for LLM-ready docs.</p>

    <h2>Full Coverage (26 domains)</h2>
    <table>
      <thead>
        <tr><th>MCP Server it replaces</th><th>Assay Module</th></tr>
      </thead>
      <tbody>
        <tr><td>modelcontextprotocol/servers (fetch)</td><td><code>http.*</code> builtins</td></tr>
        <tr><td>modelcontextprotocol/servers (filesystem)</td><td><code>fs.*</code> builtins</td></tr>
        <tr><td>@anthropic/mcp-server-fetch</td><td><code>http.*</code> builtins</td></tr>
        <tr><td>@anthropic/mcp-server-filesystem</td><td><code>fs.*</code> builtins</td></tr>
        <tr><td>mcp-server-github</td><td><code>assay.github</code></td></tr>
        <tr><td>@grafana/mcp-grafana</td><td><code>assay.grafana</code> + <code>assay.prometheus</code> + <code>assay.loki</code> + <code>assay.alertmanager</code></td></tr>
        <tr><td>@singlestore/postgres-mcp</td><td><code>assay.postgres</code> + <code>db.*</code></td></tr>
        <tr><td>mcp-server-kubernetes</td><td><code>assay.k8s</code></td></tr>
        <tr><td>mcp-server-sqlite</td><td><code>db.*</code> builtins</td></tr>
        <tr><td>mcp-server-mysql</td><td><code>db.*</code> builtins</td></tr>
        <tr><td>prometheus-mcp-server</td><td><code>assay.prometheus</code></td></tr>
        <tr><td>argocd-mcp</td><td><code>assay.argocd</code></td></tr>
        <tr><td>mcp-server-s3</td><td><code>assay.s3</code></td></tr>
        <tr><td>mcp-server-jwt</td><td><code>crypto.jwt_sign</code></td></tr>
        <tr><td>vault-mcp-server</td><td><code>assay.vault</code> + <code>assay.openbao</code></td></tr>
        <tr><td>traefik-mcp</td><td><code>assay.traefik</code></td></tr>
        <tr><td>mcp-server-temporal</td><td><code>assay.temporal</code></td></tr>
        <tr><td>harbor-mcp</td><td><code>assay.harbor</code></td></tr>
        <tr><td>mcp-certmanager</td><td><code>assay.certmanager</code></td></tr>
        <tr><td>flux-mcp</td><td><code>assay.flux</code></td></tr>
        <tr><td>crossplane-mcp</td><td><code>assay.crossplane</code></td></tr>
        <tr><td>unleash-mcp</td><td><code>assay.unleash</code></td></tr>
        <tr><td>velero-mcp</td><td><code>assay.velero</code></td></tr>
        <tr><td>kargo-mcp</td><td><code>assay.kargo</code></td></tr>
        <tr><td>zitadel-mcp</td><td><code>assay.zitadel</code></td></tr>
        <tr><td>eso-mcp</td><td><code>assay.eso</code></td></tr>
        <tr><td>dex-mcp</td><td><code>assay.dex</code></td></tr>
        <tr><td>mcp-server-websocket</td><td><code>ws.*</code> builtins</td></tr>
        <tr><td>mcp-server-crypto</td><td><code>crypto.*</code> builtins</td></tr>
      </tbody>
    </table>

    <h2>Partial Coverage (3 domains)</h2>
    <table>
      <thead>
        <tr><th>MCP Server</th><th>Assay Module</th><th>Note</th></tr>
      </thead>
      <tbody>
        <tr><td>aws/mcp (S3, Lambda, EC2)</td><td><code>assay.s3</code></td><td>S3 only, no Lambda/EC2</td></tr>
        <tr><td>mcp-server-git</td><td><code>shell.exec("git ...")</code></td><td>Via shell, not native module</td></tr>
        <tr><td>mcp-server-docker / terraform-mcp</td><td><code>assay.harbor</code> / <code>assay.crossplane</code></td><td>Registry and infra-as-code, not Docker engine</td></tr>
      </tbody>
    </table>

  </main>
  __FOOTER__
</body>
</html>