{
    "version": "https://jsonfeed.org/version/1",
    "title": "StackQL Blog - Product Announcements",
    "home_page_url": "https://stackql.io/blog/product",
    "description": "New StackQL releases, features and capabilities",
    "items": [
        {
            "id": "https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry",
            "content_html": "<p><a href=\"https://github.com/stackql/stackql/releases/tag/v0.11.669\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>StackQL v0.11</strong></a> is out. The <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp\"><strong>StackQL MCP server</strong></a>: now includes the current Model Context Protocol revision, <code>2026-07-28</code>, alongside every earlier revision it already supported, and the audit log that records what an agent did can be written as OpenTelemetry log records instead of the bespoke JSONL format. Both are available today through every install channel.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"mcp-protocol-revision-2026-07-28\">MCP protocol revision 2026-07-28<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#mcp-protocol-revision-2026-07-28\" class=\"hash-link\" aria-label=\"Direct link to MCP protocol revision 2026-07-28\" title=\"Direct link to MCP protocol revision 2026-07-28\" translate=\"no\">​</a></h2>\n<p><code>2026-07-28</code> is the largest revision of the protocol since it launched. Relevant features for the StackQL MCP server incldue:</p>\n<ul>\n<li class=\"\">The <code>initialize</code> / <code>notifications/initialized</code> handshake is gone. Every request carries the protocol version and the client's capabilities in its <code>_meta</code> block, and a client discovers a server with a single <code>server/discover</code> call.</li>\n<li class=\"\">Protocol-level sessions are gone from Streamable HTTP. There is no <code>Mcp-Session-Id</code> header, and <code>tools/list</code>, <code>prompts/list</code> and <code>resources/list</code> must return the same answer on every connection.</li>\n<li class=\"\">Server-to-client requests such as elicitation no longer happen mid-call. A server that needs the user's input returns an <code>input_required</code> result, and the client retries the call with the answer attached (multi round-trip requests, SEP-2322).</li>\n</ul>\n<p>The StackQL MCP server negotiates per client, so a mixed fleet works against one server:</p>\n<table><thead><tr><th>Revision</th><th>Lifecycle</th><th>Approval prompt in <code>safe</code> / <code>delete_safe</code> mode</th></tr></thead><tbody><tr><td><code>2026-07-28</code></td><td>No handshake; version and capabilities in <code>_meta</code> on every request</td><td><code>input_required</code> result, retried with <code>inputResponses</code></td></tr><tr><td><code>2025-11-25</code>, <code>2025-06-18</code></td><td><code>initialize</code> handshake</td><td>Server-initiated <code>elicitation/create</code> request</td></tr><tr><td><code>2025-03-26</code>, <code>2024-11-05</code></td><td>as above</td><td>as above</td></tr></tbody></table>\n<p>The gated-write flow is the headline feature of the server, so it was the acceptance test for this work: a mutation in <code>safe</code> mode still stops for approval, on both revisions, over both transports, and the audit record still says whether the user accepted, declined or dismissed the prompt. Nothing changes in how you run the server or in the SQL an agent writes.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"stdio\">stdio<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#stdio\" class=\"hash-link\" aria-label=\"Direct link to stdio\" title=\"Direct link to stdio\" translate=\"no\">​</a></h3>\n<p>The stdio transport serves every revision on one process. A current client's first request is served without a handshake, and an older client's <code>initialize</code> still works. If you use Claude Desktop, the npm or PyPI launchers, or the Docker image, there is nothing to configure.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"streamable-http-and-the-stateless-option\">Streamable HTTP and the <code>stateless</code> option<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#streamable-http-and-the-stateless-option\" class=\"hash-link\" aria-label=\"Direct link to streamable-http-and-the-stateless-option\" title=\"Direct link to streamable-http-and-the-stateless-option\" translate=\"no\">​</a></h3>\n<p>Over HTTP the protocol removed sessions, and the two models cannot share one listener. By default the server keeps the stateful, session-per-client model, which serves revisions up to <code>2025-11-25</code>. A <code>2026-07-28</code> client learns that from <code>server/discover</code> and negotiates down, so existing HTTP integrations keep their sessions and their approval prompts unchanged.</p>\n<p>To serve <code>2026-07-28</code> natively over HTTP, set <code>stateless</code> on the server:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql mcp --mcp.server.type=http \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.config '{\"server\": {\"transport\": \"http\", \"address\": \"127.0.0.1:9992\", \"stateless\": true} }'</span><br></div></code></pre></div></div>\n<p>A sessionless server issues no <code>Mcp-Session-Id</code>, keeps the list endpoints connection-invariant, and runs the approval round trip through <code>input_required</code>. It still accepts an older client's <code>initialize</code> and serves reads to it, but it cannot retain the elicitation capability that client declared at handshake time, so an older client cannot approve gated writes on a sessionless server. Pick <code>stateless</code> for current-revision hosts, and leave the default for a fleet that still includes older clients. The <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp#protocol-revision-support\"><strong>protocol revision support</strong></a> section of the docs has the full matrix, alongside the <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp#server-modes\"><strong>server modes</strong></a> it interacts with.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"opentelemetry-output-for-the-audit-log\">OpenTelemetry output for the audit log<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#opentelemetry-output-for-the-audit-log\" class=\"hash-link\" aria-label=\"Direct link to OpenTelemetry output for the audit log\" title=\"Direct link to OpenTelemetry output for the audit log\" translate=\"no\">​</a></h2>\n<p>Every tool call the server handles writes one audit record: the tool, the server mode, the gate decision, the verbatim SQL, the duration and any error. Until now that record was a line of StackQL-specific JSON, which meant a custom parser between the file and whatever you wanted to do with it.</p>\n<p>This release adds a second format. <code>--mcp.log.format=otel</code> writes the same records as OpenTelemetry log records, in the OTLP/JSON encoding, one export payload per line:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql mcp --mcp.server.type=stdio --mcp.log.format=otel</span><br></div></code></pre></div></div>\n<p>The default, <code>jsonl</code>, is unchanged byte for byte, and the format can also be set in <code>mcp.config</code> as <code>\"audit\": {\"format\": \"otel\"}</code>. The destination is the same rotating file either way. The <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp#log-format\"><strong>log format</strong></a> reference lists every option and attribute.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-a-record-looks-like\">What a record looks like<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#what-a-record-looks-like\" class=\"hash-link\" aria-label=\"Direct link to What a record looks like\" title=\"Direct link to What a record looks like\" translate=\"no\">​</a></h3>\n<p>A <code>SELECT</code> run through the server produces a record like this (pretty-printed; the file holds it on one line):</p>\n<div class=\"language-json codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"resourceLogs\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"resource\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"attributes\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"service.name\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"stackql\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"service.version\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"0.10.623\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"scopeLogs\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"scope\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"name\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"github.com/stackql/stackql/pkg/mcp_server/audit\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"version\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"1.0.0\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"logRecords\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"timeUnixNano\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"1788652800123456789\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"observedTimeUnixNano\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"1788652800123987654\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"severityNumber\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">9</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"severityText\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"INFO\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"body\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"execute_tool run_select_query\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"attributes\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"gen_ai.operation.name\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"execute_tool\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"mcp.method.name\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"tools/call\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"gen_ai.tool.name\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"run_select_query\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"gen_ai.tool.call.id\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"3f1c9a6b2e8d4a70\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"mcp.protocol.version\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"2026-07-28\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"stackql.mode\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"safe\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"stackql.decision\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"allow\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"stackql.query\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"select name, id from google.storage.buckets where project = 'stackql-demo'\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"stackql.query_class\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stringValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"select\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"stackql.duration_ms\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"intValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"412\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"key\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"stackql.rows_returned\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"intValue\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"5\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"traceId\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"16c62eeb8bb8c6e30917626336d61829\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"spanId\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"ff6b2aa55252ac0e\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"schemaUrl\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"https://opentelemetry.io/schemas/1.44.0\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"schemaUrl\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"https://opentelemetry.io/schemas/1.44.0\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>The attribute names follow the OpenTelemetry <a href=\"https://github.com/open-telemetry/semantic-conventions-genai/blob/main/docs/gen-ai/gen-ai-spans.md#execute-tool-span\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">GenAI</a> and <a href=\"https://github.com/open-telemetry/semantic-conventions-genai/blob/main/docs/gen-ai/mcp.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">MCP</a> semantic conventions: <code>gen_ai.operation.name</code> is <code>execute_tool</code>, <code>gen_ai.tool.name</code> is the MCP tool, <code>gen_ai.tool.call.id</code> ties records of one call together, and <code>mcp.method.name</code>, <code>mcp.protocol.version</code> and <code>mcp.session.id</code> describe the protocol exchange. StackQL's own facts sit under a <code>stackql.</code> prefix: the verbatim <code>stackql.query</code>, its <code>stackql.query_class</code>, the <code>stackql.mode</code> and <code>stackql.decision</code> of the gate, <code>stackql.duration_ms</code>, <code>stackql.rows_returned</code>, and <code>stackql.provider</code> for metadata tools. A refused or failed call is an <code>ERROR</code> record with <code>error.type</code> and <code>error.message</code>.</p>\n<p>A call that went through the approval gate produces a second record for the elicitation decision, sharing the same <code>gen_ai.tool.call.id</code> and trace id, so an accepted or declined write is visible as two correlated events.</p>\n<p>The design inlcudes:</p>\n<ul>\n<li class=\"\"><strong>The attribute set is a versioned interface.</strong> The GenAI conventions are still Development status upstream, so the set StackQL emits is pinned: the instrumentation scope version (<code>1.0.0</code>) names the schema, the <code>schemaUrl</code> pins the stable conventions, and a test in the repository asserts the exact attribute list. When it changes, the scope version changes with it.</li>\n<li class=\"\"><strong>Redaction is identical in both formats.</strong> The audit answers \"what did the agent do\", not \"what did the agent see\". Result rows are never written to either format; only the statement that produced them is. The regression suite checks that a value returned to the client appears in neither log.</li>\n</ul>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trace-correlation\">Trace correlation<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#trace-correlation\" class=\"hash-link\" aria-label=\"Direct link to Trace correlation\" title=\"Direct link to Trace correlation\" translate=\"no\">​</a></h3>\n<p>If the calling agent propagates W3C trace context in <code>params._meta</code> (a <code>traceparent</code> key, as the MCP conventions describe), the records carry that trace and span. When it does not, the server generates one trace id per MCP session, so every record from one agent session still correlates in your backend.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"feeding-a-collector\">Feeding a collector<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#feeding-a-collector\" class=\"hash-link\" aria-label=\"Direct link to Feeding a collector\" title=\"Direct link to Feeding a collector\" translate=\"no\">​</a></h3>\n<p>The line format is exactly what the OpenTelemetry Collector's <code>otlp_json_file</code> receiver reads, so the stream reaches an OTLP pipeline with no transform processor. This configuration was verified against otelcol-contrib 0.160.0:</p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">receivers</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">otlp_json_file</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">include</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">/var/log/stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">mcp.log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">exporters</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">debug</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">service</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">pipelines</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">logs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">receivers</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">otlp_json_file</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">exporters</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">debug</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><br></div></code></pre></div></div>\n<p>Swap the <code>debug</code> exporter for <code>otlphttp</code>, or for whichever backend you run, and the agent's activity lands next to the rest of your telemetry with the same resource, scope and trace semantics as everything else. Sinks and dashboards on top of the stream are the next step; this release makes the stream standards-shaped.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"for-developers-a-general-output-option\">For developers: a general output option<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#for-developers-a-general-output-option\" class=\"hash-link\" aria-label=\"Direct link to For developers: a general output option\" title=\"Direct link to For developers: a general output option\" translate=\"no\">​</a></h3>\n<p>The OpenTelemetry encoding is not tied to the MCP server. It is implemented as a decorator in the generic <code>pkg/sink</code> package that wraps any record sink: a payload can describe its own log records, and any other JSON-shaped record is decorated automatically, with its top-level fields as typed attributes and the record as the body. The MCP audit is the first consumer; other StackQL log and result channels can adopt the same option without new plumbing.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"get-it\">Get it<a href=\"https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry#get-it\" class=\"hash-link\" aria-label=\"Direct link to Get it\" title=\"Direct link to Get it\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\">Release notes and binaries: <a href=\"https://github.com/stackql/stackql/releases/tag/v0.10.623\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>v0.10.623</strong></a></li>\n<li class=\"\">Install channels (Claude Desktop bundle, npm, PyPI, Docker, GitHub Action): <a class=\"\" href=\"https://stackql.io/installing-stackql#installing-the-mcp-server\"><strong>Installing the MCP server</strong></a></li>\n<li class=\"\">Protocol revisions, <code>stateless</code>, modes and the audit log: <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp\"><strong>stackql mcp</strong></a></li>\n<li class=\"\">The new flag in the global reference: <a class=\"\" href=\"https://stackql.io/command-line-usage/global-flags\"><strong><code>--mcp.log.format</code></strong></a></li>\n<li class=\"\">Source: <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>github.com/stackql/stackql</strong></a></li>\n</ul>\n<p>⭐ Star us on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a> and let us know what your agents build.</p>",
            "url": "https://stackql.io/blog/product/stackql-mcp-2026-07-28-and-opentelemetry",
            "title": "StackQL update: MCP protocol revision 2026-07-28 and OpenTelemetry output",
            "summary": "StackQL v0.11 brings the MCP server up to protocol revision 2026-07-28, and adds an OpenTelemetry (OTLP/JSON) output format for the agent audit log so any OTel collector can consume it without a custom parser.",
            "date_modified": "2026-09-05T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "mcp",
                "model context protocol",
                "opentelemetry",
                "ai agents",
                "ai"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-mcp-anthropic-directory",
            "content_html": "<p>The StackQL MCP server has been reviewed by Anthropic and is now listed in the <a href=\"https://claude.ai/directory/connectors/ant.dir.gh.stackql.stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Anthropic MCP Directory</a>. StackQL is a member of the Claude Partner Network, and the directory listing makes the MCP server discoverable and installable directly from within Claude Desktop - no manual bundle download, no custom connector configuration.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"finding-it-in-claude-desktop\">Finding it in Claude Desktop<a href=\"https://stackql.io/blog/product/stackql-mcp-anthropic-directory#finding-it-in-claude-desktop\" class=\"hash-link\" aria-label=\"Direct link to Finding it in Claude Desktop\" title=\"Direct link to Finding it in Claude Desktop\" translate=\"no\">​</a></h2>\n<p>In Claude Desktop, go to <strong>Settings</strong> -&gt; <strong>Connectors</strong> -&gt; <strong>Add</strong> -&gt; <strong>Browse Connectors</strong> and search for <strong>\"stackql\"</strong>:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"stackql anthropic mcp server directory listing\" src=\"https://stackql.io/assets/images/stackql-mcp-browse-connectors-b71dd6365c48b10d58c5f8da6b09bcba.png\" width=\"1088\" height=\"517\" class=\"img_ev3q\"></p>\n<p>You can also view the listing directly at <a href=\"https://claude.ai/directory/connectors/ant.dir.gh.stackql.stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">claude.ai/directory/stackql</a>.</p>\n<p>Installation is one click.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"stackql anthropic mcp server directory listing\" src=\"https://stackql.io/assets/images/stackql-mcp-install-connector-ee96b611297d647ca7f77346b06d0572.png\" width=\"1088\" height=\"826\" class=\"img_ev3q\"></p>\n<p>The listing is backed by the signed MCPB bundle published with each StackQL MCP release on GitHub, so the version you install from the directory is the same artifact you would get from a GitHub release - reviewed once, then kept current automatically as new releases are published.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-the-stackql-mcp-server-does\">What the StackQL MCP server does<a href=\"https://stackql.io/blog/product/stackql-mcp-anthropic-directory#what-the-stackql-mcp-server-does\" class=\"hash-link\" aria-label=\"Direct link to What the StackQL MCP server does\" title=\"Direct link to What the StackQL MCP server does\" translate=\"no\">​</a></h2>\n<p>The StackQL MCP server exposes cloud and SaaS provider APIs to Claude as data sources accessed via SQL. Claude can discover providers, inspect resource schemas, and run queries against live control planes and data planes - AWS, Google, Azure, GitHub, Databricks, Snowflake, Confluent, Cloudflare, Okta, EntraID and others - using the same grammar across all of them.</p>\n<p>That makes the loop in a Claude conversation look like this: ask a question about your estate, Claude formulates a <code>SELECT</code> against the relevant provider, the query runs against the live API, and the answer reflects reality at the moment you asked - not a cached inventory or a state file. For provisioning and remediation workflows, <code>INSERT</code> and <code>DELETE</code> follow the same pattern.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"more-information\">More Information<a href=\"https://stackql.io/blog/product/stackql-mcp-anthropic-directory#more-information\" class=\"hash-link\" aria-label=\"Direct link to More Information\" title=\"Direct link to More Information\" translate=\"no\">​</a></h2>\n<p>Documentation for the StackQL MCP server is available at <a class=\"\" href=\"https://stackql.io/mcp\">StackQL MCP Tools</a>, <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp\">StackQL MCP Server Usage</a> and <a class=\"\" href=\"https://stackql.io/installing-stackql#installing-the-mcp-server\">StackQL MCP Server Installation</a>.  Credential setup per provider, is available via the <a href=\"https://stackql.io/registry\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>StackQL registry</strong></a>.</p>",
            "url": "https://stackql.io/blog/product/stackql-mcp-anthropic-directory",
            "title": "StackQL MCP server now available in the Anthropic MCP Directory",
            "summary": "The StackQL MCP server is listed in the Anthropic MCP Directory. It is now discoverable and installable directly from Claude Desktop, with future releases flowing through automatically from GitHub.",
            "date_modified": "2026-07-07T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "mcp",
                "anthropic",
                "claude"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/run-the-stackql-mcp-server-anywhere",
            "content_html": "<p>The <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp\"><strong>StackQL MCP server</strong></a> is now available through every runtime an agent is likely to live in: prebuilt Claude Desktop bundles, <a href=\"https://www.npmjs.com/package/@stackql/mcp-server\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>npm</strong></a>, <a href=\"https://pypi.org/project/stackql-mcp-server/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>PyPI</strong></a>, <a href=\"https://hub.docker.com/r/stackql/stackql-mcp\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>Docker</strong></a>, a <a href=\"https://github.com/marketplace/actions/setup-stackql-mcp-server\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub Action</strong></a>, and the <a href=\"https://registry.modelcontextprotocol.io/v0/servers?search=stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>Official MCP Registry</strong></a>. It is the same server in each case - one binary, pulled and launched the way your environment prefers.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-the-stackql-mcp-server-is\">What the StackQL MCP server is<a href=\"https://stackql.io/blog/product/run-the-stackql-mcp-server-anywhere#what-the-stackql-mcp-server-is\" class=\"hash-link\" aria-label=\"Direct link to What the StackQL MCP server is\" title=\"Direct link to What the StackQL MCP server is\" translate=\"no\">​</a></h2>\n<p>StackQL exposes cloud and SaaS providers - AWS, Google Cloud, Azure, GitHub, Kubernetes, Snowflake, Databricks and more - as a single SQL surface. The MCP server puts that surface in front of an AI agent: the agent discovers providers, services, resources and methods, then runs <code>SELECT</code> queries to read state and (when you allow it) <code>INSERT</code> / <code>UPDATE</code> / <code>DELETE</code> to change it. Reads and writes are gated by a <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp#server-modes\">server mode</a> and recorded to an <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp#audit-log\">audit log</a>, so \"what the agent did\" is always answerable.</p>\n<p>For background on the protocol itself, see the original <a class=\"\" href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available\"><strong>StackQL MCP Server Now Available</strong></a> post and the <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp\"><strong>MCP command reference</strong></a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"one-server-every-runtime\">One server, every runtime<a href=\"https://stackql.io/blog/product/run-the-stackql-mcp-server-anywhere#one-server-every-runtime\" class=\"hash-link\" aria-label=\"Direct link to One server, every runtime\" title=\"Direct link to One server, every runtime\" translate=\"no\">​</a></h2>\n<p>Every channel runs the same <code>stackql</code> binary. Pick the one that matches your client:</p>\n<table><thead><tr><th>Channel</th><th>Get it</th><th>Best for</th></tr></thead><tbody><tr><td>Claude Desktop bundle</td><td><code>stackql-mcp-&lt;platform&gt;.mcpb</code> from the <a href=\"https://github.com/stackql/stackql/releases/latest\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">release page</a></td><td>One-click install, no separate StackQL on PATH</td></tr><tr><td>npm</td><td><code>npx -y @stackql/mcp-server</code></td><td>Node environments, no global install</td></tr><tr><td>PyPI</td><td><code>uvx stackql-mcp-server</code> or <code>pip install stackql-mcp-server</code></td><td>Python environments</td></tr><tr><td>Docker</td><td><code>docker run -i --rm stackql/stackql-mcp</code></td><td>Containerised / isolated runtimes (amd64 + arm64)</td></tr><tr><td>GitHub Action</td><td><code>stackql/setup-stackql-mcp@v1</code></td><td>CI and agentic workflows</td></tr><tr><td>MCP Registry</td><td><code>io.github.stackql/stackql-mcp</code></td><td>Directory-driven discovery and install</td></tr></tbody></table>\n<p>A typical stdio client config is three lines. For npx:</p>\n<div class=\"language-json codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"mcpServers\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stackql\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"command\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"npx\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"args\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"-y\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"@stackql/mcp-server\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>Swap <code>npx</code> for <code>uvx stackql-mcp-server</code> or <code>docker run -i --rm stackql/stackql-mcp</code> and you have the Python or Docker form. The npm and PyPI launchers download the signed <code>stackql</code> binary on first run, verify its checksum, and share a single cache. The full matrix - including the manual <code>claude_desktop_config.json</code> form for an existing binary - is in <a class=\"\" href=\"https://stackql.io/installing-stackql#installing-the-mcp-server\"><strong>Installing the MCP server</strong></a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-approvable-mcp-server\">The approvable MCP server<a href=\"https://stackql.io/blog/product/run-the-stackql-mcp-server-anywhere#the-approvable-mcp-server\" class=\"hash-link\" aria-label=\"Direct link to The approvable MCP server\" title=\"Direct link to The approvable MCP server\" translate=\"no\">​</a></h2>\n<p>Letting an agent touch your cloud is a trust decision, so the supply chain is built to be checkable:</p>\n<ul>\n<li class=\"\">The embedded <code>stackql</code> binary is Authenticode-signed (Windows) and Apple-notarised (macOS).</li>\n<li class=\"\">Every <code>.mcpb</code> bundle ships with a published SHA-256 checksum on the release page.</li>\n<li class=\"\">The npm and PyPI launchers verify the downloaded binary's SHA-256 before first use.</li>\n<li class=\"\">The <a href=\"https://registry.modelcontextprotocol.io/v0/servers?search=stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>MCP Registry</strong></a> entry attests the per-platform hashes, so a directory or marketplace can confirm what it is shipping.</li>\n</ul>\n<p>On top of the supply chain, the server defaults to <code>mode: safe</code> - reads run freely, mutations and lifecycle operations need approval through the MCP elicitation flow. Pin <code>read_only</code> for inventory agents that should never write, or <code>full_access</code> for trusted automation. See <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp#server-modes\"><strong>Server modes</strong></a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"a-worked-example-cloud-audit-in-ci\">A worked example: cloud audit in CI<a href=\"https://stackql.io/blog/product/run-the-stackql-mcp-server-anywhere#a-worked-example-cloud-audit-in-ci\" class=\"hash-link\" aria-label=\"Direct link to A worked example: cloud audit in CI\" title=\"Direct link to A worked example: cloud audit in CI\" translate=\"no\">​</a></h2>\n<p>The GitHub Action is where the multi-vector story pays off. <a href=\"https://github.com/marketplace/actions/setup-stackql-mcp-server\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>stackql/setup-stackql-mcp@v1</code></a> installs the binary and writes an MCP config (defaulting to <code>read_only</code>), and <a href=\"https://github.com/anthropics/claude-code-action\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>anthropics/claude-code-action</code></a> consumes it through <code>claude_args</code>. The result is an agent that audits your AWS account on every run and files an issue with the SQL it used as evidence:</p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> stackql</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">uses</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> stackql/setup</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">mcp@v1</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">AWS_ACCESS_KEY_ID</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> $</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> secrets.AWS_ACCESS_KEY_ID </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">AWS_SECRET_ACCESS_KEY</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> $</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> secrets.AWS_SECRET_ACCESS_KEY </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">with</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">mode</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> read_only</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">uses</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> anthropics/claude</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">code</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">action@v1</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">with</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">anthropic_api_key</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> $</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> secrets.ANTHROPIC_API_KEY </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">prompt</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">|</span><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\">      Using the stackql tools, audit our AWS account for: S3 buckets without</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\">      encryption or with public access, security groups open to 0.0.0.0/0 on</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\">      sensitive ports, and IAM users without MFA. Open a GitHub issue</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\">      \"Cloud audit &lt;date&gt;\" summarising findings WITH the SQL you ran as</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\">      evidence. If nothing is found, do not open an issue.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">claude_args</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">|</span><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\">      --mcp-config ${{ steps.stackql.outputs.mcp-config-file }}</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\">      --allowedTools 'mcp__stackql__*'</span><br></div></code></pre></div></div>\n<p>Because the config is pinned to <code>read_only</code>, the audit can read everything and change nothing - the safety contract is enforced by the server, not by trust in the prompt. The <a href=\"https://github.com/stackql/setup-stackql-mcp\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">action README</a> has more recipes, including cost estimates on a pull request and a credential-free GitHub inventory.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-the-agent-actually-sees\">What the agent actually sees<a href=\"https://stackql.io/blog/product/run-the-stackql-mcp-server-anywhere#what-the-agent-actually-sees\" class=\"hash-link\" aria-label=\"Direct link to What the agent actually sees\" title=\"Direct link to What the agent actually sees\" translate=\"no\">​</a></h2>\n<p>Under the hood the agent works the StackQL hierarchy with the same tools whatever the runtime. Pulling the GitHub provider and listing its services looks like this:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">&gt; pull_provider {\"provider\": \"github\"}</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">github provider, version 'v26.05.00393' successfully installed</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">&gt; list_services {\"provider\": \"github\"}</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">actions, activity, apps, billing, checks, code_scanning, codespaces,</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">copilot, dependabot, gists, git, issues, orgs, packages, projects,</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">pulls, repos, search, secret_scanning, teams, users, ...</span><br></div></code></pre></div></div>\n<p>From there the agent can call <code>list_resources</code> and <code>list_methods</code> to discover the required <code>WHERE</code> parameters, then <code>run_select_query</code> to answer a question like \"how many public repositories does the stackql org have?\" - all without anyone hand-writing SQL.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"get-started\">Get started<a href=\"https://stackql.io/blog/product/run-the-stackql-mcp-server-anywhere#get-started\" class=\"hash-link\" aria-label=\"Direct link to Get started\" title=\"Direct link to Get started\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\">Install docs for every channel: <a class=\"\" href=\"https://stackql.io/installing-stackql#installing-the-mcp-server\"><strong>Installing the MCP server</strong></a></li>\n<li class=\"\">Command reference, modes and audit log: <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp\"><strong>stackql mcp</strong></a></li>\n<li class=\"\">Registry entry: <a href=\"https://registry.modelcontextprotocol.io/v0/servers?search=stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>io.github.stackql/stackql-mcp</strong></a></li>\n<li class=\"\">Source and releases: <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>github.com/stackql/stackql</strong></a></li>\n</ul>\n<p>⭐ Star us on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a> and tell us what your agents build.</p>",
            "url": "https://stackql.io/blog/product/run-the-stackql-mcp-server-anywhere",
            "title": "Run the StackQL MCP Server Anywhere Your Agent Does",
            "summary": "The StackQL MCP server now ships via npm, PyPI, Docker, GitHub Actions, prebuilt Claude Desktop bundles, and the Official MCP Registry - one server, every runtime, signed and SHA-pinned.",
            "date_modified": "2026-06-15T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "mcp",
                "model context protocol",
                "ai agents",
                "claude",
                "infrastructure-as-code",
                "ai"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite",
            "content_html": "<p><code>stackql-deploy</code> 2.0 is a full rewrite in Rust. The Python package (<code>stackql-deploy</code> on PyPi) is archived at <code>1.9.4</code>. CLI interface and stack file format are unchanged - no migration required.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-rust\">Why Rust<a href=\"https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite#why-rust\" class=\"hash-link\" aria-label=\"Direct link to Why Rust\" title=\"Direct link to Why Rust\" translate=\"no\">​</a></h2>\n<p>The move to Rust was primarily about distribution and operational simplicity. Rust also brings stronger guarantees around performance and memory safety. Running everything in-process without Foreign Function Interface (FFI) boundaries simplifies the architecture while maintaining predictable resource usage.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"embedded-postgres-wire-protocol-server\">Embedded Postgres Wire Protocol Server<a href=\"https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite#embedded-postgres-wire-protocol-server\" class=\"hash-link\" aria-label=\"Direct link to Embedded Postgres Wire Protocol Server\" title=\"Direct link to Embedded Postgres Wire Protocol Server\" translate=\"no\">​</a></h2>\n<p>The most significant functional change in 2.0 is that <code>stackql-deploy</code> now runs the StackQL engine as an embedded in-process server over a local postgres wire protocol connection rather than shelling out to the StackQL binary as an external process.</p>\n<p>There is nothing to start, stop, or configure. The server is lifecycle-managed by <code>stackql-deploy</code> itself and binds to <code>localhost</code> only - no port is exposed on the network, no inbound firewall rules needed in CI.</p>\n<p>The previous model spawned a new StackQL process per operation. The embedded server keeps a persistent connection for the duration of a deployment run. For stacks with many resources, the reduction in process spawn overhead is noticeable - particularly on Windows where process creation is expensive.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"additional-features-added\">Additional Features Added<a href=\"https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite#additional-features-added\" class=\"hash-link\" aria-label=\"Direct link to Additional Features Added\" title=\"Direct link to Additional Features Added\" translate=\"no\">​</a></h2>\n<p>In addition to added the architectural change to use the embedded server, several other workflow improvements were added including:</p>\n<ul>\n<li class=\"\"><strong>Enabling resource scoped variable exports in <code>/*+ exists */</code> queries</strong>: When an exists query returns a named field (e.g. <code>vpc_id</code>) instead of <code>count</code>, the value is captured as a resource-scoped variable (<code>this.vpc_id</code>) and made available to all subsequent queries for that resource (e.g. statecheck, exports). This eliminates the need for redundant lookups to resolve resource identifiers between query stages.</li>\n<li class=\"\"><strong>Support for capturing <code>RETURNING</code> payloads from DML operations</strong>: <code>INSERT</code>, <code>UPDATE</code>, and <code>DELETE</code> statements can include a <code>RETURNING</code> clause. Fields from the response can be mapped to resource-scoped variables via <code>return_vals</code> in the manifest, keyed by operation (<code>create</code>, <code>update</code>, <code>delete</code>). This allows identifiers assigned by the provider during creation to be used immediately without a round-trip query.</li>\n<li class=\"\"><strong>Additional template filters</strong>: Including the <code>to_aws_tag_filters</code> filter, which converts <code>global_tags</code> to the AWS Resource Groups Tagging API <code>TagFilters</code> format, and type-preserving YAML-to-JSON serialization that maintains string types through the rendering pipeline.</li>\n<li class=\"\"><strong>Improved logging and exception handling</strong>: Enhanced visibility simplifying troubleshooting.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"installation\">Installation<a href=\"https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite#installation\" class=\"hash-link\" aria-label=\"Direct link to Installation\" title=\"Direct link to Installation\" translate=\"no\">​</a></h2>\n<div class=\"theme-tabs-container tabs-container tabList__CuJ\"><ul role=\"tablist\" aria-orientation=\"horizontal\" class=\"tabs\"><li role=\"tab\" tabindex=\"0\" aria-selected=\"true\" class=\"tabs__item tabItem_LNqP tabs__item--active\">Linux / macOS</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_LNqP\">Windows</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_LNqP\">GitHub Releases</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_LNqP\">GitHub Actions</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_LNqP\">Cargo</li></ul><div class=\"margin-top--md\"><div role=\"tabpanel\" class=\"tabItem_Ymn6\"><style data-emotion=\"css 1nv5oh\">.css-1nv5oh{border:1px solid #e0e0e0;border-radius:4px;padding:24px;margin-bottom:16px;}</style><div class=\"MuiBox-root css-1nv5oh\"><p>The canonical install URL detects your OS and redirects to the latest release asset automatically.  You can also download directly from your browser at <a href=\"https://get-stackql-deploy.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>get-stackql-deploy.io</strong></a>.</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">curl -L https://get-stackql-deploy.io | tar xzf -</span><br></div></code></pre></div></div></div></div><div role=\"tabpanel\" class=\"tabItem_Ymn6\" hidden=\"\"><style data-emotion=\"css 1nv5oh\">.css-1nv5oh{border:1px solid #e0e0e0;border-radius:4px;padding:24px;margin-bottom:16px;}</style><div class=\"MuiBox-root css-1nv5oh\"><p>Use the PowerShell script below or download directly from your browser at <a href=\"https://get-stackql-deploy.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>get-stackql-deploy.io</strong></a>.</p><div class=\"language-powershell codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-powershell codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">Invoke-WebRequest</span><span class=\"token plain\"> https:</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">/</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">/</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">get-stackql</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">-</span><span class=\"token plain\">deploy</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">io </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">-</span><span class=\"token plain\">OutFile stackql-deploy</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">zip</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">Expand-Archive</span><span class=\"token plain\"> stackql-deploy</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">zip </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">-</span><span class=\"token plain\">DestinationPath </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><br></div></code></pre></div></div></div></div><div role=\"tabpanel\" class=\"tabItem_Ymn6\" hidden=\"\"><style data-emotion=\"css 1nv5oh\">.css-1nv5oh{border:1px solid #e0e0e0;border-radius:4px;padding:24px;margin-bottom:16px;}</style><div class=\"MuiBox-root css-1nv5oh\"><p>Pre-built binaries are attached to every release on the <a href=\"https://github.com/stackql/stackql-deploy/releases\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">releases page</a>. A <code>SHA256SUMS</code> file is included for verification.</p><table><thead><tr><th>Platform</th><th>Asset</th></tr></thead><tbody><tr><td>Linux x86_64</td><td><code>stackql-deploy-linux-x86_64.tar.gz</code></td></tr><tr><td>Linux arm64</td><td><code>stackql-deploy-linux-arm64.tar.gz</code></td></tr><tr><td>macOS Universal (Apple Silicon + Intel)</td><td><code>stackql-deploy-macos-universal.tar.gz</code></td></tr><tr><td>Windows x86_64</td><td><code>stackql-deploy-windows-x86_64.zip</code></td></tr></tbody></table></div></div><div role=\"tabpanel\" class=\"tabItem_Ymn6\" hidden=\"\"><style data-emotion=\"css 1nv5oh\">.css-1nv5oh{border:1px solid #e0e0e0;border-radius:4px;padding:24px;margin-bottom:16px;}</style><div class=\"MuiBox-root css-1nv5oh\"><p>Use the <a href=\"https://github.com/marketplace/actions/stackql-deploy\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>stackql/stackql-deploy-action</code></a> to run <code>build</code> or <code>test</code> commands in your CI pipeline. Provider credentials are passed via environment variables sourced from GitHub Actions Secrets.</p><p><strong>Deploy a stack:</strong></p><div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">jobs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">deploy</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">runs-on</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> ubuntu</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">latest</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">GOOGLE_CREDENTIALS</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> $</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> secrets.GOOGLE_CREDENTIALS </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">steps</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">uses</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> actions/checkout@v4</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">uses</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> stackql/stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">deploy</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">action@v2</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">with</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'build'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">stack_dir</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'examples/my-stack'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">stack_env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'prod'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">env_vars</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'GOOGLE_PROJECT=my-project'</span><br></div></code></pre></div></div><p><strong>Deploy and capture outputs:</strong></p><div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> Deploy Stack</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">deploy</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">uses</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> stackql/stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">deploy</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">action@v2</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">with</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'build'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">stack_dir</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'examples/my-stack'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">stack_env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'prod'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">output_file</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'deployment-outputs.json'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">env_vars</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'GOOGLE_PROJECT=my-project'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> Use outputs</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">run</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">|</span><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token scalar string\" style=\"color:rgb(173, 219, 103)\">          echo '${{ steps.stackql-deploy.outputs.deployment_outputs }}' | jq .</span><br></div></code></pre></div></div><p>See the <a href=\"https://github.com/stackql/stackql-deploy-action\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>stackql-deploy-action repo</strong></a> or the <a href=\"https://github.com/marketplace/actions/stackql-deploy\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub Action Marketplace</strong></a> for the full input/output reference.</p></div></div><div role=\"tabpanel\" class=\"tabItem_Ymn6\" hidden=\"\"><style data-emotion=\"css 1nv5oh\">.css-1nv5oh{border:1px solid #e0e0e0;border-radius:4px;padding:24px;margin-bottom:16px;}</style><div class=\"MuiBox-root css-1nv5oh\"><p>If you have the Rust toolchain installed (<code>rustup</code> is the recommended way to get it on any platform), <code>cargo install</code> builds and installs the binary directly from <a href=\"https://crates.io/crates/stackql-deploy\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">crates.io</a>.</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">cargo install stackql-deploy</span><br></div></code></pre></div></div></div></div></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"usage\">Usage<a href=\"https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite#usage\" class=\"hash-link\" aria-label=\"Direct link to Usage\" title=\"Direct link to Usage\" translate=\"no\">​</a></h2>\n<p>The CLI interface is unchanged from the Python version:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"># deploy a stack</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy build my-stack prod \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --e GOOGLE_PROJECT=${GOOGLE_PROJECT}</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"># test a stack</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy test my-stack prod \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --e GOOGLE_PROJECT=${GOOGLE_PROJECT}</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"># tear down a stack</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy teardown my-stack prod \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --e GOOGLE_PROJECT=${GOOGLE_PROJECT}</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"># dry run</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy build my-stack prod \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --e GOOGLE_PROJECT=${GOOGLE_PROJECT} \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --dry-run</span><br></div></code></pre></div></div>\n<p>Stack files and <code>stackql_manifest.yml</code> structure are unaffected - no migration work needed.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"python-package-deprecation\">Python Package Deprecation<a href=\"https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite#python-package-deprecation\" class=\"hash-link\" aria-label=\"Direct link to Python Package Deprecation\" title=\"Direct link to Python Package Deprecation\" translate=\"no\">​</a></h2>\n<p><code>stackql-deploy 1.9.4</code> on PyPi is the final Python release. The Python source repository is archived. If you have <code>pip install stackql-deploy</code> in any scripts or CI pipelines, replace it with one of the install methods above. The <code>1.9.4</code> package remains on PyPi and installable, but will not receive updates.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"links\">Links<a href=\"https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite#links\" class=\"hash-link\" aria-label=\"Direct link to Links\" title=\"Direct link to Links\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\">GitHub: <a href=\"https://github.com/stackql/stackql-deploy\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">github.com/stackql/stackql-deploy</a></li>\n<li class=\"\">crates.io: <a href=\"https://crates.io/crates/stackql-deploy\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">crates.io/crates/stackql-deploy</a></li>\n<li class=\"\">StackQL docs: <a class=\"\" href=\"https://stackql.io/\">stackql.io/docs</a></li>\n</ul>",
            "url": "https://stackql.io/blog/product/stackql-deploy-2-0-rust-rewrite",
            "title": "stackql-deploy 2.0 - Rewritten in Rust",
            "summary": "stackql-deploy 2.0 is a full rewrite in Rust - single static binary, no Python runtime, embedded StackQL server, and same CLI interface.",
            "date_modified": "2026-03-19T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "stackql-deploy",
                "rust",
                "infrastructure-as-code"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-joins-linux-foundation-agentic-ai-foundation",
            "content_html": "<a href=\"https://aaif.io/members/\"><img src=\"https://stackql.io/img/aaif_memberbadge_silver.svg\" alt=\"AAIF Member\" style=\"height:90px;margin-right:15px\"></a>\n<a href=\"https://www.linuxfoundation.org/about/members\"><img src=\"https://stackql.io/img/LF_MemberLevel_silver.svg\" alt=\"Linux Foundation Member\" style=\"height:90px\"></a>\n<p>StackQL Studios has joined the Linux Foundation and the Agentic AI Foundation (AAIF) as a Silver Member.</p>\n<p>As agentic AI moves from experimentation toward production workloads, we believe the infrastructure layer matters. Open, interoperable standards will be essential for AI agents to work reliably across cloud providers, data platforms, and enterprise systems.</p>\n<p>StackQL provides a SQL-based interface for querying, provisioning, and managing cloud infrastructure across providers. Our work on the <a href=\"https://github.com/stackql/stackql-ai\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">StackQL MCP Server</a> brings this capability to AI agents through the Model Context Protocol, enabling agents to interact with cloud resources using natural language while maintaining the governance and auditability that production systems require.</p>\n<p>Joining AAIF aligns with our long-standing commitment to open-source infrastructure tooling. We look forward to contributing to the foundation's work on MCP, agent runtimes, and the broader ecosystem of standards that will shape how AI agents interact with the systems they manage.</p>\n<p>More information about the Agentic AI Foundation is available at <a href=\"https://aaif.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">aaif.io</a>.</p>",
            "url": "https://stackql.io/blog/product/stackql-joins-linux-foundation-agentic-ai-foundation",
            "title": "StackQL Joins the Linux Foundation and Agentic AI Foundation",
            "summary": "StackQL Studios joins the Linux Foundation and Agentic AI Foundation as a Silver Member.",
            "date_modified": "2026-01-01T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "open-source",
                "linux-foundation",
                "agentic-ai",
                "mcp"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/window-functions-and-ctes-now-available",
            "content_html": "<p>Window functions and Common Table Expressions (CTEs) are now generally available in StackQL. These features work with both the embedded SQLite backend and PostgreSQL backend.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"window-functions\">Window Functions<a href=\"https://stackql.io/blog/product/window-functions-and-ctes-now-available#window-functions\" class=\"hash-link\" aria-label=\"Direct link to Window Functions\" title=\"Direct link to Window Functions\" translate=\"no\">​</a></h2>\n<p>Window functions allow you to perform calculations across sets of rows related to the current row. Supported functions include:</p>\n<ul>\n<li class=\"\"><strong>Ranking</strong>: <code>ROW_NUMBER()</code>, <code>RANK()</code>, <code>DENSE_RANK()</code>, <code>NTILE()</code></li>\n<li class=\"\"><strong>Offset</strong>: <code>LAG()</code>, <code>LEAD()</code>, <code>FIRST_VALUE()</code>, <code>LAST_VALUE()</code>, <code>NTH_VALUE()</code></li>\n<li class=\"\"><strong>Distribution</strong>: <code>PERCENT_RANK()</code>, <code>CUME_DIST()</code></li>\n<li class=\"\"><strong>Aggregates as window functions</strong>: <code>SUM()</code>, <code>COUNT()</code>, <code>AVG()</code>, etc. with <code>OVER</code> clause</li>\n</ul>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example-ranking-contributors\">Example: Ranking Contributors<a href=\"https://stackql.io/blog/product/window-functions-and-ctes-now-available#example-ranking-contributors\" class=\"hash-link\" aria-label=\"Direct link to Example: Ranking Contributors\" title=\"Direct link to Example: Ranking Contributors\" translate=\"no\">​</a></h3>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    login</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    contributions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    DENSE_RANK</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">OVER</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">ORDER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">BY</span><span class=\"token plain\"> contributions </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">DESC</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> rank</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> github</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">repos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">contributors</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> owner </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> repo </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example-running-totals\">Example: Running Totals<a href=\"https://stackql.io/blog/product/window-functions-and-ctes-now-available#example-running-totals\" class=\"hash-link\" aria-label=\"Direct link to Example: Running Totals\" title=\"Direct link to Example: Running Totals\" translate=\"no\">​</a></h3>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    login</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    contributions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">SUM</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">contributions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">OVER</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">ORDER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">BY</span><span class=\"token plain\"> contributions </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">DESC</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> running_total</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">ROUND</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">100.0</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">*</span><span class=\"token plain\"> contributions </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">/</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">SUM</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">contributions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">OVER</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">2</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> pct_of_total</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> github</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">repos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">contributors</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> owner </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> repo </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"common-table-expressions-ctes\">Common Table Expressions (CTEs)<a href=\"https://stackql.io/blog/product/window-functions-and-ctes-now-available#common-table-expressions-ctes\" class=\"hash-link\" aria-label=\"Direct link to Common Table Expressions (CTEs)\" title=\"Direct link to Common Table Expressions (CTEs)\" translate=\"no\">​</a></h2>\n<p>CTEs let you define temporary named result sets using the <code>WITH</code> clause. This simplifies complex queries by breaking them into logical components.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example-aggregating-across-multiple-resources\">Example: Aggregating Across Multiple Resources<a href=\"https://stackql.io/blog/product/window-functions-and-ctes-now-available#example-aggregating-across-multiple-resources\" class=\"hash-link\" aria-label=\"Direct link to Example: Aggregating Across Multiple Resources\" title=\"Direct link to Example: Aggregating Across Multiple Resources\" translate=\"no\">​</a></h3>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WITH</span><span class=\"token plain\"> all_contributors </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">AS</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"> login</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> contributions</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> github</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">repos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">contributors</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> owner </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> repo </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">UNION</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">ALL</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"> login</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> contributions</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> github</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">repos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">contributors</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> owner </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> repo </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql-deploy'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    DENSE_RANK</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">OVER</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">ORDER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">BY</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">SUM</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">contributions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">DESC</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> rank</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    login</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">SUM</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">contributions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> total_contributions</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> all_contributors</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">GROUP</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">BY</span><span class=\"token plain\"> login</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">ORDER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">BY</span><span class=\"token plain\"> total_contributions </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">DESC</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"documentation\">Documentation<a href=\"https://stackql.io/blog/product/window-functions-and-ctes-now-available#documentation\" class=\"hash-link\" aria-label=\"Direct link to Documentation\" title=\"Direct link to Documentation\" translate=\"no\">​</a></h2>\n<p>Full documentation is available:</p>\n<ul>\n<li class=\"\"><a class=\"\" href=\"https://stackql.io/language-spec/functions/window/row_number\">Window Functions</a></li>\n<li class=\"\"><a class=\"\" href=\"https://stackql.io/language-spec/with\">WITH (CTEs)</a></li>\n<li class=\"\"><a class=\"\" href=\"https://stackql.io/language-spec/select\">SELECT</a></li>\n</ul>\n<p>Let us know your thoughts! Visit us and give us a star on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a>.</p>",
            "url": "https://stackql.io/blog/product/window-functions-and-ctes-now-available",
            "title": "Window Functions and CTEs Now Available in StackQL",
            "summary": "Window functions and Common Table Expressions (CTEs) are now available in StackQL for advanced analytics across cloud and SaaS resources.",
            "date_modified": "2025-12-04T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "analytics",
                "window functions",
                "cte",
                "sql"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-provider-development-skill-for-claude",
            "content_html": "<p>We've published a Claude Skill for <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>StackQL</strong></a> provider development. It provides Claude with the context needed to help you build providers using the <a href=\"https://github.com/stackql/any-sdk\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>any-sdk</strong></a> library (interface used by StackQL to interact with the cloud providers).</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"whats-in-the-skill\">What's in the Skill<a href=\"https://stackql.io/blog/product/stackql-provider-development-skill-for-claude#whats-in-the-skill\" class=\"hash-link\" aria-label=\"Direct link to What's in the Skill\" title=\"Direct link to What's in the Skill\" translate=\"no\">​</a></h2>\n<p>The skill covers the full provider development workflow:</p>\n<ul>\n<li class=\"\"><strong>Provider document structure</strong> - The <code>provider.yaml</code> schema and service document layout</li>\n<li class=\"\"><strong>OpenAPI extensions</strong> - All <code>x-stackQL-*</code> extensions including <code>x-stackQL-resources</code>, <code>x-stackQL-config</code>, <code>x-stackQL-objectKey</code>, and others</li>\n<li class=\"\"><strong>Resource and method definitions</strong> - How to define resources, map methods to operations, and configure responses</li>\n<li class=\"\"><strong>SQL verb mappings</strong> - Connecting REST operations to <code>SELECT</code>, <code>INSERT</code>, <code>UPDATE</code>, and <code>DELETE</code></li>\n<li class=\"\"><strong>Authentication patterns</strong> - API keys, service accounts, OAuth, and custom auth schemes</li>\n<li class=\"\"><strong>Pagination handling</strong> - Request/response token configuration</li>\n<li class=\"\"><strong>Response processing</strong> - JSONPath extraction, transformations, and schema handling</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>What is a Claude Skill?</div><div class=\"admonitionContent_BuS1\"><p>A Claude Skill is a markdown file that provides Claude with specialized knowledge for a particular domain or task. When you add a skill to your project, Claude can reference it during conversations to give more accurate, context-aware responses.</p><p><strong>To use this skill:</strong></p><ol>\n<li class=\"\">Download the skill file (<a href=\"https://github.com/stackql/any-sdk/raw/refs/heads/main/.claude/skills/stackql-provider-development.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>stackql-provider-development.md</strong></a>)</li>\n<li class=\"\">In Claude, go to your Project settings</li>\n<li class=\"\">Add the skill file to your Project Knowledge</li>\n</ol><p>Once added, Claude will automatically apply this knowledge when you're working on StackQL provider development.</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"download\">Download<a href=\"https://stackql.io/blog/product/stackql-provider-development-skill-for-claude#download\" class=\"hash-link\" aria-label=\"Direct link to Download\" title=\"Direct link to Download\" translate=\"no\">​</a></h2>\n<p>Grab the skill from the any-sdk repository:</p>\n<p><strong><a href=\"https://github.com/stackql/any-sdk/raw/refs/heads/main/.claude/skills/stackql-provider-development.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Download stackql-provider-development.md</a></strong></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"usage\">Usage<a href=\"https://stackql.io/blog/product/stackql-provider-development-skill-for-claude#usage\" class=\"hash-link\" aria-label=\"Direct link to Usage\" title=\"Direct link to Usage\" translate=\"no\">​</a></h2>\n<p>With the skill loaded, you can ask Claude things like:</p>\n<ul>\n<li class=\"\"><em>\"Create a provider definition for this API\"</em></li>\n<li class=\"\"><em>\"How do I map this endpoint to a SELECT operation?\"</em></li>\n<li class=\"\"><em>\"What's the correct objectKey syntax for this nested response?\"</em></li>\n<li class=\"\"><em>\"Help me configure pagination for this API\"</em></li>\n</ul>\n<p>Claude will have the full context of StackQL's OpenAPI extensions and provider patterns to work from.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example\">Example<a href=\"https://stackql.io/blog/product/stackql-provider-development-skill-for-claude#example\" class=\"hash-link\" aria-label=\"Direct link to Example\" title=\"Direct link to Example\" translate=\"no\">​</a></h2>\n<p>Here's a sample interaction after loading the skill:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">You: I have an API endpoint GET /users that returns {\"data\": {\"users\": [...]}}. </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">     How do I set up the resource?</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Claude: For that response structure, you'd configure the method like this:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">methods:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  list:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    operation:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      $ref: '#/paths/~1users/get'</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    response:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      mediaType: application/json</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      openAPIDocKey: '200'</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      objectKey: $.data.users</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">The objectKey uses JSONPath to extract the users array from the nested response.</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"resources\">Resources<a href=\"https://stackql.io/blog/product/stackql-provider-development-skill-for-claude#resources\" class=\"hash-link\" aria-label=\"Direct link to Resources\" title=\"Direct link to Resources\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><a href=\"https://github.com/stackql/stackql-provider-registry\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">StackQL Provider Registry</a></li>\n<li class=\"\"><a href=\"https://github.com/stackql/any-sdk\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">any-sdk documentation</a></li>\n<li class=\"\"><a class=\"\" href=\"https://stackql.io/\">StackQL documentation</a></li>\n</ul>\n<p>⭐ Star us on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a></p>",
            "url": "https://stackql.io/blog/product/stackql-provider-development-skill-for-claude",
            "title": "StackQL Provider Development Skill for Claude",
            "summary": "A Claude Skill for developing StackQL providers, covering OpenAPI extensions, resource definitions, SQL verb mappings, and more.",
            "date_modified": "2025-11-28T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "claude",
                "ai",
                "provider development"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/markdownkv-output-format-available-in-pystackql",
            "content_html": "<p><a href=\"https://github.com/stackql/pystackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>pystackql</strong></a> now includes a <code>markdownkv</code> output format optimized for LLM processing of control plane and data plane data from cloud providers.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"background\">Background<a href=\"https://stackql.io/blog/product/markdownkv-output-format-available-in-pystackql#background\" class=\"hash-link\" aria-label=\"Direct link to Background\" title=\"Direct link to Background\" translate=\"no\">​</a></h2>\n<p>Recent research from <a href=\"https://www.improvingagents.com/blog/best-input-data-format-for-llms\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>ImprovingAgents.com</strong></a> tested 11 data formats to determine which ones LLMs parse most accurately. Using 1,000 synthetic employee records and 1,000 randomized queries, they measured how well different formats preserved data integrity through LLM processing.</p>\n<p>The results:</p>\n<table><thead><tr><th>Format</th><th>Accuracy</th><th>95% CI</th></tr></thead><tbody><tr><td>Markdown-KV</td><td>60.7%</td><td>57.6%–63.7%</td></tr><tr><td>JSON</td><td>52.3%</td><td>49.2%–55.4%</td></tr><tr><td>Markdown Tables</td><td>51.9%</td><td>48.8%–55.0%</td></tr><tr><td>JSONL</td><td>45.0%</td><td>41.9%–48.1%</td></tr><tr><td>CSV</td><td>44.3%</td><td>41.2%–47.4%</td></tr></tbody></table>\n<br>\n<br>\n<p>Markdown-KV showed a 37% improvement over CSV and 16 percentage points over JSON. The tradeoff: it uses approximately 2.7x more tokens than CSV.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-is-markdown-kv\">What is Markdown-KV?<a href=\"https://stackql.io/blog/product/markdownkv-output-format-available-in-pystackql#what-is-markdown-kv\" class=\"hash-link\" aria-label=\"Direct link to What is Markdown-KV?\" title=\"Direct link to What is Markdown-KV?\" translate=\"no\">​</a></h2>\n<p>Markdown-KV uses hierarchical markdown headers with code blocks for key-value pairs:</p>\n<div class=\"language-markdown codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-markdown codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token title important punctuation\" style=\"color:rgb(199, 146, 234)\">#</span><span class=\"token title important\"> Query Results</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token title important punctuation\" style=\"color:rgb(199, 146, 234)\">##</span><span class=\"token title important\"> Record 1</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">id: i-1234567890abcdef0</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">name: prod-web-01</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">region: us-east-1</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">instance_type: t3.large</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">state: running</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token title important punctuation\" style=\"color:rgb(199, 146, 234)\">##</span><span class=\"token title important\"> Record 2</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">id: i-0987654321fedcba0</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">name: staging-web-01</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">region: us-west-2</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">instance_type: t3.medium</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">state: stopped</span><br></div></code></pre></div></div>\n<p>The format combines clear hierarchy, explicit key-value pairs, and readability for both humans and LLMs.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"usage\">Usage<a href=\"https://stackql.io/blog/product/markdownkv-output-format-available-in-pystackql#usage\" class=\"hash-link\" aria-label=\"Direct link to Usage\" title=\"Direct link to Usage\" translate=\"no\">​</a></h2>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">from</span><span class=\"token plain\"> pystackql </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">import</span><span class=\"token plain\"> StackQL</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> StackQL</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(99, 119, 119);font-style:italic\"># Query with Markdown-KV output</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">result </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">execute</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">\"\"\"</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">    SELECT instanceId, instanceType, state, availabilityZone </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">    FROM aws.ec2.instances </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">    WHERE region = 'us-east-1'</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">    \"\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    output</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'markdownkv'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(99, 119, 119);font-style:italic\"># Use with LLMs</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">response </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> llm_client</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">complete</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token string-interpolation string\" style=\"color:rgb(173, 219, 103)\">f\"Identify instances that should be stopped:\\n\\n</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token string-interpolation interpolation\">result</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token string-interpolation string\" style=\"color:rgb(173, 219, 103)\">\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>Works in server mode too:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> StackQL</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">server_mode</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">True</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">result </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">execute</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"SELECT name, region, encryption FROM google.storage.buckets WHERE project = 'my-project'\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    output</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'markdownkv'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-to-use-it\">When to Use It<a href=\"https://stackql.io/blog/product/markdownkv-output-format-available-in-pystackql#when-to-use-it\" class=\"hash-link\" aria-label=\"Direct link to When to Use It\" title=\"Direct link to When to Use It\" translate=\"no\">​</a></h2>\n<p>Markdown-KV is useful when:</p>\n<ul>\n<li class=\"\">Feeding infrastructure data to LLMs for analysis, security reviews, or recommendations</li>\n<li class=\"\">Building RAG pipelines that need to accurately retrieve and reason about infrastructure</li>\n<li class=\"\">Accuracy matters more than token efficiency (infrastructure decisions typically do)</li>\n<li class=\"\">Query results are focused datasets (most StackQL queries are)</li>\n</ul>\n<p>The token cost is a real tradeoff, but infrastructure queries typically return targeted result sets, not massive datasets. When you're asking an LLM to analyze your production environment, accuracy matters.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"getting-started\">Getting Started<a href=\"https://stackql.io/blog/product/markdownkv-output-format-available-in-pystackql#getting-started\" class=\"hash-link\" aria-label=\"Direct link to Getting Started\" title=\"Direct link to Getting Started\" translate=\"no\">​</a></h2>\n<p>Update <code>pystackql</code>:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">pip install --upgrade pystackql</span><br></div></code></pre></div></div>\n<p>Add <code>output='markdownkv'</code> to your execute calls or in the <code>StackQL</code> object instantiation:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">result </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">execute</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">query</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> output</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'markdownkv'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"resources\">Resources<a href=\"https://stackql.io/blog/product/markdownkv-output-format-available-in-pystackql#resources\" class=\"hash-link\" aria-label=\"Direct link to Resources\" title=\"Direct link to Resources\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><a href=\"https://www.improvingagents.com/blog/best-input-data-format-for-llms\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ImprovingAgents.com research on LLM data formats</a></li>\n<li class=\"\"><a href=\"https://github.com/stackql/pystackql/releases/tag/v3.8.2\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">pystackql v3.8.2 changelog</a></li>\n<li class=\"\"><a href=\"https://github.com/stackql/pystackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">pystackql documentation</a></li>\n<li class=\"\"><a class=\"\" href=\"https://stackql.io/\">StackQL documentation</a></li>\n</ul>\n<p>The Markdown-KV output format is available in <code>pystackql</code> v3.8.2 and later.</p>\n<p>⭐ Star us on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a> and join our community!</p>",
            "url": "https://stackql.io/blog/product/markdownkv-output-format-available-in-pystackql",
            "title": "Markdown-KV Output Format Available in pystackql",
            "summary": "New output format in pystackql optimizes cloud infrastructure data for LLM processing based on research showing accuracy improvement over CSV.",
            "date_modified": "2025-11-10T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "pystackql",
                "llm",
                "ai",
                "infrastructure-as-code"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-mcp-server-now-available",
            "content_html": "<p><a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>StackQL</strong></a> now supports the <a href=\"https://modelcontextprotocol.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>Model Context Protocol (MCP)</strong></a>. This integration enables AI agents and assistants to query and manage cloud infrastructure across multiple providers using natural language.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-is-the-model-context-protocol\">What is the Model Context Protocol?<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#what-is-the-model-context-protocol\" class=\"hash-link\" aria-label=\"Direct link to What is the Model Context Protocol?\" title=\"Direct link to What is the Model Context Protocol?\" translate=\"no\">​</a></h2>\n<p>The Model Context Protocol is an open standard that enables AI applications to securely connect to external data sources and tools. By running StackQL as an MCP server, AI agents like Claude, ChatGPT, and other LLM-based assistants can interact with your cloud infrastructure using StackQL's powerful SQL-based query capabilities.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-mcp--stackql\">Why MCP + StackQL?<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#why-mcp--stackql\" class=\"hash-link\" aria-label=\"Direct link to Why MCP + StackQL?\" title=\"Direct link to Why MCP + StackQL?\" translate=\"no\">​</a></h2>\n<p>Combining MCP with StackQL creates a powerful interface for AI-assisted infrastructure management:</p>\n<ul>\n<li class=\"\"><strong>Natural Language Infrastructure Queries</strong>: Ask questions about your cloud resources in plain English and get structured data back</li>\n<li class=\"\"><strong>Multi-Cloud Support</strong>: Access resources across AWS, Google Cloud, Azure, and 100+ other providers through a single interface</li>\n<li class=\"\"><strong>Secure and Standardized</strong>: MCP provides a secure, standardized way for AI agents to interact with your infrastructure</li>\n<li class=\"\"><strong>SQL-Powered Analytics</strong>: Leverage StackQL's full SQL capabilities including joins, aggregations, and complex queries through AI agents</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"deployment-options\">Deployment Options<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#deployment-options\" class=\"hash-link\" aria-label=\"Direct link to Deployment Options\" title=\"Direct link to Deployment Options\" translate=\"no\">​</a></h2>\n<p>StackQL's MCP server supports three flexible deployment modes to suit different architectural requirements:</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"1-standalone-mcp-server\">1. Standalone MCP Server<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#1-standalone-mcp-server\" class=\"hash-link\" aria-label=\"Direct link to 1. Standalone MCP Server\" title=\"Direct link to 1. Standalone MCP Server\" translate=\"no\">​</a></h3>\n<p>Perfect for development and AI agent integration:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql mcp \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.server.type=http \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.config '{\"server\": {\"transport\": \"http\", \"address\": \"127.0.0.1:9912\"}}'</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"2-dual-protocol-server-in-memory\">2. Dual-Protocol Server (In-Memory)<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#2-dual-protocol-server-in-memory\" class=\"hash-link\" aria-label=\"Direct link to 2. Dual-Protocol Server (In-Memory)\" title=\"Direct link to 2. Dual-Protocol Server (In-Memory)\" translate=\"no\">​</a></h3>\n<p>Run both MCP and PostgreSQL wire protocol simultaneously with high-performance in-memory communication:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql srv \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.server.type=http \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.config '{\"server\": {\"transport\": \"http\", \"address\": \"127.0.0.1:9912\"}}' \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --pgsrv.port 5665</span><br></div></code></pre></div></div>\n<p>This mode is ideal when you need both AI agent access and traditional database client connectivity.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"3-reverse-proxy-with-tls\">3. Reverse Proxy with TLS<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#3-reverse-proxy-with-tls\" class=\"hash-link\" aria-label=\"Direct link to 3. Reverse Proxy with TLS\" title=\"Direct link to 3. Reverse Proxy with TLS\" translate=\"no\">​</a></h3>\n<p>For production environments requiring distributed deployments and encrypted connections:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql srv \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.server.type=reverse_proxy \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.config '{\"server\": {\"tls_cert_file\": \"/path/to/cert.pem\", \"tls_key_file\": \"/path/to/key.pem\", \"transport\": \"http\", \"address\": \"127.0.0.1:9004\"}, \"backend\": {\"dsn\": \"postgres://stackql:stackql@127.0.0.1:5446?default_query_exec_mode=simple_protocol\"}}' \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --pgsrv.port 5446</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"available-mcp-tools\">Available MCP Tools<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#available-mcp-tools\" class=\"hash-link\" aria-label=\"Direct link to Available MCP Tools\" title=\"Direct link to Available MCP Tools\" translate=\"no\">​</a></h2>\n<p>When running as an MCP server, StackQL exposes several tools that AI agents can invoke:</p>\n<table><thead><tr><th>Tool</th><th>Description</th></tr></thead><tbody><tr><td><code>greet</code></td><td>Test connectivity with the MCP server</td></tr><tr><td><code>list_providers</code></td><td>List all available StackQL providers</td></tr><tr><td><code>list_services</code></td><td>List services for a specific provider</td></tr><tr><td><code>list_resources</code></td><td>List resources within a provider service</td></tr><tr><td><code>list_methods</code></td><td>List available methods for a resource</td></tr><tr><td><code>query_v2</code></td><td>Execute StackQL queries</td></tr></tbody></table>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"integration-with-claude-desktop\">Integration with Claude Desktop<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#integration-with-claude-desktop\" class=\"hash-link\" aria-label=\"Direct link to Integration with Claude Desktop\" title=\"Direct link to Integration with Claude Desktop\" translate=\"no\">​</a></h2>\n<p>To integrate StackQL with Claude Desktop, add this configuration to your MCP settings file (<code>~/Library/Application Support/Claude/claude_desktop_config.json</code> on macOS):</p>\n<div class=\"language-json codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"mcpServers\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"stackql\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"command\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"stackql\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token property\" style=\"color:rgb(128, 203, 196)\">\"args\"</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"mcp\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"--mcp.server.type=http\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"--mcp.config\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"{\\\"server\\\": {\\\"transport\\\": \\\"http\\\", \\\"address\\\": \\\"127.0.0.1:9912\\\"}}\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example-use-cases\">Example Use Cases<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#example-use-cases\" class=\"hash-link\" aria-label=\"Direct link to Example Use Cases\" title=\"Direct link to Example Use Cases\" translate=\"no\">​</a></h2>\n<p>Once configured, you can ask your AI assistant questions like:</p>\n<ul>\n<li class=\"\">\"Show me all my EC2 instances across all AWS regions\"</li>\n<li class=\"\">\"List all Google Cloud Storage buckets with public access\"</li>\n<li class=\"\">\"Find all Azure virtual machines that haven't been updated in 30 days\"</li>\n<li class=\"\">\"Compare compute costs across AWS, Azure, and GCP\"</li>\n<li class=\"\">\"Show me IAM policies that grant admin access in my Google Cloud projects\"</li>\n</ul>\n<p>The AI agent will use StackQL's MCP server to execute the appropriate queries and return structured results.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example-query-flow\">Example Query Flow<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#example-query-flow\" class=\"hash-link\" aria-label=\"Direct link to Example Query Flow\" title=\"Direct link to Example Query Flow\" translate=\"no\">​</a></h2>\n<p>Here's how an AI agent interacts with StackQL via MCP:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"># AI agent lists available providers</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Tool: list_providers</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Response: [\"google\", \"aws\", \"azure\", \"github\", ...]</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"># AI agent explores a provider's services</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Tool: list_services</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Args: {\"provider\": \"google\"}</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Response: [\"compute\", \"storage\", \"cloudresourcemanager\", ...]</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"># AI agent executes a query</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Tool: query_v2</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Args: {\"sql\": \"SELECT name, status FROM google.compute.instances WHERE project = 'my-project' AND zone = 'us-east1-a'\"}</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">Response: [{\"name\": \"instance-1\", \"status\": \"RUNNING\"}, ...]</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"getting-started\">Getting Started<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#getting-started\" class=\"hash-link\" aria-label=\"Direct link to Getting Started\" title=\"Direct link to Getting Started\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"\">\n<p><strong>Download StackQL</strong> version 0.9.250 or later from <a class=\"\" href=\"https://stackql.io/install\">stackql.io/install</a></p>\n</li>\n<li class=\"\">\n<p><strong>Set up provider authentication</strong>:</p>\n</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">export GOOGLE_CREDENTIALS=$(cat /path/to/credentials.json)</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">export AWS_ACCESS_KEY_ID=your-access-key</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">export AWS_SECRET_ACCESS_KEY=your-secret-key</span><br></div></code></pre></div></div>\n<ol start=\"3\">\n<li class=\"\"><strong>Start the MCP server</strong>:</li>\n</ol>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql mcp \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.server.type=http \\</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  --mcp.config '{\"server\": {\"transport\": \"http\", \"address\": \"127.0.0.1:9912\"}}'</span><br></div></code></pre></div></div>\n<ol start=\"4\">\n<li class=\"\"><strong>Configure your AI assistant</strong> to use the StackQL MCP server (see <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp\">MCP documentation</a> for details)</li>\n</ol>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"documentation\">Documentation<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#documentation\" class=\"hash-link\" aria-label=\"Direct link to Documentation\" title=\"Direct link to Documentation\" translate=\"no\">​</a></h2>\n<p>For comprehensive documentation on configuring and using the MCP server, including:</p>\n<ul>\n<li class=\"\">Detailed configuration options</li>\n<li class=\"\">TLS/mTLS setup</li>\n<li class=\"\">Architecture considerations</li>\n<li class=\"\">Testing and troubleshooting</li>\n</ul>\n<p>Visit the <a class=\"\" href=\"https://stackql.io/command-line-usage/mcp\">MCP command documentation</a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"whats-next\">What's Next?<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#whats-next\" class=\"hash-link\" aria-label=\"Direct link to What's Next?\" title=\"Direct link to What's Next?\" translate=\"no\">​</a></h2>\n<p>We're actively developing additional MCP capabilities and welcome your feedback. Future enhancements may include:</p>\n<ul>\n<li class=\"\">Enhanced resource provisioning and lifecycle management through MCP</li>\n<li class=\"\">Built-in prompt templates for common infrastructure queries</li>\n<li class=\"\">Extended tool catalog for specialized operations</li>\n<li class=\"\">Support for additional MCP transport protocols</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"try-it-out\">Try It Out!<a href=\"https://stackql.io/blog/product/stackql-mcp-server-now-available#try-it-out\" class=\"hash-link\" aria-label=\"Direct link to Try It Out!\" title=\"Direct link to Try It Out!\" translate=\"no\">​</a></h2>\n<p>The MCP server feature is available now in StackQL 0.9.250. We'd love to hear about your experiences integrating StackQL with AI agents. Share your use cases, provide feedback, or contribute to the project on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">GitHub</a>.</p>\n<p>⭐ Star us on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">GitHub</a> and join our community!</p>",
            "url": "https://stackql.io/blog/product/stackql-mcp-server-now-available",
            "title": "StackQL MCP Server Now Available",
            "summary": "Enable AI agents to query and manage cloud infrastructure using the Model Context Protocol.",
            "date_modified": "2025-11-02T00:00:00.000Z",
            "author": {
                "name": "Kieran Rimmer",
                "url": "https://www.linkedin.com/in/kieranrimmer/"
            },
            "tags": [
                "stackql",
                "mcp",
                "model context protocol",
                "ai agents",
                "claude",
                "infrastructure-as-code",
                "ai"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-deploy-docs-site-live",
            "content_html": "<p>The <a href=\"https://stackql-deploy.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql-deploy</code></strong></a> docs site is now available, offering a comprehensive guide to using <code>stackql-deploy</code> for your cloud resource deployments and tests. The site includes detailed documentation, examples, and best practices to help you get started quickly and effectively.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_BuS1\"><p><strong><code>stackql-deploy</code></strong> is a declarative, stateless (and <strong><em>state file-less</em></strong>) infrastructure-as-code and test framework, driven by <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql</code></strong></a> queries.  <code>stackql-deploy</code> is capable of provisioning, updating, de-provisioning and testing cloud and SaaS stacks across all cloud and SaaS providers.</p></div></div>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"stackql-deploy-github-actions-screenshot\" src=\"https://stackql.io/assets/images/stackql-deploy-github-actions-screenshot-e8012484620647fb48c612fed13c1400.png\" width=\"1290\" height=\"752\" class=\"img_ev3q\"></p>\n<p>Let us know what you think! ⭐ us on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a>.</p>",
            "url": "https://stackql.io/blog/product/stackql-deploy-docs-site-live",
            "title": "stackql-deploy Docs Site Live",
            "summary": "Use stackql-deploy to deploy and test cloud resource deployments.",
            "date_modified": "2024-08-24T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "devops",
                "infrastructure",
                "github actions",
                "cloud security",
                "CI/CD",
                "iac",
                "infrastructure-as-code",
                "dbt"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/linux-arm64-build-available",
            "content_html": "<p>StackQL is now available for ARM64-based Linux systems.  To download the ARM64 binary, please visit our <a class=\"\" href=\"https://stackql.io/install\"><strong>downloads page</strong></a>, where you can find the appropriate version for your system.</p>\n<p>Let us know what you think! ⭐ us on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a>.</p>",
            "url": "https://stackql.io/blog/product/linux-arm64-build-available",
            "title": "Linux arm64 StackQL Binary Available",
            "summary": "ARM64 architecture build available for StackQL.",
            "date_modified": "2024-08-20T00:00:00.000Z",
            "author": {
                "name": "Kieran Rimmer",
                "url": "https://www.linkedin.com/in/kieranrimmer/"
            },
            "tags": [
                "stackql",
                "linux",
                "arm",
                "arm64",
                "devops",
                "infrastructure",
                "cloud security",
                "CI/CD",
                "iac",
                "infrastructure-as-code"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-deploy-github-action-available",
            "content_html": "<p><a href=\"https://pypi.org/project/stackql-deploy/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql-deploy</code></strong></a> is now available in the <a href=\"https://github.com/marketplace/actions/stackql-deploy\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub Actions Marketplace</strong></a>.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_BuS1\"><p><strong><code>stackql-deploy</code></strong> is a declarative, stateless (and <strong><em>state file-less</em></strong>) infrastructure-as-code and test framework, driven by <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql</code></strong></a> queries.  <code>stackql-deploy</code> is capable of provisioning, updating, de-provisioning and testing cloud and SaaS stacks across all cloud and SaaS providers.</p></div></div>\n<p>Given this <a href=\"https://github.com/stackql/stackql-deploy-action/tree/main/examples/k8s-the-hard-way\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">example</a> <code>stackql-deploy</code> stack definition in a GitHub repo, you would simply add the following to your GitHub Actions workflow:</p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">...</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">jobs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">stackql-actions-test</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> StackQL Actions Test</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">runs-on</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> ubuntu</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">latest</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">GOOGLE_CREDENTIALS</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> $</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> secrets.GOOGLE_CREDENTIALS </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">steps</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> Checkout</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">uses</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> actions/checkout@v4</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> Deploy a Stack</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">uses</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> stackql/setup</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">deploy@v1.0.1</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">with</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> build</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">stack-dir</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> examples/k8s</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">the</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">hard</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">way</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">stack-env</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> dev</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">env-vars</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> GOOGLE_PROJECT=stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">k8s</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">the</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">hard</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">way</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\">demo</span><br></div></code></pre></div></div>\n<p>Example output is shown here:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"stackql-deploy-github-actions-screenshot\" src=\"https://stackql.io/assets/images/stackql-deploy-github-actions-screenshot-e8012484620647fb48c612fed13c1400.png\" width=\"1290\" height=\"752\" class=\"img_ev3q\"></p>\n<p>Let us know what you think! ⭐ us on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a>.</p>",
            "url": "https://stackql.io/blog/product/stackql-deploy-github-action-available",
            "title": "GitHub Action available for stackql-deploy",
            "summary": "Use stackql-deploy in a GitHub Actions workflow to provision, update and test infrastructure.",
            "date_modified": "2024-08-10T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "devops",
                "infrastructure",
                "github actions",
                "cloud security",
                "CI/CD",
                "iac",
                "infrastructure-as-code",
                "dbt"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/introducing-model-driven-iac-with-stackql-deploy",
            "content_html": "<p><a href=\"https://pypi.org/project/stackql-deploy/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql-deploy</code></strong></a> is a multi-cloud resource provisioning framework using <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql</code></strong></a>. It is inspired by dbt (data build tool), which manages data transformation workflows in analytics engineering by treating SQL scripts as models that can be built, tested, and materialized incrementally. With StackQL, you can create a similar framework for cloud and SaaS provisioning. The goal is to treat infrastructure-as-code (IaC) queries as <strong><em>models</em></strong> that can be deployed, managed, and interconnected.</p>\n<p>This ELT/model-based framework for IaC allows you to provision, test, update, and tear down multi-cloud stacks, similar to how dbt manages data transformation projects, with the benefits of version control, peer review, and automation. This approach enables you to deploy complex, dependent infrastructure components in a reliable and repeatable manner.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"features\">Features<a href=\"https://stackql.io/blog/product/introducing-model-driven-iac-with-stackql-deploy#features\" class=\"hash-link\" aria-label=\"Direct link to Features\" title=\"Direct link to Features\" translate=\"no\">​</a></h2>\n<p>StackQL simplifies the interaction with cloud resources by using SQL-like syntax, making it easier to define and execute complex cloud management operations. Resources are provisioned with <a class=\"\" href=\"https://stackql.io/language-spec/insert\"><strong><code>INSERT</code></strong></a> statements, and tests are structured around <a class=\"\" href=\"https://stackql.io/language-spec/select\"><strong><code>SELECT</code></strong></a> statements.</p>\n<p>Features include:</p>\n<ul>\n<li class=\"\">Dynamic state determination (eliminating the need for state files)</li>\n<li class=\"\">Pre-flight and post-deploy assurance tests for resources</li>\n<li class=\"\">Simple flow control with rollback capabilities</li>\n<li class=\"\">Single code base for multiple target environments</li>\n<li class=\"\">SQL-based definitions for resources and tests</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"installing-stackql-deploy\">Installing <code>stackql-deploy</code><a href=\"https://stackql.io/blog/product/introducing-model-driven-iac-with-stackql-deploy#installing-stackql-deploy\" class=\"hash-link\" aria-label=\"Direct link to installing-stackql-deploy\" title=\"Direct link to installing-stackql-deploy\" translate=\"no\">​</a></h2>\n<p>To get started with <code>stackql-deploy</code>, run the following:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">pip install stackql-deploy</span><br></div></code></pre></div></div>\n<p><code>stackql-deploy</code> will automatically download the latest release of <code>stackql</code> using the <a href=\"https://pypi.org/project/pystackql/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>pystackql</code></a> Python package. You can then use the <strong><code>info</code></strong> command to get runtime information:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">$ stackql-deploy info</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy version: 1.1.0</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">pystackql version     : 3.6.1</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql version       : v0.5.612</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql binary path   : /home/javen/.local/stackql</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">platform              : Linux x86_64 (Linux-5.15.133.1-microsoft-standard-WSL2-x86_64-with-glibc2.35), Python 3.10.12</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"project-structure\">Project structure<a href=\"https://stackql.io/blog/product/introducing-model-driven-iac-with-stackql-deploy#project-structure\" class=\"hash-link\" aria-label=\"Direct link to Project structure\" title=\"Direct link to Project structure\" translate=\"no\">​</a></h2>\n<p>A <code>stackql-deploy</code> project is a directory with declarative SQL definitions to provision, de-provision, or test resources in a stack. The key components and their definitions are listed here:</p>\n<ul>\n<li class=\"\"><code>stackql_manifest.yml</code> : The manifest file for your project, defining resources and properties in your stack.</li>\n<li class=\"\"><code>stackql_resources</code> directory : Contains StackQL queries to provision and de-provision resources in your stack.</li>\n<li class=\"\"><code>stackql_tests</code> directory : Contains StackQL queries to test the desired state for resources in your stack.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"getting-started\">Getting started<a href=\"https://stackql.io/blog/product/introducing-model-driven-iac-with-stackql-deploy#getting-started\" class=\"hash-link\" aria-label=\"Direct link to Getting started\" title=\"Direct link to Getting started\" translate=\"no\">​</a></h2>\n<p>Use the <strong><code>init</code></strong> command to create a starter project directory:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy init activity_monitor</span><br></div></code></pre></div></div>\n<p>You will now have a directory named <code>activity_monitor</code> with <code>stackql_resources</code> and <code>stackql_tests</code> directories and a sample <code>stackql_manifest.yml</code> file, which will help you to get started.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"usage\">Usage<a href=\"https://stackql.io/blog/product/introducing-model-driven-iac-with-stackql-deploy#usage\" class=\"hash-link\" aria-label=\"Direct link to Usage\" title=\"Direct link to Usage\" translate=\"no\">​</a></h2>\n<p>The general syntax for <code>stackql-deploy</code> is described here:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy [OPTIONS] COMMAND [ARGS]...</span><br></div></code></pre></div></div>\n<p>Commands include:</p>\n<ul>\n<li class=\"\"><code>build</code>: Create or update resources based on the defined stack.</li>\n<li class=\"\"><code>teardown</code>: Remove or decommission resources that were previously deployed.</li>\n<li class=\"\"><code>test</code>: Execute test queries to verify the current state of resources against the expected state.</li>\n<li class=\"\"><code>info</code>: Display the version information of the <code>stackql-deploy</code> tool and current configuration settings.</li>\n<li class=\"\"><code>init</code>: Initialize a new project structure for StackQL deployments.</li>\n</ul>\n<p>Optional global options (for all commands) include:</p>\n<ul>\n<li class=\"\"><code>--custom-registry TEXT</code>: Specify a custom registry URL for StackQL. This URL will be used by all commands for registry interactions.</li>\n<li class=\"\"><code>--download-dir TEXT</code>: Define a download directory for StackQL where all files will be stored.</li>\n<li class=\"\"><code>--help</code>: Show the help message and exit.</li>\n</ul>\n<p>Options for <code>build</code>, <code>test</code>, and <code>teardown</code> include:</p>\n<ul>\n<li class=\"\"><code>--on-failure [rollback|ignore|error]</code>: Define the action to be taken if the operation fails. Options include rollback, ignore, or treat as an error.</li>\n<li class=\"\"><code>--dry-run</code>: Perform a simulation of the operation without making any actual changes.</li>\n<li class=\"\"><code>-e &lt;TEXT TEXT&gt;...</code>: Specify additional environment variables in key-value pairs.</li>\n<li class=\"\"><code>--env-file TEXT</code>: Path to a file containing environment variables.</li>\n<li class=\"\"><code>--log-level [DEBUG|INFO|WARNING|ERROR|CRITICAL]</code>: Set the logging level to control the verbosity of logs during execution.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example\">Example<a href=\"https://stackql.io/blog/product/introducing-model-driven-iac-with-stackql-deploy#example\" class=\"hash-link\" aria-label=\"Direct link to Example\" title=\"Direct link to Example\" translate=\"no\">​</a></h2>\n<p>Using the <code>activity_monitor</code> stack we created previously using the <code>init</code> command, we can start defining a stack and defining the associated queries; here is the manifest file:</p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">version</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> activity_monitor</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">description</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> oss activity monitor stack</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">providers</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> azure</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">globals</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> subscription_id</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">description</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> azure subscription id</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"{{ vars.AZURE_SUBSCRIPTION_ID }}\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> location</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> eastus</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> resource_group_name_base</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"activity-monitor\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">resources</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> monitor_resource_group</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">description</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> azure resource group for activity monitor</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> resource_group_name</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">description</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> azure resource group name</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:rgb(255, 203, 139)\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"{{ globals.resource_group_name_base }}-{{ globals.stack_env }}\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">\t</span><span class=\"token comment\" style=\"color:rgb(99, 119, 119);font-style:italic\"># more resources would go here...</span><br></div></code></pre></div></div>\n<blockquote>\n<p><code>globals.stack_env</code> is a variable referencing the user-specified environment label.</p>\n</blockquote>\n<p>Our <code>stackql_resources</code> directory must contain a <code>.iql</code> file (StackQL query file) with the same name as each <code>resource</code> defined in the <code>resources</code> key in the manifest file. Here is an example for <code>stackql_resources/monitor_resource_group.iql</code>:</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token comment\" style=\"color:rgb(99, 119, 119);font-style:italic\">/*+ createorupdate */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">INSERT</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">INTO</span><span class=\"token plain\"> azure</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">resource</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">resource_groups</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  resource_group_name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  subscription_id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  data__location</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ resource_group_name }}'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ subscription_id }}'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ location }}'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(99, 119, 119);font-style:italic\">/*+ delete */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">DELETE</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> azure</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">resource</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">resource_groups </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> resource_group_name </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ resource_group_name }}'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> subscription_id </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ subscription_id }}'</span><br></div></code></pre></div></div>\n<p>Similarly, our <code>stackql_tests</code> directory must contain a <code>.iql</code> file (StackQL query file) with the same name as each <code>resource</code> defined in the stack. Here is an example for <code>stackql_tests/monitor_resource_group.iql</code>:</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token comment\" style=\"color:rgb(99, 119, 119);font-style:italic\">/*+ preflight */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">COUNT</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">*</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> count </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> azure</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">resource</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">resource_groups</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> subscription_id </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ subscription_id }}'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> resource_group_name </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ resource_group_name }}'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(99, 119, 119);font-style:italic\">/*+ postdeploy, retries=2, retry_delay=2 */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">COUNT</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">*</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> count </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> azure</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">resource</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">resource_groups</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> subscription_id </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ subscription_id }}'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> resource_group_name </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ resource_group_name }}'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> location </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'{{ location }}'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> JSON_EXTRACT</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">properties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'$.provisioningState'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'Succeeded'</span><br></div></code></pre></div></div>\n<p>Now we can <strong><code>build</code></strong>, <strong><code>test</code></strong>, and <strong><code>teardown</code></strong> our example stack using these commands (starting with a <strong><code>dry-run</code></strong>, which will render the target queries without executing them):</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"># stackql-deploy build|test|teardown {stack_name} {stack_env} [{options}]</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy build example_stack prd -e AZURE_SUBSCRIPTION_ID 00000000-0000-0000-0000-000000000000 --dry-run</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy build example_stack prd -e AZURE_SUBSCRIPTION_ID 00000000-0000-0000-0000-000000000000</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy test example_stack prd -e AZURE_SUBSCRIPTION_ID 00000000-0000-0000-0000-000000000000</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql-deploy teardown example_stack prd -e AZURE_SUBSCRIPTION_ID 00000000-0000-0000-0000-000000000000</span><br></div></code></pre></div></div>\n<p>Give us your feedback! ⭐ us <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>here</strong></a>!</p>",
            "url": "https://stackql.io/blog/product/introducing-model-driven-iac-with-stackql-deploy",
            "title": "Introducing model-driven IaC with stackql-deploy",
            "summary": "Inventory all resources across all regions in an AWS account.",
            "date_modified": "2024-04-21T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "iac",
                "infrastructure-as-code",
                "dbt"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/builtin-parallel-query-execution-in-stackql",
            "content_html": "<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_BuS1\"><p><a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql</code></strong></a> is a dev tool that allows you to query and manage cloud and SaaS resources using SQL, which developers and analysts can use for CSPM, assurance, user access management reporting, IaC, XOps and more.</p></div></div>\n<p>An exciting new feature to cap off 2023! Parallel query execution in StackQL.  With the latest release of StackQL, parameters in <code>WHERE IN</code> clauses are fetched asyncronously.</p>\n<p>This query for example, queries lambda functions across <span style=\"color:red;font-weight:bold\">17 AWS regions in under 1.5 sec</span>, technically these are 17 parallel queries to 17 different endpoints.</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"> region</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> function_name</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> aws</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">lambda</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">functions</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> region </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">IN</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'us-east-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'us-east-2'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'us-west-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'us-west-2'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'ap-south-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'ap-northeast-3'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'ap-northeast-2'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'ap-southeast-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'ap-southeast-2'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'ap-northeast-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'ca-central-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'eu-central-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'eu-west-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'eu-west-2'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'eu-west-3'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'eu-north-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'sa-east-1'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>You could do something similar for other hyperscalars, for example querying resources across projects in GCP asynchronously, or querying across resource groups in Azure asynchronously.</p>\n<p>This capability was previously available using the <a href=\"https://pystackql.readthedocs.io/en/latest/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>pystackql</code></strong></a> package, as discussed in the <a class=\"\" href=\"https://stackql.io/blog/tutorials/query-resources-across-aws-regions-asynchronously\"><strong>Query Resources Across AWS Regions Asynchronously</strong></a> blog post, but is now available natively in the StackQL query optimizer.</p>\n<p>You just need to add <strong><code>--execution.concurrency.limit=-1</code></strong> to your <a class=\"\" href=\"https://stackql.io/command-line-usage/exec\"><strong><code>stackql exec</code></strong></a> or <a class=\"\" href=\"https://stackql.io/command-line-usage/shell\"><strong><code>stackql shell</code></strong></a> commands or when starting a StackQL Server using <a class=\"\" href=\"https://stackql.io/command-line-usage/srv\"><strong><code>stackql srv</code></strong></a>.  More query optimizations coming!  Happy New Year! 🎉 🎉 🎉</p>\n<p>Let us know your thoughts! Visit us and give us a ⭐ on <a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>GitHub</strong></a></p>",
            "url": "https://stackql.io/blog/product/builtin-parallel-query-execution-in-stackql",
            "title": "Builtin Parallel Query Execution in StackQL",
            "summary": "stackql is a dev tool that allows you to query and manage cloud and SaaS resources using SQL, which developers and analysts can use for CSPM, assurance, user access management reporting, IaC, XOps and more.",
            "date_modified": "2023-12-30T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "inventory",
                "cpsm",
                "analytics"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/introducing-materialized-views-with-stackql",
            "content_html": "<p>Materialized Views are now available in StackQL.  Materialized Views can be used to improve performance for dependent or repetetive queries within StackQL provisioning or analytics routines.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"refresher-on-materialized-views\">Refresher on Materialized Views<a href=\"https://stackql.io/blog/product/introducing-materialized-views-with-stackql#refresher-on-materialized-views\" class=\"hash-link\" aria-label=\"Direct link to Refresher on Materialized Views\" title=\"Direct link to Refresher on Materialized Views\" translate=\"no\">​</a></h2>\n<p>Unlike standard views that provide a virtual representation of data, a Materialized View physically stores the result set of a query. This implies that the data is pre-computed and stored, which can lead to performance gains as the data doesn't need to be fetched from the underlying resource(s) every time it is queried.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"benefits-of-materialized-views-in-stackql\">Benefits of Materialized Views in StackQL<a href=\"https://stackql.io/blog/product/introducing-materialized-views-with-stackql#benefits-of-materialized-views-in-stackql\" class=\"hash-link\" aria-label=\"Direct link to Benefits of Materialized Views in StackQL\" title=\"Direct link to Benefits of Materialized Views in StackQL\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"\">\n<p><strong>Performance Boost</strong>: With data already stored and readily available, Materialized Views can substantially reduce StackQL query execution time, especially for complex and frequently-run queries.</p>\n</li>\n<li class=\"\">\n<p><strong>Data Consistency</strong>: Since Materialized Views provide a snapshot of the data at a specific point in time, it ensures consistent data is returned every time it is accessed until it is refreshed.</p>\n</li>\n<li class=\"\">\n<p><strong>Flexibility</strong>: You have the flexibility to refresh the Materialized View as needed usign the <code>REFRESH MATERIALIZED VIEW</code> lifecycle operation in StackQL. This is particularly useful when working with rapidly changing data.</p>\n</li>\n</ol>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"using-materialized-views-in-stackql\">Using Materialized Views in StackQL<a href=\"https://stackql.io/blog/product/introducing-materialized-views-with-stackql#using-materialized-views-in-stackql\" class=\"hash-link\" aria-label=\"Direct link to Using Materialized Views in StackQL\" title=\"Direct link to Using Materialized Views in StackQL\" translate=\"no\">​</a></h2>\n<p>Here's a step-by-step guide on how you to use this new feature in StackQL:</p>\n<ol>\n<li class=\"\"><strong>Create a Materialized View</strong>:</li>\n</ol>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">CREATE</span><span class=\"token plain\"> MATERIALIZED </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">VIEW</span><span class=\"token plain\"> vw_ec2_instance_types </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">AS</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> memoryInfo</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> hypervisor</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> autoRecoverySupported</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> instanceType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> SPLIT_PART</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">processorInfo</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'\\n'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">3</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> processorArch</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> currentGeneration</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> freeTierEligible</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> hibernationSupported</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> SPLIT_PART</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">vCpuInfo</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'\\n'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">2</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> vCPUs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> bareMetal</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> burstablePerformanceSupported</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> dedicatedHostsSupported </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> aws</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">ec2</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">instance_types </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> region </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'us-east-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<ol start=\"2\">\n<li class=\"\"><strong>Refresh the Materialized View</strong>:</li>\n</ol>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">REFRESH MATERIALIZED </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">VIEW</span><span class=\"token plain\"> vw_ec2_instance_types</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<ol start=\"3\">\n<li class=\"\"><strong>Use the Materialized View in a StackQL Query</strong>:</li>\n</ol>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">SELECT</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">instanceId</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">instanceType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> it</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">vCPUs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> it</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">memoryInfo </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">FROM</span><span class=\"token plain\"> aws</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">ec2</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">instances i </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">INNER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">JOIN</span><span class=\"token plain\"> vw_ec2_instance_types it </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">ON</span><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">instanceType </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> it</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">instanceType </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">region </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'us-east-1'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<ol start=\"3\">\n<li class=\"\"><strong>Drop the Materialized View</strong>:</li>\n</ol>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">DROP</span><span class=\"token plain\"> MATERIALIZED </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">VIEW</span><span class=\"token plain\"> vw_ec2_instance_types</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>More information on Materialized Views in StackQL can be found <a class=\"\" href=\"https://stackql.io/language-spec/createview\">here</a>.</p>",
            "url": "https://stackql.io/blog/product/introducing-materialized-views-with-stackql",
            "title": "Introducing Materialized Views with StackQL",
            "summary": "Materialized Views are now available in StackQL.  Materialized Views can be used to improve performance for dependent or repetetive queries within StackQL provisioning or analytics routines.",
            "date_modified": "2023-09-29T00:00:00.000Z",
            "author": {
                "name": "Kieran Rimmer",
                "url": "https://www.linkedin.com/in/kieranrimmer/"
            },
            "tags": [
                "stackql",
                "analytics"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/introducing-table-valued-functions-in-stackql",
            "content_html": "<p>Many provider query responses include columns which are arrays, the iam policy related resources in google are a classic example of this.  for example, this query:</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">select</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">*</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">from</span><span class=\"token plain\"> google</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">cloudresourcemanager</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">projects_iam_policies </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">where</span><span class=\"token plain\"> projectsId </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>produces..</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|                               </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| condition | members                                                                                                                                                                                    | role         |                               </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|                               </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| null      | [\"serviceAccount:1234567890-compute@developer.gserviceaccount.com\",\"serviceAccount:1234567890@cloudservices.gserviceaccount.com\",\"serviceAccount:stackql@appspot.gserviceaccount.com\"] | roles/editor |                               </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|                               </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| null      | [\"serviceAccount:1234567890-compute@developer.gserviceaccount.com\",\"serviceAccount:1234567890@cloudservices.gserviceaccount.com\",\"serviceAccount:stackql@appspot.gserviceaccount.com\"] | roles/editor |                               </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|                               </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| null      | [\"serviceAccount:1234567890-compute@developer.gserviceaccount.com\",\"serviceAccount:1234567890@cloudservices.gserviceaccount.com\",\"serviceAccount:stackql@appspot.gserviceaccount.com\"] | roles/editor |                               </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|                               </span><br></div></code></pre></div></div>\n<p>What you want to do is unnest each member in members for each role binding (and condition if applicable)</p>\n<p>Enter the table valued function <a class=\"\" href=\"https://stackql.io/language-spec/functions/json/json_each\"><strong><code>json_each</code></strong></a>.</p>\n<p>The <a class=\"\" href=\"https://stackql.io/language-spec/functions/json/json_each\"><strong><code>json_each</code></strong></a> function accepts a field (optionally with a json path expression) and returns a table object with fields that can be projected in your result set, for example (querying the same underlying resource as above), this...</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">select</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">iam</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">role</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">SPLIT_PART</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">json_each</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">':'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> member_type</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">SPLIT_PART</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">json_each</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">':'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">2</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> member </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">from</span><span class=\"token plain\"> google</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">cloudresourcemanager</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">projects_iam_policies iam</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> json_each</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">members</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">where</span><span class=\"token plain\"> projectsId </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>now provides something much more useful from an analytic perspective:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|                 role                 |  member_type   |                                   member                                    |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/appengine.serviceAgent         | serviceAccount | service-1234567890@gcp-gae-service.iam.gserviceaccount.com                |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/cloudbuild.builds.builder      | serviceAccount | 1234567890@cloudbuild.gserviceaccount.com                                 |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/cloudbuild.serviceAgent        | serviceAccount | service-1234567890@gcp-sa-cloudbuild.iam.gserviceaccount.com              |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/compute.serviceAgent           | serviceAccount | service-1234567890@compute-system.iam.gserviceaccount.com                 |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/container.serviceAgent         | serviceAccount | service-1234567890@container-engine-robot.iam.gserviceaccount.com         |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/containerregistry.ServiceAgent | serviceAccount | service-1234567890@containerregistry.iam.gserviceaccount.com              |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/dataflow.serviceAgent          | serviceAccount | service-1234567890@dataflow-service-producer-prod.iam.gserviceaccount.com |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/dataproc.serviceAgent          | serviceAccount | service-1234567890@dataproc-accounts.iam.gserviceaccount.com              |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/editor                         | serviceAccount | 1234567890-compute@developer.gserviceaccount.com                          |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/editor                         | serviceAccount | 1234567890@cloudservices.gserviceaccount.com                              |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/editor                         | serviceAccount | stackql@appspot.gserviceaccount.com                                         |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/firebaserules.system           | serviceAccount | service-1234567890@firebase-rules.iam.gserviceaccount.com                 |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/firestore.serviceAgent         | serviceAccount | service-1234567890@gcp-sa-firestore.iam.gserviceaccount.com               |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/owner                          | serviceAccount | stackql-provisioner@stackql.iam.gserviceaccount.com                         |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/owner                          | serviceAccount | t1-804@stackql.iam.gserviceaccount.com                                      |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/owner                          | user           | javen@stackql.io                                                            |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/owner                          | user           | krimmer@stackql.io                                                          |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/pubsub.serviceAgent            | serviceAccount | service-1234567890@gcp-sa-pubsub.iam.gserviceaccount.com                  |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| roles/viewer                         | serviceAccount | testing-admin@stackql.iam.gserviceaccount.com                               |                                                                                    </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|--------------------------------------|----------------|-----------------------------------------------------------------------------|</span><br></div></code></pre></div></div>\n<p><code>__json_each__</code>is available from  version 0.5.418 or stackql onwards, this function can also be used in StackQL GitHub Actions such as <a href=\"https://github.com/marketplace/actions/stackql-exec\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql-exec</code></strong></a> or <a href=\"https://github.com/marketplace/actions/stackql-assert\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql-assert</code></strong></a> and in Python and Pandas using <a href=\"https://pystackql.readthedocs.io/en/latest/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>pystackql</code></strong></a>.</p>",
            "url": "https://stackql.io/blog/product/introducing-table-valued-functions-in-stackql",
            "title": "Introducing Table Valued Functions in StackQL",
            "summary": "Many provider query responses include columns which are arrays, the iam policy related resources in google are a classic example of this.  for example, this query:",
            "date_modified": "2023-09-07T00:00:00.000Z",
            "author": {
                "name": "Kieran Rimmer",
                "url": "https://www.linkedin.com/in/kieranrimmer/"
            },
            "tags": [
                "stackql",
                "analytics"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/support-for-outer-joins-released",
            "content_html": "<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_BuS1\"><p><a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql</code></strong></a> is a dev tool that allows you to query, manage, and perform analytics against cloud and SaaS resources in real time using SQL, which developers and analysts can use for CSPM, assurance, user access management reporting, IaC, XOps and more.</p></div></div>\n<p>We are pleased to announce the addition of support for <code>OUTER JOIN</code> operations in StackQL queries.  This is a significant addition to the language, and we are excited to see what our users will do with it!</p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_BuS1\"><p>An <code>OUTER JOIN</code> is a type of <code>JOIN</code> operation that returns all records from one table (or StackQL resource) and only those records from a second table or resource where the joined fields are equal (i.e. the <code>JOIN</code> condition is met).  If there is no match, the missing side of the <code>JOIN</code> is filled with <code>NULL</code> values.</p><p><code>OUTER JOIN</code> operations are important because they allow you to combine data from two or more resources (within a StackQL provider or across StackQL providers), even when there is no match between the two resources.  This is a common scenario when performing analytics and reporting on user access management (for example between an IdP (like Okta) and a resource provider like AWS or Google).</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"using-outer-join-operations-in-stackql\">Using <code>OUTER JOIN</code> operations in StackQL<a href=\"https://stackql.io/blog/product/support-for-outer-joins-released#using-outer-join-operations-in-stackql\" class=\"hash-link\" aria-label=\"Direct link to using-outer-join-operations-in-stackql\" title=\"Direct link to using-outer-join-operations-in-stackql\" translate=\"no\">​</a></h2>\n<p>If you wanted to find all users in your AWS account that have not logged in to their account in the last 20 days, and compare that to the same information for users in your Google Workspace account, you could use an <code>OUTER JOIN</code> operation to do this.  The following query:</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">select</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">   aws_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">UserName </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> aws_user_name</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\">aws_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">PasswordLastUsed </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> aws_last_Login_time</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">CASE</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHEN</span><span class=\"token plain\"> aws_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">PasswordLastUsed </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">''</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">then</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'false'</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHEN</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"> strftime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'%Y-%m-%d %H:%M:%SZ'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> aws_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">PasswordLastUsed</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">datetime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'now'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'-20 days'</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">then</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'true'</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">else</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'false'</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">end</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> aws_is_active</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\">json_extract</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">google_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'$.fullName'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> google_user_name</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\">google_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">lastLoginTime </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> google_last_Login_time </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">CASE</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHEN</span><span class=\"token plain\"> google_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">lastLoginTime </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">is</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">null</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">then</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'false'</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHEN</span><span class=\"token plain\"> google_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">lastLoginTime </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">''</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">then</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'false'</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHEN</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"> strftime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'%Y-%m-%d %H:%M:%SZ'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> google_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">lastLoginTime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">datetime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'now'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'-20 days'</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">then</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'true'</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">else</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'false'</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">end</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> google_is_active</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">from</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  aws</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">iam</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">users aws_users </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">LEFT</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">OUTER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">JOIN</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  googleadmin</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">directory</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">users google_users </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">ON</span><span class=\"token plain\"> lower</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">substr</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">aws_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">UserName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">5</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> lower</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">substr</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">json_extract</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">google_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'$.fullName'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">5</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">WHERE</span><span class=\"token plain\"> aws_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">region </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'us-east-1'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">AND</span><span class=\"token plain\"> google_users</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">domain </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">'stackql.io'</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>would produce a result like this:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|------------------------|----------------------|---------------|------------------|--------------------------|------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|     aws_user_name      | aws_last_Login_time  | aws_is_active | google_user_name |  google_last_Login_time  | google_is_active |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|------------------------|----------------------|---------------|------------------|--------------------------|------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| demo-stackql-cicd-user | null                 | false         | null             | null                     | false            |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|------------------------|----------------------|---------------|------------------|--------------------------|------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| github_actions         | null                 | false         | null             | null                     | false            |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|------------------------|----------------------|---------------|------------------|--------------------------|------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| jeffrey.aven           | 2023-06-30T04:29:14Z | true          | null             | null                     | false            |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|------------------------|----------------------|---------------|------------------|--------------------------|------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| kieran.rimmer          | 2023-06-03T08:40:49Z | false         | Kieran Rimmer    | 2023-06-23T06:01:46.000Z | true             |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|------------------------|----------------------|---------------|------------------|--------------------------|------------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| ...                    | ...                  | ...           | ...              | ...                      | ...              |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|------------------------|----------------------|---------------|------------------|--------------------------|------------------|</span><br></div></code></pre></div></div>\n<p>Currently only <code>LEFT OUTER JOIN</code> sppport is available, but we will be adding support for <code>RIGHT OUTER JOIN</code> and <code>FULL OUTER JOIN</code> in the near future.  Stay tuned!</p>",
            "url": "https://stackql.io/blog/product/support-for-outer-joins-released",
            "title": "Support for Outer Joins Released for StackQL",
            "summary": "Announcing the addition of support for OUTER JOIN operations in StackQL queries.",
            "date_modified": "2023-07-03T00:00:00.000Z",
            "author": {
                "name": "Kieran Rimmer",
                "url": "https://www.linkedin.com/in/kieranrimmer/"
            },
            "tags": [
                "stackql",
                "analytics",
                "reporting",
                "dashboards",
                "cloud security",
                "cspm"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-pypi-package-available",
            "content_html": "<details class=\"details_lb9f alert alert--info details_b_Ee\" data-collapsed=\"true\"><summary>What is StackQL?</summary><div><div class=\"collapsibleContent_i85q\"><div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_BuS1\"><p><a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql</code></strong></a> is a dev tool that allows you to query and manage cloud and SaaS resources using SQL, which developers and analysts can use for CSPM, assurance, user access management reporting, IaC, XOps and more.</p></div></div></div></div></details>\n<p><a href=\"https://github.com/stackql/pystackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>pystackql</code></a> is now available in <a href=\"https://pypi.org/project/pystackql/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">PyPI</a>, and documentation for the package is available at <a href=\"https://pystackql.readthedocs.io/en/latest/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>Read the Docs</strong></a>.  <code>pystackql</code> can be used with <code>pandas</code>, <code>matplotlib</code>, <code>plotly</code>, <code>jupyter</code> and more to run queries and visualize results.</p>\n<p>The latest version of stackql for any platform can be installed using:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">pip install pystackql</span><br></div></code></pre></div></div>\n<p>here is a complete example...</p>\n<p><a href=\"https://stackql.io/assets/files/pystackql-081e3bd0624a56ab046a8d2db418dd1f.gif\" target=\"_blank\" class=\"\"><img decoding=\"async\" loading=\"lazy\" alt=\"pystackql usage\" src=\"https://stackql.io/assets/images/pystackql-081e3bd0624a56ab046a8d2db418dd1f.gif\" width=\"1200\" height=\"600\" class=\"img_ev3q\"></a></p>\n<details class=\"details_lb9f alert alert--info details_b_Ee\" data-collapsed=\"true\"><summary>the code used in this example is available here</summary><div><div class=\"collapsibleContent_i85q\"><div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">from</span><span class=\"token plain\"> pystackql </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">import</span><span class=\"token plain\"> StackQL</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">import</span><span class=\"token plain\"> pandas </span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">as</span><span class=\"token plain\"> pd</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">provider_auth </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"aws\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"credentialsenvvar\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"AWS_SECRET_ACCESS_KEY\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"keyIDenvvar\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"AWS_ACCESS_KEY_ID\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"type\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"aws_signing_v4\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">regions </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"ap-southeast-2\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(173, 219, 103)\">\"us-east-1\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">stackql </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> StackQL</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">auth</span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\">provider_auth</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">query </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">\"\"\"</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">SELECT '%s' as region, instanceType, COUNT(*) as num_instances</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">FROM aws.ec2.instances</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">WHERE region = '%s'</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">GROUP BY instanceType</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">UNION</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">SELECT  '%s' as region, instanceType, COUNT(*) as num_instances</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">FROM aws.ec2.instances</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">WHERE region = '%s'</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">GROUP BY instanceType</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token triple-quoted-string string\" style=\"color:rgb(173, 219, 103)\">\"\"\"</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">%</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">regions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> regions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> regions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> regions</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">res </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> stackql</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">execute</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">query</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">df </span><span class=\"token operator\" style=\"color:rgb(127, 219, 202)\">=</span><span class=\"token plain\"> pd</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">read_json</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">res</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:rgb(127, 219, 202)\">print</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">df</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div></code></pre></div></div><p>which returns a <code>pandas</code> DataFrame like the following:</p><div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  instanceType  num_instances          region</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">0    t2.medium              2  ap-southeast-2</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">1     t2.micro              7  ap-southeast-2</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">2     t2.small              4  ap-southeast-2</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">3     t2.micro              6       us-east-1</span><br></div></code></pre></div></div></div></div></details>\n<blockquote>\n<p>Source code for <code>pystackql</code> can be found at <a href=\"https://github.com/stackql/pystackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql/pystackql</code></strong></a></p>\n</blockquote>\n<p>Let us know what you think!</p>",
            "url": "https://stackql.io/blog/product/stackql-pypi-package-available",
            "title": "StackQL PyPI Package is Now Available",
            "summary": "This how-to article demonstrates how to use stackql with Python using the pystackql package",
            "date_modified": "2023-02-23T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "python"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/setup-stackql-github-action",
            "content_html": "<details class=\"details_lb9f alert alert--info details_b_Ee\" data-collapsed=\"true\"><summary>What is StackQL?</summary><div><div class=\"collapsibleContent_i85q\"><div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_BuS1\"><p><a href=\"https://github.com/stackql/stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql</code></strong></a> is a dev tool that allows you to query and manage cloud and SaaS resources using SQL, which developers and analysts can use for CSPM, assurance, user access management reporting, IaC, XOps and more.</p></div></div></div></div></details>\n<p>The <code>setup-stackql</code> action is now available in the <a href=\"https://github.com/marketplace/actions/stackql-studio-setup-stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">GitHub Marketplace</a>.  <code>setup-stackql</code> downloads and installs the latest <code>stackql</code> binary in your Actions runner.  Different runner operating systems are fully tested and supported, including <code>ubuntu-latest</code>, <code>windows-latest</code> and <code>darwin-latest</code>.</p>\n<p>Embedding <code>stackql</code> in an actions workflow can be done for assurance, compliance, and provisioning.  An example workflow is shown here:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">name: 'Setup StackQL Example'</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">on:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  pull_request:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">defaults:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  run:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    shell: bash</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">jobs:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">  stackql-test-matrix:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    name: Stackql local run on ubuntu-latest with wrapper</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    runs-on: 'ubuntu-latest'</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    steps:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    - name: Checkout</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      uses: actions/checkout@v3</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    - name: Setup Stackql</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      uses: ./</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      with:</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        use_wrapper: true</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    - name: Validate Stackql Version</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      run: |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        stackql --version</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    - name: Prep Google Creds (bash)</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      run: | ## use the secret to create json file</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        sudo echo ${{ secrets.GOOGLE_CREDS }} | base64 -d &gt; sa-key.json</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">    - name: Use Google Provider</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">      run: | </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        stackql exec \"SELECT name, status</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        FROM google.compute.instances </span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">        WHERE project = 'stackql-demo' AND zone = 'australia-southeast1-a';\" --auth='{ \"google\": { \"type\": \"service_account\",  \"credentialsfilepath\": \"sa-key.json\" }}'</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div></code></pre></div></div>\n<p>the log outputs showing...</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#d6deeb;--prism-background-color:#011627\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#d6deeb;background-color:#011627\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------------------------------------------------|------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|                        name                         |   status   |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------------------------------------------------|------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| stackql-demo-001                                    | TERMINATED |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------------------------------------------------|------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| stackql-demo-002                                    | RUNNING    |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------------------------------------------------|------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| stackql-demo-003                                    | RUNNING    |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------------------------------------------------|------------|</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">| stackql-demo-004                                    | RUNNING    |</span><br></div><div class=\"token-line\" style=\"color:#d6deeb\"><span class=\"token plain\">|-----------------------------------------------------|------------|</span><br></div></code></pre></div></div>\n<blockquote>\n<p>additional output types available through the <code>--output</code> argument include <code>json</code> and <code>csv</code></p>\n</blockquote>\n<p>Source code for the action can be found at <a href=\"https://github.com/stackql/setup-stackql\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong><code>stackql/setup-stackql</code></strong></a></p>\n<p>much more to come, stay tuned!</p>",
            "url": "https://stackql.io/blog/product/setup-stackql-github-action",
            "title": "Using the setup-stackql Github Action",
            "summary": "This is a how-to article demonstrating the use of setup-stackql github action to run stackql with github actions",
            "date_modified": "2023-02-05T00:00:00.000Z",
            "author": {
                "name": "Yuncheng Yang",
                "url": "https://www.linkedin.com/in/yuncheng-fabio-yang/"
            },
            "tags": [
                "stackql",
                "devops",
                "infrastructure",
                "github actions",
                "cloud security",
                "CI/CD"
            ]
        },
        {
            "id": "https://stackql.io/blog/product/stackql-middleware-and-playground-available",
            "content_html": "<p>Proud to announce the release of the first version of our middleware server and playground for StackQL.</p>\n<blockquote>\n<p>StackQL allows you to query and interact with cloud services and APIs using SQL grammar and an ORM which is a direct reflection of a provider API, no database is required or implemented</p>\n</blockquote>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"stackql-middleware-server\">StackQL Middleware Server<a href=\"https://stackql.io/blog/product/stackql-middleware-and-playground-available#stackql-middleware-server\" class=\"hash-link\" aria-label=\"Direct link to StackQL Middleware Server\" title=\"Direct link to StackQL Middleware Server\" translate=\"no\">​</a></h2>\n<p>Our <a href=\"https://github.com/stackql/stackql-middleware\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>middleware solution</strong></a> allows you to use StackQL as a query language to interact with APIs, much like GraphQL - however, the query DSL is SQL, providing a friendlier, more data-centric experience for developers.  As shown in the example below, developers can <code>POST</code> queries to a <code>/stackql</code> endpoint; the queries are parsed and executed by a StackQL runner via the middleware server.</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/IQ5UdKDsizQ\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"></iframe>\n<p>As the StackQL middleware API server and runner are stateless, the solution is horizontally scalable.  With cache and authorization to be implemented, the solution provides a flexible, robust, scalable, performant back end for applications.</p>\n<p>Furthermore, using SQL semantics, developers can JOIN data between API providers and perform projections, filtering, aggregation, windowing operations, and more on simple or complex data types.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"stackql-playground\">StackQL Playground<a href=\"https://stackql.io/blog/product/stackql-middleware-and-playground-available#stackql-playground\" class=\"hash-link\" aria-label=\"Direct link to StackQL Playground\" title=\"Direct link to StackQL Playground\" translate=\"no\">​</a></h2>\n<p>The <a href=\"https://github.com/stackql/stackql-playground\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>StackQL Playground</strong></a> is a TypeScript app that connects to a StackQL Middleware Server, which provides access to backend APIs using SQL.  Features of the playground include...</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"explore-api-providers\">Explore API Providers<a href=\"https://stackql.io/blog/product/stackql-middleware-and-playground-available#explore-api-providers\" class=\"hash-link\" aria-label=\"Direct link to Explore API Providers\" title=\"Direct link to Explore API Providers\" translate=\"no\">​</a></h3>\n<p>The StackQL Playground allows you to explore and query providers, services, resources, fields, and methods.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"submit-queries\">Submit Queries<a href=\"https://stackql.io/blog/product/stackql-middleware-and-playground-available#submit-queries\" class=\"hash-link\" aria-label=\"Direct link to Submit Queries\" title=\"Direct link to Submit Queries\" translate=\"no\">​</a></h3>\n<p>Using the Playground you can submit queries to the <code>/stackql</code> endpoint of the StackQL Middleware Server.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"view-sort-and-filter-results\">View, Sort, and Filter Results<a href=\"https://stackql.io/blog/product/stackql-middleware-and-playground-available#view-sort-and-filter-results\" class=\"hash-link\" aria-label=\"Direct link to View, Sort, and Filter Results\" title=\"Direct link to View, Sort, and Filter Results\" translate=\"no\">​</a></h3>\n<p>Query results can be sorted or filtered in the grid result set in the StackQL Playground app, JSON results can also be viewed or copied from the JSON results tab.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"save-results-as-csv-or-json\">Save Results as CSV or JSON<a href=\"https://stackql.io/blog/product/stackql-middleware-and-playground-available#save-results-as-csv-or-json\" class=\"hash-link\" aria-label=\"Direct link to Save Results as CSV or JSON\" title=\"Direct link to Save Results as CSV or JSON\" translate=\"no\">​</a></h3>\n<p>Users can save results to local <code>CSV</code> or <code>JSON</code> files as well.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"generate-types\">Generate Types<a href=\"https://stackql.io/blog/product/stackql-middleware-and-playground-available#generate-types\" class=\"hash-link\" aria-label=\"Direct link to Generate Types\" title=\"Direct link to Generate Types\" translate=\"no\">​</a></h3>\n<p>Furthermore, after modeling a query you can export the TypeScript types using the <strong>Get Types</strong> button.</p>\n<p>Huge thanks to <a href=\"https://github.com/FabioYyc\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><strong>Yuncheng Yang</strong></a> for the work he put in on this!</p>\n<p>You can find the complete code <a href=\"https://github.com/stackql/stackql-middleware/blob/main/demo.sh\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here</a> to launch an environment using <code>docker-compose</code>, which includes the StackQL Middleware Server, a StackQL runner (runs the queries on the back end), and the StackQL Playground app.</p>\n<p>Let us know what you think.</p>",
            "url": "https://stackql.io/blog/product/stackql-middleware-and-playground-available",
            "title": "StackQL Middleware and Playground Available",
            "summary": "The StackQL Middleware Server along with the StackQL Playground App allow users to explore and query resources from API providers using SQL.",
            "date_modified": "2022-11-13T00:00:00.000Z",
            "author": {
                "name": "Jeffrey Aven",
                "url": "https://www.linkedin.com/in/jeffreyaven/"
            },
            "tags": [
                "stackql",
                "stackql middleware",
                "stackql playground",
                "middleware",
                "stackql provider registry",
                "multicloud",
                "asset management",
                "cloud security"
            ]
        }
    ]
}