<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://stackql.io/blog</id>
    <title>StackQL Blog Feed</title>
    <updated>2026-08-03T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://stackql.io/blog"/>
    <subtitle>Cloud operations, security and automation using SQL</subtitle>
    <icon>https://stackql.io/favicon.ico</icon>
    <rights>Copyright © 2026 StackQL Studios</rights>
    <entry>
        <title type="html"><![CDATA[New Google Gemini Provider Available]]></title>
        <id>https://stackql.io/blog/new-gemini-provider-available</id>
        <link href="https://stackql.io/blog/new-gemini-provider-available"/>
        <updated>2026-08-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A new StackQL provider for the Google Gemini API - run Gemini inference, count tokens, generate embeddings, and manage models, tuned models, files, cached contents, corpora, file search stores and batches using SQL - available in the StackQL Provider Registry now.]]></summary>
        <content type="html"><![CDATA[<p>We've released a new StackQL provider for the Google Gemini API:</p>
<ul>
<li class=""><a href="https://gemini-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>gemini</code></strong></a> - the Generative Language API surface (<code>generativelanguage.googleapis.com</code>): inference (content generation, embeddings, token counting, batches) plus the API's own management surface - models, tuned models and permissions, files, cached contents, corpora, file search stores and long-running operations (10 services, 32 resources, 75 operations)</li>
</ul>
<p>Everything reachable with a <code>GEMINI_API_KEY</code> ships in one provider. Authentication is handled automatically, <code>LIMIT</code> is pushed down to the wire, and paginated lists are walked for you.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="inference-as-a-result-set">Inference as a result set<a href="https://stackql.io/blog/new-gemini-provider-available#inference-as-a-result-set" class="hash-link" aria-label="Direct link to Inference as a result set" title="Direct link to Inference as a result set" translate="no">​</a></h2>
<p>Asking Gemini a question is a <code>SELECT</code>. The reply comes back as a row, with the text in the <code>candidates</code> array and the token spend in <code>usageMetadata</code>:</p>
<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">  JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">candidates</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)">'$[0].content.parts[0].text'</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"> reply</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">  JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">usageMetadata</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)">'$.totalTokenCount'</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_tokens</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"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">models</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">content</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"> modelsId </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)">'gemini-2.5-flash'</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"> contents </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)">'[{"parts":[{"text":"Name the four Galilean moons of Jupiter, comma separated."}]}]'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Token counting works the same way via <code>gemini.models.token_counts</code> - free of charge, so a prompt can be priced before it is sent. Embeddings come back as rows too:</p>
<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"> JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">embedding</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)">'$.values[0]'</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"> first_dimension</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"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">models</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">embeddings</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"> modelsId </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)">'gemini-embedding-001'</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"> content </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)">'{"parts":[{"text":"stackql lets you query cloud APIs with SQL"}]}'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-model-can-do-what">Which model can do what<a href="https://stackql.io/blog/new-gemini-provider-available#which-model-can-do-what" class="hash-link" aria-label="Direct link to Which model can do what" title="Direct link to Which model can do what" translate="no">​</a></h2>
<p>The provider ships a convenience view that fans each model's supported generation methods and limits out into flat columns:</p>
<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"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> display_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> input_token_limit</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> thinking</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> supports_generate_content</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"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">models</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">vw_model_capabilities</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"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>One row per model with token limits, default sampling parameters, and boolean flags for content generation, token counting, embedding, batching and caching support - useful for picking a model programmatically instead of reading release notes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-management-surface-as-sql">The management surface as SQL<a href="https://stackql.io/blog/new-gemini-provider-available#the-management-surface-as-sql" class="hash-link" aria-label="Direct link to The management surface as SQL" title="Direct link to The management surface as SQL" translate="no">​</a></h2>
<p>Files, cached contents, corpora, file search stores and tuned models are managed with the corresponding SQL verbs:</p>
<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">-- create</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"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">corpora</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">corpora </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">displayName</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><span class="token string" style="color:rgb(173, 219, 103)">'my-knowledge-base'</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)">RETURNING</span><span class="token plain"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> displayName</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">-- read</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"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> displayName</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> mimeType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> sizeBytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> state</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"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">files</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">files</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">-- update</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)">UPDATE</span><span class="token plain"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cached_contents</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cached_contents</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)">SET</span><span class="token plain"> ttl </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)">'600s'</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"> cachedContentsId </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)">'my-cache-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" 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"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cached_contents</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cached_contents</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"> cachedContentsId </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)">'my-cache-id'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Batches are long-running operations and follow the async job pattern: <code>SELECT</code> polls them, <code>EXEC</code> runs the lifecycle ops:</p>
<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"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> done</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">metadata</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)">'$.state'</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"> state</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"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">batches</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">batches</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 keyword" style="color:rgb(127, 219, 202)">EXEC</span><span class="token plain"> gemini</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">batches</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">batches</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cancel </span><span class="token variable" style="color:rgb(214, 222, 235)">@batchesId</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)">'my-batch-id'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Tuned model permissions are a full CRUD surface as well, so sharing a tuned model is an <code>INSERT</code> and auditing who can see it is a <code>SELECT</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-credential-one-boundary">One credential, one boundary<a href="https://stackql.io/blog/new-gemini-provider-available#one-credential-one-boundary" class="hash-link" aria-label="Direct link to One credential, one boundary" title="Direct link to One credential, one boundary" translate="no">​</a></h2>
<p>The provider covers the Gemini API surface under a <code>GEMINI_API_KEY</code>. Billing, quota, API key management and IAM are GCP control-plane services (<code>cloudbilling</code>, <code>serviceusage</code>, <code>apikeys</code>, <code>iam</code>) that authenticate with OAuth/ADC - they live in the <a href="https://google.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>google</code></strong></a> provider. StackQL does cross-provider joins, so the two compose; worked examples are at <a href="https://gemini-provider.stackql.io/google-control-plane" target="_blank" rel="noopener noreferrer" class="">gemini-provider.stackql.io/google-control-plane</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication">Authentication<a href="https://stackql.io/blog/new-gemini-provider-available#authentication" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication" translate="no">​</a></h2>
<p>Set a single environment variable:</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">export GEMINI_API_KEY=...</span><br></div></code></pre></div></div>
<p>Keys are created in <a href="https://aistudio.google.com/apikey" target="_blank" rel="noopener noreferrer" class="">Google AI Studio</a>. The key is only ever sent as a request header (<code>x-goog-api-key</code>) - never in the URL query string.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get started<a href="https://stackql.io/blog/new-gemini-provider-available#get-started" class="hash-link" aria-label="Direct link to Get started" title="Direct link to Get started" translate="no">​</a></h2>
<p>Pull the provider from the public registry:</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">registry pull gemini</span><br></div></code></pre></div></div>
<p>Provider docs are at <a href="https://gemini-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">gemini-provider.stackql.io</a>. Let us know what you build. Star us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a>.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="gemini" term="gemini"/>
        <category label="google" term="google"/>
        <category label="generative language" term="generative language"/>
        <category label="provider" term="provider"/>
        <category label="inference" term="inference"/>
        <category label="embeddings" term="embeddings"/>
        <category label="tuned models" term="tuned models"/>
        <category label="file search" term="file search"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Databricks Providers Update - July 2026]]></title>
        <id>https://stackql.io/blog/databricks-providers-update-july-2026</id>
        <link href="https://stackql.io/blog/databricks-providers-update-july-2026"/>
        <updated>2026-07-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Update to the StackQL Databricks providers adding four new services including disaster recovery, AI Search, bundle deployments and supervisor agents, a major expansion of Lakebase (Postgres) and identity coverage, and improved SQL statement execution semantics including DELETE to cancel running statements.]]></summary>
        <content type="html"><![CDATA[<p>We've released an update to the StackQL Databricks providers, regenerated from the latest Databricks platform APIs (SDK v0.123.0):</p>
<ul>
<li class=""><a href="https://databricks-account-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>databricks_account</code></strong></a> - account-level operations: <strong>9 services, 79 resources</strong></li>
<li class=""><a href="https://databricks-workspace-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>databricks_workspace</code></strong></a> - workspace-level operations: <strong>29 services, 313 resources</strong></li>
</ul>
<p>Includes <strong>392 resources and over 1,200 operations</strong> across both providers, including four new services and more than 70 new or restructured resources.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-services">New Services<a href="https://stackql.io/blog/databricks-providers-update-july-2026#new-services" class="hash-link" aria-label="Direct link to New Services" title="Direct link to New Services" translate="no">​</a></h2>
<table><thead><tr><th>Provider</th><th>Service</th><th>Description</th></tr></thead><tbody><tr><td><code>databricks_account</code></td><td><code>disasterrecovery</code></td><td>Manage disaster recovery failover groups and stable URLs for workspace failover across regions</td></tr><tr><td><code>databricks_workspace</code></td><td><code>aisearch</code></td><td>Databricks AI Search endpoints and indexes, including data plane operations to query, scan, sync and upsert index data</td></tr><tr><td><code>databricks_workspace</code></td><td><code>bundledeployments</code></td><td>Databricks Asset Bundle deployments - deployments, versions, operations and deployed resources</td></tr><tr><td><code>databricks_workspace</code></td><td><code>supervisoragents</code></td><td>Agent Bricks supervisor agents - agents, tools, examples and permissions</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="expanded-coverage-in-existing-services">Expanded Coverage in Existing Services<a href="https://stackql.io/blog/databricks-providers-update-july-2026#expanded-coverage-in-existing-services" class="hash-link" aria-label="Direct link to Expanded Coverage in Existing Services" title="Direct link to Expanded Coverage in Existing Services" translate="no">​</a></h2>
<ul>
<li class=""><code>postgres</code> (Lakebase) - the largest expansion in this release, now 24 resources covering projects, branches, databases, roles, endpoints, tables, synced tables, catalogs, snapshots, compute instances, change data feed configs and statuses, forward ETL, replication group previews and recovery branch previews</li>
<li class=""><code>iamv2</code> (account and workspace) - the restructured identity APIs: full lifecycle for <code>users</code>, <code>groups</code>, <code>service_principals</code>, <code>direct_group_members</code>, <code>workspace_access_details</code>, <code>workspace_assignment_details</code>, <code>external_users</code> and <code>transitive_parent_groups</code>, plus account access identity rules and attribute control entries</li>
<li class=""><code>catalog</code> - Unity Catalog AI Gateway services (<code>ai_gateway_model_services</code>, <code>ai_gateway_mcp_services</code>, <code>ai_gateway_agent_services</code>, <code>ai_gateway_model_provider_services</code>), privilege assignments (direct and effective), UC secrets and temporary volume credentials</li>
<li class=""><code>dashboards</code> - AI/BI Genie evaluation runs and results</li>
<li class=""><code>apps</code> - app spaces, app space operations and app thumbnails</li>
<li class=""><code>compute</code> - default base environments for serverless environments and library management</li>
<li class=""><code>vectorsearch</code> - vector search index management and endpoint permissions</li>
<li class=""><code>ml</code> - feature engineering streams</li>
<li class=""><code>billing</code> (account) - usage policies</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sql-statement-execution-improvements">SQL Statement Execution Improvements<a href="https://stackql.io/blog/databricks-providers-update-july-2026#sql-statement-execution-improvements" class="hash-link" aria-label="Direct link to SQL Statement Execution Improvements" title="Direct link to SQL Statement Execution Improvements" translate="no">​</a></h2>
<p>StackQL lets you traverse the Databricks control plane and data plane in the same query surface. This release cleans up the verb mappings for <code>databricks_workspace.sql.statement_execution</code>, so the full statement lifecycle maps naturally to SQL:</p>
<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">/* submit a statement to a SQL warehouse */</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"> databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">sql</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">statement_execution </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">  statement</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">  warehouse_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">  wait_timeout</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">  deployment_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"></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)">'SELECT * FROM samples.nyctaxi.trips LIMIT 100'</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)">'&lt;warehouse_id&gt;'</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)">'0s'</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)">'&lt;deployment_name&gt;'</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">/* poll for status and results */</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 keyword" style="color:rgb(127, 219, 202)">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> result</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"> databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">sql</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">statement_execution</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"> statement_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)">'&lt;statement_id&gt;'</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"> deployment_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)">'&lt;deployment_name&gt;'</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">/* cancel a running statement */</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"> databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">sql</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">statement_execution</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"> statement_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)">'&lt;statement_id&gt;'</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"> deployment_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)">'&lt;deployment_name&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>The <code>cancel</code> operation is now mapped to the <code>DELETE</code> verb (previously <code>INSERT</code>), and <code>sql.query_history</code> now projects one row per query with server-side pagination wired in, so large result sets append across pages automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-in-views">Built-in Views<a href="https://stackql.io/blog/databricks-providers-update-july-2026#built-in-views" class="hash-link" aria-label="Direct link to Built-in Views" title="Direct link to Built-in Views" translate="no">​</a></h2>
<p>Both providers ship with curated views that flatten common multi-step queries into a single <code>SELECT</code>, and this release adds views for Lakebase alongside the existing IAM, billing, provisioning, networking and settings views - 49 views in total. For example:</p>
<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"> databricks_account</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">vw_account_user_roles</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"> account_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)">'&lt;account_id&gt;'</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 keyword" style="color:rgb(127, 219, 202)">SELECT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">key</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)">value</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"> databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">settings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">vw_all_settings</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"> deployment_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)">'&lt;deployment_name&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get Started<a href="https://stackql.io/blog/databricks-providers-update-july-2026#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>Pull the latest providers from the public registry:</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">stackql registry pull databricks_account</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">stackql registry pull databricks_workspace</span><br></div></code></pre></div></div>
<p>Authenticate with the same service principal environment variables used by Terraform and the Databricks CLI (<code>DATABRICKS_ACCOUNT_ID</code>, <code>DATABRICKS_CLIENT_ID</code>, <code>DATABRICKS_CLIENT_SECRET</code>), then explore:</p>
<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"> workspace_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> workspace_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> workspace_status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> deployment_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"> databricks_account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">provisioning</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">workspaces</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"> account_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)">'&lt;account_id&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Provider docs are at <a href="https://databricks-account-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">databricks-account-provider.stackql.io</a> and <a href="https://databricks-workspace-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">databricks-workspace-provider.stackql.io</a>. Visit us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a> and let us know how you're using it.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="databricks" term="databricks"/>
        <category label="provider" term="provider"/>
        <category label="lakebase" term="lakebase"/>
        <category label="unity-catalog" term="unity-catalog"/>
        <category label="agent-bricks" term="agent-bricks"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[OpenAI Providers Update - July 2026]]></title>
        <id>https://stackql.io/blog/openai-providers-update-july-2026</id>
        <link href="https://stackql.io/blog/openai-providers-update-july-2026"/>
        <updated>2026-07-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Latest release of the StackQL OpenAI providers - openai for the platform API (models, files, fine-tuning, batches, vector stores, evals and more) and openai_admin for organization management, usage and cost reporting, projects, RBAC and audit logs - are available in the StackQL Provider Registry now.]]></summary>
        <content type="html"><![CDATA[<p>We've released an update to the StackQL providers for the OpenAI platform:</p>
<ul>
<li class=""><a href="https://openai-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>openai</code></strong></a> - the platform API surface available to standard API keys: models, files, fine-tuning, batches, vector stores, assistants, evals, conversations, uploads, containers, and skills (11 services, 26 resources, 97 operations)</li>
<li class=""><a href="https://openai-admin-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>openai_admin</code></strong></a> <strong>[new]</strong> - the organization and administration API surface: usage and cost reporting, projects, organization users and invites, groups and roles, admin API keys, audit logs, and certificates (10 services, 29 resources, 81 operations)</li>
</ul>
<p>Both providers expose a SQL-first surface: authentication is handled automatically, push down support using the <code>LIMIT</code> clause and built in pagination handling.</p>
<p>The <code>openai</code> provider is a ground-up rebuild of the previous provider, generated from the vendor's published OpenAPI specification. Some resources have been renamed and the organization/admin surface has moved to <code>openai_admin</code> - the previous provider version remains available in the registry for pinning, and the full disposition is documented at <a href="https://openai-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">openai-provider.stackql.io</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="async-jobs-as-sql">Async jobs as SQL<a href="https://stackql.io/blog/openai-providers-update-july-2026#async-jobs-as-sql" class="hash-link" aria-label="Direct link to Async jobs as SQL" title="Direct link to Async jobs as SQL" translate="no">​</a></h2>
<p>Fine-tuning jobs, batches, vector store file batches and uploads follow the same pattern: <code>INSERT</code> creates the job, <code>SELECT</code> polls it, <code>EXEC</code> cancels it. For example:</p>
<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"> id</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)">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> fine_tuned_model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> trained_tokens</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"> openai</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">fine_tuning</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">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" style="display:inline-block"></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"> id</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)">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> endpoint</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> request_counts</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"> openai</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">batches</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">batches</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)">LIMIT</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Vector stores are a full CRUD surface with file membership:</p>
<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"> id</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 keyword" style="color:rgb(127, 219, 202)">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> usage_bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> file_counts</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"> openai</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">vector_stores</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">vector_stores</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Inference endpoints (chat/completions, responses, embeddings, images, audio) are deliberately out of scope - the provider covers the control plane; use the vendor SDKs for invocation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-admin-provider---your-openai-org-as-data">The admin provider - your OpenAI org as data<a href="https://stackql.io/blog/openai-providers-update-july-2026#the-admin-provider---your-openai-org-as-data" class="hash-link" aria-label="Direct link to The admin provider - your OpenAI org as data" title="Direct link to The admin provider - your OpenAI org as data" translate="no">​</a></h2>
<p>The <code>openai_admin</code> provider presents the organization management surface as SQL.</p>
<p>Usage and cost are bucketed time series: one row per time bucket, with the per-group breakdown in the <code>results</code> JSON column, fanned out with <code>JSON_EACH</code>. Token usage by project and model over a 30-day window:</p>
<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">  json_extract</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">r</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)">'$.project_id'</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"> project_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">  json_extract</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">r</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)">'$.model'</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"> model</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">  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'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> u</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">start_time</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)">'unixepoch'</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"> usage_date</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">  json_extract</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">r</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)">'$.input_tokens'</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"> input_tokens</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">  json_extract</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">r</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)">'$.output_tokens'</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"> output_tokens</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"> openai_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">usage</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">completions u</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">u</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">results</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> r</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"> u</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">start_time </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)">1781481600</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"> u</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">bucket_width </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)">'1d'</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"> u</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">limit</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 number" style="color:rgb(247, 140, 108)">31</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"> u</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">group_by </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)">'project_id'</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)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">BY</span><span class="token plain"> usage_date</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> project_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Daily spend in USD by project:</p>
<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">  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'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">start_time</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)">'unixepoch'</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"> cost_date</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">  json_extract</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">r</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)">'$.project_id'</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"> project_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">  json_extract</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">r</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)">'$.amount.value'</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"> amount_usd</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"> openai_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">costs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">costs c</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">c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">results</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> r</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"> c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">start_time </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)">1781481600</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"> c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">limit</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 number" style="color:rgb(247, 140, 108)">180</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"> c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">group_by </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)">'project_id'</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)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">BY</span><span class="token plain"> cost_date</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> amount_usd </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>
<p>Usage is broken out per capability - completions, embeddings, moderations, images, audio, vector stores and code interpreter sessions - and can be grouped by <code>project_id</code>, <code>api_key_id</code> or <code>model</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="governance-and-auditing">Governance and auditing<a href="https://stackql.io/blog/openai-providers-update-july-2026#governance-and-auditing" class="hash-link" aria-label="Direct link to Governance and auditing" title="Direct link to Governance and auditing" translate="no">​</a></h2>
<p>Projects and their child resources (users, service accounts, API keys, rate limits) are queryable and writable:</p>
<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"> p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">name </span><span class="token keyword" style="color:rgb(127, 219, 202)">AS</span><span class="token plain"> project</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> sa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">name </span><span class="token keyword" style="color:rgb(127, 219, 202)">AS</span><span class="token plain"> service_account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> sa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">role</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"> openai_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">projects</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">projects p</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)">JOIN</span><span class="token plain"> openai_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">projects</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">service_accounts sa </span><span class="token keyword" style="color:rgb(127, 219, 202)">ON</span><span class="token plain"> sa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">project_id </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">id</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"> p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">status</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)">'active'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Admin key hygiene and audit logs work the same way:</p>
<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"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> created_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> last_used_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> owner</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"> openai_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">admin_api_keys</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">admin_api_keys</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"> created_at</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 keyword" style="color:rgb(127, 219, 202)">SELECT</span><span class="token plain"> id</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)">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> effective_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> actor</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> project</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"> openai_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">audit_logs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">audit_logs</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"effective_at[gt]"</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 number" style="color:rgb(247, 140, 108)">1750000000</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"event_types[]"</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)">'project.created'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Because it's all SQL, you can join usage to projects, materialize daily cost snapshots into a database, or point a BI tool at StackQL's Postgres wire protocol server and build an org-wide OpenAI spend dashboard without writing a line of integration code.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication">Authentication<a href="https://stackql.io/blog/openai-providers-update-july-2026#authentication" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication" translate="no">​</a></h2>
<p>The two providers use different key types, which are disjoint by design:</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"># openai - standard API key</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export OPENAI_API_KEY=sk-...</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"># openai_admin - org-scoped admin key (created by organization owners)</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export OPENAI_ADMIN_KEY=sk-admin-...</span><br></div></code></pre></div></div>
<p>Admin keys are available to organization accounts only and can be provisioned by organization owners in the <a href="https://platform.openai.com/settings/organization/admin-keys" target="_blank" rel="noopener noreferrer" class="">platform console</a>. A standard key cannot call the admin endpoints and vice versa.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get started<a href="https://stackql.io/blog/openai-providers-update-july-2026#get-started" class="hash-link" aria-label="Direct link to Get started" title="Direct link to Get started" translate="no">​</a></h2>
<p>Pull the providers from the public registry:</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">registry pull openai</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">registry pull openai_admin</span><br></div></code></pre></div></div>
<p>Provider docs are at <a href="https://openai-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">openai-provider.stackql.io</a> and <a href="https://openai-admin-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">openai-admin-provider.stackql.io</a>. Let us know what you build. Star us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a>.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="openai" term="openai"/>
        <category label="provider" term="provider"/>
        <category label="admin api" term="admin api"/>
        <category label="usage reporting" term="usage reporting"/>
        <category label="cost reporting" term="cost reporting"/>
        <category label="finops" term="finops"/>
        <category label="projects" term="projects"/>
        <category label="audit logs" term="audit logs"/>
        <category label="enterprise" term="enterprise"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Azure Provider Update - July 2026]]></title>
        <id>https://stackql.io/blog/azure-provider-update-july-2026</id>
        <link href="https://stackql.io/blog/azure-provider-update-july-2026"/>
        <updated>2026-07-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Major update to the StackQL Azure provider - 268 services covering the ARM control plane and Azure data planes in one provider, with expanded AI coverage including Azure AI Foundry, AI Language, Document Intelligence, Content Safety and more, available in the StackQL Provider Registry now.]]></summary>
        <content type="html"><![CDATA[<p>We've released a major update to the StackQL Azure provider family:</p>
<ul>
<li class=""><a href="https://azure-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>azure</code></strong></a> - core Microsoft Azure services: <strong>268 services, 3,473 resources and 13,559 operations</strong> (up from 202 services, a 33% increase in service coverage)</li>
<li class=""><a href="https://azure-extras-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>azure_extras</code></strong></a> - domain-specific and specialized Microsoft services (44 services)</li>
<li class=""><a href="https://azure-isv-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>azure_isv</code></strong></a> - Azure Native ISV and partner services: Databricks, Datadog, Confluent, Elastic, MongoDB Atlas, Oracle Database@Azure and more (27 services)</li>
<li class=""><a href="https://azure-stack-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>azure_stack</code></strong></a> - the Azure Stack / Azure Local family (4 services)</li>
</ul>
<p>Service, resource and method names are consistently snake_cased, service titles carry the official Azure product names, and related services have been consolidated - <code>SHOW SERVICES IN azure</code> now reads like the Azure portal, not like an SDK package index.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="control-plane-and-data-plane-in-one-provider">Control plane and data plane in one provider<a href="https://stackql.io/blog/azure-provider-update-july-2026#control-plane-and-data-plane-in-one-provider" class="hash-link" aria-label="Direct link to Control plane and data plane in one provider" title="Direct link to Control plane and data plane in one provider" translate="no">​</a></h2>
<p>Most Azure tooling stops at ARM. This provider exposes Azure <strong>data plane</strong> APIs alongside the ARM control plane as first-class services, so the same SQL surface that manages a resource can work with what's inside it.</p>
<p>Enumerate Key Vaults in a subscription (control plane), then list the secrets in one of them (data plane):</p>
<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"> 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 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">key_vault</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">vaults</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)">'&lt;subscription_id&gt;'</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 keyword" style="color:rgb(127, 219, 202)">SELECT</span><span class="token plain"> id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> content_type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> attributes</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"> azure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">key_vault_secrets</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">secrets</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"> vault_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)">'my-vault'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>The same pattern extends across the platform - Storage blobs, queues and file shares, Cosmos DB tables, App Configuration key-values, Event Grid publishing, Container Registry repositories, Azure Monitor log queries and ingestion, Azure Maps, Azure AI Search documents, Service Fabric cluster operations, Batch jobs, and the Synapse and Purview workspace APIs are all present as data plane services next to their management planes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-ai-surface">The AI surface<a href="https://stackql.io/blog/azure-provider-update-july-2026#the-ai-surface" class="hash-link" aria-label="Direct link to The AI surface" title="Direct link to The AI surface" translate="no">​</a></h2>
<p>The biggest expansion in this release is AI - 20 services covering Azure AI Foundry and the Azure AI services portfolio:</p>
<ul>
<li class=""><strong>Azure AI Foundry</strong>: <code>ai_projects</code>, <code>ai_agents</code>, <code>ai_inference</code>, <code>ai_evaluation</code></li>
<li class=""><strong>Language</strong>: <code>ai_language</code> (conversational language understanding, question answering and their authoring surfaces in a single service), <code>ai_text_analytics</code>, <code>ai_translation_text</code>, <code>ai_translation_document</code></li>
<li class=""><strong>Vision</strong>: <code>ai_vision_image_analysis</code>, <code>ai_vision_face</code></li>
<li class=""><strong>Documents</strong>: <code>ai_document_intelligence</code>, <code>ai_form_recognizer</code></li>
<li class=""><strong>Speech</strong>: <code>ai_transcription</code>, <code>ai_voice_live</code></li>
<li class=""><strong>Safety and content</strong>: <code>ai_content_safety</code>, <code>ai_content_understanding</code></li>
<li class="">Plus <code>ai_anomaly_detector</code>, <code>ai_personalizer</code>, <code>ai_discovery</code> and the <code>cognitive_services</code> management plane</li>
</ul>
<p>Inventory every Azure AI services account in a subscription, with kind and provisioning state:</p>
<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"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> location</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> provisioning_state</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"> azure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cognitive_services</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">accounts</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)">'&lt;subscription_id&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>ARM's nested <code>properties</code> envelope is flattened at query time, so attributes like <code>provisioning_state</code> are ordinary columns - no JSON extraction needed for the common case.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-new-and-expanded-coverage">More new and expanded coverage<a href="https://stackql.io/blog/azure-provider-update-july-2026#more-new-and-expanded-coverage" class="hash-link" aria-label="Direct link to More new and expanded coverage" title="Direct link to More new and expanded coverage" translate="no">​</a></h2>
<ul>
<li class=""><strong>Communication</strong> - the full Azure Communication Services surface: email, SMS, chat, calling automation, phone numbers, rooms, job router, advanced messaging and identity (9 services)</li>
<li class=""><strong>Databases</strong> - Azure NetApp Files, Azure Cache for Redis, Azure Managed Redis, Azure DocumentDB (MongoDB compatibility), Azure HorizonDB, MySQL and PostgreSQL flexible servers, Azure Data Explorer (Kusto)</li>
<li class=""><strong>Compute and containers</strong> - Compute Fleet, Compute Schedule, AKS (<code>container_service</code>), Kubernetes Fleet Manager, deployment safeguards, Container Registry tasks and data plane, Azure Red Hat OpenShift, Azure VMware Solution</li>
<li class=""><strong>Observability</strong> - Azure Monitor log query, metrics query and logs ingestion data planes, Azure Monitor workspaces (managed Prometheus), health models</li>
<li class=""><strong>Governance</strong> - Microsoft Purview catalog, data map, scanning, sharing and workflow APIs; a consolidated <code>resource</code> service spanning deployments, policy, locks, template specs and subscriptions</li>
<li class=""><strong>Maps</strong> - geocoding, routing, rendering, geolocation, timezone and weather (6 services)</li>
<li class=""><strong>Hybrid</strong> - Azure Arc-enabled servers, Kubernetes, VMware vSphere and System Center VMM, Arc gateway, Azure Local</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication">Authentication<a href="https://stackql.io/blog/azure-provider-update-july-2026#authentication" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication" translate="no">​</a></h2>
<p>The provider uses Azure's standard credential chain - an <code>az login</code> session works as-is, or set service principal credentials:</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">export AZURE_TENANT_ID=&lt;tenant_id&gt;</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export AZURE_CLIENT_ID=&lt;client_id&gt;</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export AZURE_CLIENT_SECRET=&lt;client_secret&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get started<a href="https://stackql.io/blog/azure-provider-update-july-2026#get-started" class="hash-link" aria-label="Direct link to Get started" title="Direct link to Get started" translate="no">​</a></h2>
<p>Pull the providers from the public registry:</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">registry pull azure</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">registry pull azure_extras</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">registry pull azure_isv</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">registry pull azure_stack</span><br></div></code></pre></div></div>
<p>Then explore - it's just SQL:</p>
<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"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> location</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> provisioning_state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> vm_id</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"> azure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">compute</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">virtual_machines</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)">'&lt;subscription_id&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Provider docs are at <a href="https://azure-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">azure-provider.stackql.io</a>. Let us know what you build. Star us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a>.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="azure" term="azure"/>
        <category label="provider" term="provider"/>
        <category label="arm" term="arm"/>
        <category label="azure ai" term="azure ai"/>
        <category label="ai foundry" term="ai foundry"/>
        <category label="key vault" term="key vault"/>
        <category label="cosmos db" term="cosmos db"/>
        <category label="data plane" term="data plane"/>
        <category label="cloud inventory" term="cloud inventory"/>
        <category label="finops" term="finops"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Anthropic Providers Update - July 2026]]></title>
        <id>https://stackql.io/blog/anthropic-providers-update-july-2026</id>
        <link href="https://stackql.io/blog/anthropic-providers-update-july-2026"/>
        <updated>2026-07-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Latest release of the StackQL Anthropic providers - anthropic for the Claude API (messages, agents, sessions, skills, files, vaults and more) and anthropic_admin for enterprise organization management, usage and cost reporting, and Claude Code analytics - are available in the StackQL Provider Registry now.]]></summary>
        <content type="html"><![CDATA[<p>We've released an update to the StackQL providers for the Anthropic platform:</p>
<ul>
<li class=""><a href="https://anthropic-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>anthropic</code></strong></a> - the Claude API surface: messages, models, batches, files, agents, deployments, environments, sessions, skills, memory stores, user profiles, and vaults (11 services, 26 resources, 103 operations)</li>
<li class=""><a href="https://anthropic-admin-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>anthropic_admin</code></strong></a> <strong>[new]</strong> - the Admin API surface: organization, users, invites, workspaces, API keys, usage and cost reports, rate limits, and Claude Code analytics (6 services, 11 resources)</li>
</ul>
<p>Both providers expose a SQL-first surface: authentication is handled automatically, Push down support using the <code>LIMIT</code> clause and built in pagination handling.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="inference-as-a-query">Inference as a query<a href="https://stackql.io/blog/anthropic-providers-update-july-2026#inference-as-a-query" class="hash-link" aria-label="Direct link to Inference as a query" title="Direct link to Inference as a query" translate="no">​</a></h2>
<p>Inference using Claude is accessible via <code>SELECT</code> for instance:</p>
<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">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">model</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">stop_reason</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">JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">content</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)">'$[0].text'</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"> assistant_message</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">JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token keyword" style="color:rgb(127, 219, 202)">usage</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)">'$.output_tokens'</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"> output_tokens</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"> anthropic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">messages</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">messages</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"> model </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)">'claude-sonnet-5'</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"> max_tokens </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)">2048</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"> messages </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><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">  {</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">    "role": "user",</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">    "content": "how does stackql work?"</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">  }</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token 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 operator" style="color:rgb(127, 219, 202)">AND</span><span class="token plain"> system </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)">'You are a technical assistant. Answer in one short paragraph.'</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"> thinking </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)">'{"type": "disabled"}'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Token counting works the same way via <code>anthropic.messages.token_counts</code> - free of charge.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-capabilities-view">Model capabilities view<a href="https://stackql.io/blog/anthropic-providers-update-july-2026#model-capabilities-view" class="hash-link" aria-label="Direct link to Model capabilities view" title="Direct link to Model capabilities view" translate="no">​</a></h2>
<p>The provider ships a convenience view that fans the per-model capability matrix out of the <code>capabilities</code> JSON column into flat columns:</p>
<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"> id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> display_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> thinking</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> adaptive</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> xhigh</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> max_input_tokens</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> max_tokens</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"> anthropic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">models</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">vw_model_capabilities</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>One row per model with boolean flags for batch, citations, code execution, context management, effort tiers (<code>low</code> through <code>xhigh</code>), image and PDF input, structured outputs, and thinking modes - useful for picking a model programmatically instead of reading release notes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-admin-provider---your-anthropic-org-as-data">The admin provider - your Anthropic org as data<a href="https://stackql.io/blog/anthropic-providers-update-july-2026#the-admin-provider---your-anthropic-org-as-data" class="hash-link" aria-label="Direct link to The admin provider - your Anthropic org as data" title="Direct link to The admin provider - your Anthropic org as data" translate="no">​</a></h2>
<p>The <code>anthropic_admin</code> provider presents the organization management surface as SQL.</p>
<p>Enumerate workspaces and who's in them:</p>
<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"> id</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"> created_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> data_residency</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"> anthropic_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">workspaces</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">workspaces</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 keyword" style="color:rgb(127, 219, 202)">SELECT</span><span class="token plain"> user_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> workspace_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> workspace_role</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"> anthropic_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">workspaces</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">members</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"> workspace_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)">'&lt;workspace_id&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Audit users and API keys across the org:</p>
<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"> id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> email</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"> role</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"> anthropic_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">organization</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">users</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 keyword" style="color:rgb(127, 219, 202)">SELECT</span><span class="token plain"> id</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 keyword" style="color:rgb(127, 219, 202)">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> workspace_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> partial_key_hint</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"> anthropic_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">api_keys</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">api_keys</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Pull usage reports as time-bucketed rows - <code>results</code> is a JSON column you can break down with <code>JSON_EACH</code>, and reports can be grouped and filtered by model, workspace, API key, service tier, and more:</p>
<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"> starting_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ending_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> results</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"> anthropic_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">usage</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">usage_reports</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"> starting_at </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-01T00:00:00Z'</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"group_by[]"</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)">'model'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Cost reporting and Claude Code adoption analytics work the same way:</p>
<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"> starting_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ending_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> results</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"> anthropic_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cost</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cost_reports</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"> starting_at </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-01T00:00:00Z'</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 keyword" style="color:rgb(127, 219, 202)">SELECT</span><span class="token plain"> starting_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ending_at</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> results</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"> anthropic_admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword" style="color:rgb(127, 219, 202)">usage</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">claude_code_reports</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"> starting_at </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-01T00:00:00Z'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Because it's all SQL, you can join usage to workspaces, materialize daily cost snapshots into a database, or point a BI tool at StackQL's Postgres wire protocol server and build an org-wide Claude spend dashboard without writing a line of integration code.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication">Authentication<a href="https://stackql.io/blog/anthropic-providers-update-july-2026#authentication" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication" translate="no">​</a></h2>
<p>The two providers use different key types, which are disjoint by design:</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"># anthropic - workspace-scoped Claude API key</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export ANTHROPIC_API_KEY=sk-ant-api...</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"># anthropic_admin - org-scoped Admin API key (created by org admins)</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export ANTHROPIC_ADMIN_KEY=sk-ant-admin...</span><br></div></code></pre></div></div>
<p>Admin keys are available to organization accounts only and can be provisioned by users with the admin role in the <a href="https://console.anthropic.com/settings/admin-keys" target="_blank" rel="noopener noreferrer" class="">Console</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get started<a href="https://stackql.io/blog/anthropic-providers-update-july-2026#get-started" class="hash-link" aria-label="Direct link to Get started" title="Direct link to Get started" translate="no">​</a></h2>
<p>Pull the providers from the public registry:</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">registry pull anthropic</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">registry pull anthropic_admin</span><br></div></code></pre></div></div>
<p>Provider docs are at <a href="https://anthropic-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">anthropic-provider.stackql.io</a> and <a href="https://anthropic-admin-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">anthropic-admin-provider.stackql.io</a>. Let us know what you build. Star us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a>.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="anthropic" term="anthropic"/>
        <category label="claude" term="claude"/>
        <category label="provider" term="provider"/>
        <category label="admin api" term="admin api"/>
        <category label="usage reporting" term="usage reporting"/>
        <category label="cost reporting" term="cost reporting"/>
        <category label="claude code" term="claude code"/>
        <category label="agents" term="agents"/>
        <category label="enterprise" term="enterprise"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[StackQL MCP server now available in the Anthropic MCP Directory]]></title>
        <id>https://stackql.io/blog/stackql-mcp-anthropic-directory</id>
        <link href="https://stackql.io/blog/stackql-mcp-anthropic-directory"/>
        <updated>2026-07-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="finding-it-in-claude-desktop">Finding it in Claude Desktop<a href="https://stackql.io/blog/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>
<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>
<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>
<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>
<p>Installation is one click.</p>
<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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-stackql-mcp-server-does">What the StackQL MCP server does<a href="https://stackql.io/blog/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>
<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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://stackql.io/blog/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>
<p>Documentation for the StackQL MCP server is available at <a class="" href="https://stackql.io/docs/mcp">StackQL MCP Tools</a>, <a class="" href="https://stackql.io/docs/command-line-usage/mcp">StackQL MCP Server Usage</a> and <a class="" href="https://stackql.io/docs/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>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="mcp" term="mcp"/>
        <category label="anthropic" term="anthropic"/>
        <category label="claude" term="claude"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[From finding to fix: cloud auto-remediation with AI and StackQL]]></title>
        <id>https://stackql.io/blog/ai-remediation-pull-requests</id>
        <link href="https://stackql.io/blog/ai-remediation-pull-requests"/>
        <updated>2026-06-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[An audit tells you what is wrong. This is the other half - a GitHub Actions loop that opens one pull request per finding, checks live state before it mutates, and applies on merge. OIDC only, no agents in the estate, GitHub as the audit trail.]]></summary>
        <content type="html"><![CDATA[<p>A cloud audit tells you what is wrong. The work starts when you have to fix it. Most tooling stops at the findings list and hands a spreadsheet to an engineer, and the findings sit there until someone has a quiet afternoon.</p>
<p>This post walks through the other half: a remediation loop that turns each finding into a reviewable pull request, verifies live state before it changes anything, and applies the fix on merge. It runs entirely in GitHub Actions, authenticates with OIDC, and uses StackQL to talk to cloud control planes. The repo is public at <a href="https://github.com/stackql-labs/stackql-ai-remediation" target="_blank" rel="noopener noreferrer" class="">stackql-labs/stackql-ai-remediation</a>, and the example throughout is FinOps waste (unattached disks, idle IPs, zero-VM projects), though the shape is the same for posture and security checks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-loop">The loop<a href="https://stackql.io/blog/ai-remediation-pull-requests#the-loop" class="hash-link" aria-label="Direct link to The loop" title="Direct link to The loop" translate="no">​</a></h2>
<p>The pipeline is deliberately small:</p>
<ol>
<li class="">A scheduled or dispatched audit runs against the cloud control plane and writes findings as structured data.</li>
<li class="">For each finding, the loop opens one pull request carrying the exact proposed change.</li>
<li class="">A preflight status check queries live reality before anything can merge.</li>
<li class="">On merge, the change is applied through the vendor CLI.</li>
<li class="">A post-apply check confirms the resource is actually gone.</li>
</ol>
<p>What is deliberately absent matters as much as what is present. No agents running in the estate. No long-lived cloud keys. No log pipeline, no inventory sync, no external scanner appliance. The data path is GitHub Actions to StackQL to the cloud control-plane APIs, and the audit trail is the pull request history.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-finding-is-just-data">A finding is just data<a href="https://stackql.io/blog/ai-remediation-pull-requests#a-finding-is-just-data" class="hash-link" aria-label="Direct link to A finding is just data" title="Direct link to A finding is just data" translate="no">​</a></h2>
<p>The audit emits each finding as JSON, and that JSON is the contract the rest of the loop reads. A single FinOps finding looks like this:</p>
<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)">"run_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)">"27901134862"</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)">"provider"</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)">"aws"</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)">"check_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)">"aws-finops-unattached-volume"</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)">"check_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)">"Unattached EBS volumes"</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)">"severity"</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)">"LOW"</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)">"category"</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)">"waste"</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)">"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)">"ap-southeast-2"</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)">"suggested_remediation"</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)">"type"</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)">"delete"</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)">"tool"</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)">"preflight_query"</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 VolumeId FROM aws.ec2.volumes WHERE region = 'ap-southeast-2' AND VolumeId = 'vol-0a1b2c3d4e5f' AND State = 'available'"</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)">"sql_query"</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)">"DELETE FROM aws.ec2.volumes WHERE region = 'ap-southeast-2' AND VolumeId = 'vol-0a1b2c3d4e5f'"</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)">"description"</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)">"Delete the unattached EBS volume (snapshot first if its data may be needed)."</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)">"fields"</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)">"volumeId"</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)">"vol-0a1b2c3d4e5f"</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)">"size"</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)">"20"</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)">"status"</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)">"available"</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)">"estimated_monthly_usd"</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)">1.92</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>
<p>The finding already carries its own remediation: a preflight query and the SQL that would fix it, both fully substituted with concrete values. The rest of the loop is mechanical from here.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-pull-request-per-finding">One pull request per finding<a href="https://stackql.io/blog/ai-remediation-pull-requests#one-pull-request-per-finding" class="hash-link" aria-label="Direct link to One pull request per finding" title="Direct link to One pull request per finding" translate="no">​</a></h2>
<p><code>generate_proposals.py</code> reads the findings and writes one directory per finding:</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">remediations/proposed/&lt;run-id&gt;/&lt;n&gt;-&lt;check-id&gt;-&lt;resource-id&gt;/</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  finding.json      # verbatim copy of the finding</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  preflight.sql     # the live-state check, pass = &gt;=1 row</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  remediation.sql   # the canonical fix (applied via CLI on merge)</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  rationale.md      # deterministic explanation from the finding fields</span><br></div></code></pre></div></div>
<p>The SQL comes straight from the audit's <code>suggested_remediation</code> block, already templated per check type, so the proposal is reproducible and reviewable rather than generated fresh each run. Where a model does help is a separate, optional step: an agent reads the batch and flags the captain's-call risks - the changes a human should look at twice - so reviewers know where to spend attention. Judgment and mutation are kept apart on purpose.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="query-before-mutation">Query before mutation<a href="https://stackql.io/blog/ai-remediation-pull-requests#query-before-mutation" class="hash-link" aria-label="Direct link to Query before mutation" title="Direct link to Query before mutation" translate="no">​</a></h2>
<p>The preflight is the part worth dwelling on:</p>
<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">-- pass criterion: returns &gt;= 1 row</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"> VolumeId</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">volumes</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)">'ap-southeast-2'</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"> VolumeId </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)">'vol-0a1b2c3d4e5f'</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"> State </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)">'available'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>This runs as a required status check on the pull request. It is a live query against the cloud API, not a read of a cached state file, and it asserts that the resource is still in the state the finding assumed at the moment of merge, not at the moment of audit. Findings go stale. Between the audit run and someone clicking merge, the volume may have been re-attached, deleted by someone else, or moved. A state file would not know. The API does. If the preflight returns zero rows, the check fails and the change cannot land.</p>
<p>This is the single most important property of the loop: the gap between "what the audit saw" and "what is true now" is closed by a live query, every time, automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-fix-is-a-sql-statement">The fix is a SQL statement<a href="https://stackql.io/blog/ai-remediation-pull-requests#the-fix-is-a-sql-statement" class="hash-link" aria-label="Direct link to The fix is a SQL statement" title="Direct link to The fix is a SQL statement" translate="no">​</a></h2>
<p>StackQL treats the cloud control plane as a queryable and mutable surface. You <code>SELECT</code> to read it and <code>DELETE</code> or <code>INSERT</code> to change it, with the same grammar across providers:</p>
<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)">DELETE</span><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">volumes</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)">'ap-southeast-2'</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"> VolumeId </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)">'vol-0a1b2c3d4e5f'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>The statement is idempotent by shape. Run it twice and the end state is the same, which is exactly the property you want when a pipeline can retry. On merge, the apply workflow executes the remediation through the vendor CLI; <code>remediation.sql</code> is kept as the canonical, human-readable record of what was applied.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="policy-gates-instead-of-a-review-bottleneck">Policy gates instead of a review bottleneck<a href="https://stackql.io/blog/ai-remediation-pull-requests#policy-gates-instead-of-a-review-bottleneck" class="hash-link" aria-label="Direct link to Policy gates instead of a review bottleneck" title="Direct link to Policy gates instead of a review bottleneck" translate="no">​</a></h2>
<p>Branch protection is where the safety model lives. The rule on <code>main</code> is:</p>
<ul>
<li class="">Required approvals: <code>0</code></li>
<li class="">Require status checks to pass before merging: on, so the preflight is enforced</li>
</ul>
<p>The preflight check is the gate, not a human sign-off. That sounds aggressive until you see what it replaces: instead of one person eyeballing a diff, the merge is bounded by a machine-enforced envelope. Low-severity waste can auto-merge once the preflight is green; you keep a human approver in the path for higher-severity classes by raising the required-approvals count on those. The same pattern extends to budget ceilings, region locks, and change-rate caps. Policy is the loop's safety mechanism, expressed as checks rather than as a meeting.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="onboarding-without-handing-over-keys">Onboarding without handing over keys<a href="https://stackql.io/blog/ai-remediation-pull-requests#onboarding-without-handing-over-keys" class="hash-link" aria-label="Direct link to Onboarding without handing over keys" title="Direct link to Onboarding without handing over keys" translate="no">​</a></h2>
<p>The loop authenticates with OIDC and federated identity only - AWS <code>AssumeRoleWithWebIdentity</code>, GCP Workload Identity Federation, Azure federated credentials. There are no static cloud keys in the repo.</p>
<p>Bootstrap stays inside the cloud admin's own console session. The onboarding templates under <code>cicd/onboarding/</code> give you a one-click path per cloud: a CloudFormation "Launch Stack" URL for AWS, a <code>gcloud</code> script for GCP, an ARM "Deploy to Azure" template for Azure. The admin clicks, authenticates in their own console, and the only thing that comes back to the pipeline is a role ARN or a workload-identity provider. Nothing long-lived crosses a boundary. It is the same integration model SaaS security tools already use.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="run-it">Run it<a href="https://stackql.io/blog/ai-remediation-pull-requests#run-it" class="hash-link" aria-label="Direct link to Run it" title="Direct link to Run it" translate="no">​</a></h2>
<p>End to end:</p>
<ol>
<li class="">Clone <a href="https://github.com/stackql-labs/stackql-ai-remediation" target="_blank" rel="noopener noreferrer" class="">stackql-labs/stackql-ai-remediation</a>.</li>
<li class="">Set branch protection on <code>main</code>: required approvals <code>0</code>, required status check for the preflight.</li>
<li class="">Run the onboarding template for each cloud you want to cover to create the OIDC role or binding.</li>
<li class="">Store the resulting role ARNs and WIF provider as repo secrets.</li>
<li class="">Dispatch the audit workflow, or let the schedule run it.</li>
</ol>
<p>Findings upload as workflow artifacts, proposals generate, and one pull request opens per finding. Merge a green one and watch the apply and post-check complete. A representative cross-cloud sweep here finished in a couple of minutes and surfaced a handful of unattached volumes, each as its own PR with the saving attached.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-shape">Why this shape<a href="https://stackql.io/blog/ai-remediation-pull-requests#why-this-shape" class="hash-link" aria-label="Direct link to Why this shape" title="Direct link to Why this shape" translate="no">​</a></h2>
<p>The properties that make this worth running are all consequences of one decision: reach the control plane as data. Findings are data, the safety check is a query, the fix is a statement, and the record is the pull request. No new dashboard, no new vendor, no agent footprint in the estate. It is boring and inspectable, which is what you want from something allowed to change production.</p>
<p>The same loop runs for security posture and access findings by swapping the checks. That is the next post.</p>]]></content>
        <author>
            <name>Kieran Rimmer</name>
            <uri>https://www.linkedin.com/in/kieranrimmer/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="github-actions" term="github-actions"/>
        <category label="finops" term="finops"/>
        <category label="remediation" term="remediation"/>
        <category label="oidc" term="oidc"/>
        <category label="sre" term="sre"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Run the StackQL MCP Server Anywhere Your Agent Does]]></title>
        <id>https://stackql.io/blog/run-the-stackql-mcp-server-anywhere</id>
        <link href="https://stackql.io/blog/run-the-stackql-mcp-server-anywhere"/>
        <updated>2026-06-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>The <a class="" href="https://stackql.io/docs/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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-stackql-mcp-server-is">What the StackQL MCP server is<a href="https://stackql.io/blog/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>
<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/docs/command-line-usage/mcp#server-modes">server mode</a> and recorded to an <a class="" href="https://stackql.io/docs/command-line-usage/mcp#audit-log">audit log</a>, so "what the agent did" is always answerable.</p>
<p>For background on the protocol itself, see the original <a class="" href="https://stackql.io/blog/stackql-mcp-server-now-available"><strong>StackQL MCP Server Now Available</strong></a> post and the <a class="" href="https://stackql.io/docs/command-line-usage/mcp"><strong>MCP command reference</strong></a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-server-every-runtime">One server, every runtime<a href="https://stackql.io/blog/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>
<p>Every channel runs the same <code>stackql</code> binary. Pick the one that matches your client:</p>
<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>
<p>A typical stdio client config is three lines. For npx:</p>
<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>
<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/docs/installing-stackql#installing-the-mcp-server"><strong>Installing the MCP server</strong></a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-approvable-mcp-server">The approvable MCP server<a href="https://stackql.io/blog/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>
<p>Letting an agent touch your cloud is a trust decision, so the supply chain is built to be checkable:</p>
<ul>
<li class="">The embedded <code>stackql</code> binary is Authenticode-signed (Windows) and Apple-notarised (macOS).</li>
<li class="">Every <code>.mcpb</code> bundle ships with a published SHA-256 checksum on the release page.</li>
<li class="">The npm and PyPI launchers verify the downloaded binary's SHA-256 before first use.</li>
<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>
</ul>
<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/docs/command-line-usage/mcp#server-modes"><strong>Server modes</strong></a>.</p>
<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/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>
<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>
<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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-agent-actually-sees">What the agent actually sees<a href="https://stackql.io/blog/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>
<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>
<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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get started<a href="https://stackql.io/blog/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>
<ul>
<li class="">Install docs for every channel: <a class="" href="https://stackql.io/docs/installing-stackql#installing-the-mcp-server"><strong>Installing the MCP server</strong></a></li>
<li class="">Command reference, modes and audit log: <a class="" href="https://stackql.io/docs/command-line-usage/mcp"><strong>stackql mcp</strong></a></li>
<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>
<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>
</ul>
<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>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="mcp" term="mcp"/>
        <category label="model context protocol" term="model context protocol"/>
        <category label="ai agents" term="ai agents"/>
        <category label="claude" term="claude"/>
        <category label="infrastructure-as-code" term="infrastructure-as-code"/>
        <category label="ai" term="ai"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Autonomous Edge Defense with AI Agents and SQL]]></title>
        <id>https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql</id>
        <link href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql"/>
        <updated>2026-06-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[An agentic loop that observes Cloudflare edge traffic, tightens rate limits in response, and writes an auditable decision trail to Kafka - all through one SQL interface.]]></summary>
        <content type="html"><![CDATA[<p>Edge defense is a natural fit for an agentic loop: traffic patterns shift constantly, rate-limit thresholds need to follow, and every adjustment should leave an auditable trail. The hard part is usually the plumbing - one API for analytics, another for the rate-limit control plane, another for the durable log.</p>
<p><strong>edgepilot</strong> collapses all of that to SQL. Two Claude agents - a recon agent and an action agent - observe a live Cloudflare zone, tighten its rate-limit rule when traffic warrants, and write a decision record to a Confluent Kafka topic. Neither agent knows anything about Cloudflare's GraphQL Analytics API, Cloudflare's rulesets engine, or Confluent's Kafka REST proxy. They know SQL. The <strong><a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class="">StackQL MCP server</a></strong> does the rest.</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%;margin-bottom:1.5rem"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%" src="https://www.youtube.com/embed/btCUiq1v29c?si=DI8HG7HvDc4zVh5R" title="edgepilot - two AI agents, one SQL interface, two clouds" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-setup">The setup<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#the-setup" class="hash-link" aria-label="Direct link to The setup" title="Direct link to The setup" translate="no">​</a></h2>
<p>The demo runs against a throwaway Cloudflare zone (<code>stackql.xyz</code>) and a freshly provisioned Confluent Cloud Kafka cluster. A small load generator drives synthetic traffic - some normal browsers, some AI-crawler user agents - at the zone so the analytics tables have something real to report.</p>
<!-- -->
<p>Both agents speak to a single MCP server - StackQL running in stdio mode - and that server fans out to whichever provider the query targets. The agents never see API URLs, auth headers, GraphQL query strings, or Kafka REST endpoints. They see tables.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-recon-agent">The recon agent<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#the-recon-agent" class="hash-link" aria-label="Direct link to The recon agent" title="Direct link to The recon agent" translate="no">​</a></h2>
<p>The recon agent runs three SELECTs. Notice that nothing in these queries hints that one is a managed cluster API, one is a GraphQL analytics endpoint, and one is a rulesets PUT/GET pair.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-find-the-active-kafka-cluster">🔍 Find the active Kafka cluster<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#-find-the-active-kafka-cluster" class="hash-link" aria-label="Direct link to 🔍 Find the active Kafka cluster" title="Direct link to 🔍 Find the active Kafka cluster" translate="no">​</a></h3>
<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">Query</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Results</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><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">  id                                                                              </span><span class="token keyword" style="color:rgb(127, 219, 202)">AS</span><span class="token plain"> kafka_cluster_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">  JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">spec</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)">'$.region'</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"> region</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">  LOWER</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">spec</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)">'$.cloud'</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)">AS</span><span class="token plain"> cloud_provider</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">SPLIT_PART</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">spec</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)">'$.http_endpoint'</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 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 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"> kafka_endpoint_id</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"> confluent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">managed_kafka_clusters</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">clusters</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"> environment </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)">'env-xxxxx'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><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">|------------------|-----------|----------------|-------------------|</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">| kafka_cluster_id | region    | cloud_provider | kafka_endpoint_id |</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">| lkc-abc123       | us-east-1 | aws            | pkc-xyz9w         |</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">|------------------|-----------|----------------|-------------------|</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-read-live-zone-analytics">📊 Read live zone analytics<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#-read-live-zone-analytics" class="hash-link" aria-label="Direct link to 📊 Read live zone analytics" title="Direct link to 📊 Read live zone analytics" translate="no">​</a></h3>
<p>This one talks to Cloudflare's GraphQL Analytics API under the hood. The agent sees a table.</p>
<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">Query</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Results</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><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 keyword" style="color:rgb(127, 219, 202)">datetime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> client_country_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> edge_response_status</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">       client_request_http_method_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bytes</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"> cloudflare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">zones</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">http_requests_adaptive_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"> zone_tag </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)">'&lt;zone_id&gt;'</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">   since    </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-06-04T09:30:00Z'</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">   until    </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-06-04T10:00:00Z'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><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">|----------------------|---------------------|----------------------|---------------------------------|----------|--------|</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">| datetime             | client_country_name | edge_response_status | client_request_http_method_name | requests | bytes  |</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">| 2026-06-04T09:31:00Z | United States       | 200                  | GET                             | 412      | 184320 |</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">| 2026-06-04T09:31:00Z | Germany             | 200                  | GET                             | 87       | 39424  |</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">| 2026-06-04T09:32:00Z | United States       | 429                  | GET                             | 23       | 9728   |</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">| 2026-06-04T09:34:00Z | Singapore           | 200                  | POST                            | 19       | 8442   |</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">|----------------------|---------------------|----------------------|---------------------------------|----------|--------|</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-inspect-the-current-rate-limit-rule">🛡️ Inspect the current rate-limit rule<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#%EF%B8%8F-inspect-the-current-rate-limit-rule" class="hash-link" aria-label="Direct link to 🛡️ Inspect the current rate-limit rule" title="Direct link to 🛡️ Inspect the current rate-limit rule" translate="no">​</a></h3>
<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">Query</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Results</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><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"> 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">       JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rules</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)">'$[0].id'</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"> rule_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">       JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rules</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)">'$[0].description'</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"> description</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">       JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rules</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)">'$[0].ratelimit.requests_per_period'</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"> threshold</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">       JSON_EXTRACT</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rules</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)">'$[0].ratelimit.period'</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"> period</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"> cloudflare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">rulesets</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">phases</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"> zone_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)">'&lt;zone_id&gt;'</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">   ruleset_phase </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)">'http_ratelimit'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><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">|----------------------------------|----------------------------------|----------------------------------------|-----------|--------|</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">| id                               | rule_id                          | description                            | threshold | period |</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">| 1a2b3c4d5e6f7890abcdef1234567890 | 9f8e7d6c5b4a3210fedcba9876543210 | edgepilot demo rule (managed by sqld)  | 100       | 10     |</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">|----------------------------------|----------------------------------|----------------------------------------|-----------|--------|</span><br></div></code></pre></div></div></div></div></div>
<p>The recon agent hands these results to the action agent as a short plain-text report.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-action-agent">The action agent<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#the-action-agent" class="hash-link" aria-label="Direct link to The action agent" title="Direct link to The action agent" translate="no">​</a></h2>
<p>The action agent does two things: tighten the rate limit on Cloudflare, then write a decision record to Confluent Kafka. Both are mutations, expressed as standard SQL.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-tighten-the-cloudflare-rate-limit">✏️ Tighten the Cloudflare rate limit<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#%EF%B8%8F-tighten-the-cloudflare-rate-limit" class="hash-link" aria-label="Direct link to ✏️ Tighten the Cloudflare rate limit" title="Direct link to ✏️ Tighten the Cloudflare rate limit" translate="no">​</a></h3>
<p>StackQL implements <code>REPLACE</code> against Cloudflare's modern rulesets PUT endpoint. The agent doesn't have to know that under the covers this is a full-document replace of every rule in the <code>http_ratelimit</code> phase entrypoint.</p>
<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)">REPLACE</span><span class="token plain"> cloudflare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">rulesets</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">phases</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)">SET</span><span class="token plain"> rules </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><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">  {</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">    "action": "block",</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">    "ratelimit": {</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">      "characteristics": ["ip.src", "cf.colo.id"],</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">      "period": 10,</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">      "requests_per_period": 30,</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">      "mitigation_timeout": 10</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">    },</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">    "expression": "len(http.request.uri.path) gt 0",</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">    "description": "edgepilot demo rule (managed by stackql-deploy)",</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">    "enabled": true</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">  }</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token 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 keyword" style="color:rgb(127, 219, 202)">WHERE</span><span class="token plain"> zone_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)">'&lt;zone_id&gt;'</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">   ruleset_phase </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)">'http_ratelimit'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-log-the-decision-to-kafka">📨 Log the decision to Kafka<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#-log-the-decision-to-kafka" class="hash-link" aria-label="Direct link to 📨 Log the decision to Kafka" title="Direct link to 📨 Log the decision to Kafka" translate="no">​</a></h3>
<p>And the action agent publishes a record to Confluent Kafka - again, as plain SQL. No producer client, no AVRO schema registry plumbing, no REST endpoint to look up. StackQL resolves the cluster's data-plane endpoint from the cluster id and posts the record.</p>
<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)">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">INTO</span><span class="token plain"> kafka</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">kafka</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">records</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">  cluster_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> kafka_endpoint_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> region</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> cloud_provider</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">  topic_name</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)">key</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)">value</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">  </span><span class="token string" style="color:rgb(173, 219, 103)">'lkc-abc123'</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)">'pkc-xyz9w'</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)">'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">  </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><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token string" style="color:rgb(173, 219, 103)">'edge-autopilot-decisions'</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":"STRING","data":"edgepilot.action"}'</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":"JSON","data":{"agent":"action","action":"tighten_rate_limit","threshold":30,"reasoning":"elevated bot traffic, dropping threshold from 100 to 30","timestamp":"2026-06-04T10:00:00Z"}}'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>The record appears live in the <strong>Confluent Cloud UI -&gt; Topics -&gt; edge-autopilot-decisions -&gt; Messages</strong> tab.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-works-as-an-agentic-loop">Why this works as an agentic loop<a href="https://stackql.io/blog/autonomous-edge-defense-ai-agents-sql#why-this-works-as-an-agentic-loop" class="hash-link" aria-label="Direct link to Why this works as an agentic loop" title="Direct link to Why this works as an agentic loop" translate="no">​</a></h2>
<p>Edge defense has three properties that make it well-suited to agents, and three properties that usually make it painful to wire up. SQL-over-MCP collapses the painful side:</p>
<ul>
<li class=""><em>The observe step (analytics), the act step (rate-limit control plane), and the audit step (durable log) normally each have their own SDK, auth model, and request shape. Here they're the same shape: a query.</em></li>
<li class=""><em>LLMs are reliable SQL generators - far more reliable than they are at chaining three provider-specific SDK calls correctly. Constrain the schema and the agent will stay on the rails.</em></li>
<li class=""><em>Adding a new signal source (WAF events, R2 logs, Workers analytics) or a new action surface (a different CDN, a different broker) is a registry pull, not a refactor of the agent loop.</em></li>
</ul>
<p>The whole loop - observe, decide, act, audit - takes about 30 to 60 seconds to run.</p>
<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>The full demo, including infrastructure provisioning via <a href="https://github.com/stackql/stackql-deploy" target="_blank" rel="noopener noreferrer" class=""><strong><code>stackql-deploy</code></strong></a>, the load generator, and a Claude Desktop variant, is at <a href="https://github.com/stackql/edgepilot" target="_blank" rel="noopener noreferrer" class=""><strong><code>stackql/edgepilot</code></strong></a>.</p></div></div>
<p>Try wiring StackQL into your own agent loop:</p>
<ul>
<li class=""><em>Pick any provider in the <a href="https://registry.stackql.io/" target="_blank" rel="noopener noreferrer" class="">StackQL registry</a> and pull it.</em></li>
<li class=""><em>Point an MCP-aware client (Claude Desktop, Cline, or your own SDK loop) at the StackQL MCP server.</em></li>
<li class=""><em>Let the model discover the schema via <code>SHOW METHODS</code> and <code>DESCRIBE</code> - no fine-tuning, no provider-specific prompting.</em></li>
</ul>
<p>⭐ us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a> and join our community!</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="mcp" term="mcp"/>
        <category label="anthropic" term="anthropic"/>
        <category label="cloudflare" term="cloudflare"/>
        <category label="confluent" term="confluent"/>
        <category label="kafka" term="kafka"/>
        <category label="ai-agents" term="ai-agents"/>
        <category label="agentic" term="agentic"/>
        <category label="edge-security" term="edge-security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Cloudflare Provider - May 2026]]></title>
        <id>https://stackql.io/blog/updated-cloudflare-provider-available</id>
        <link href="https://stackql.io/blog/updated-cloudflare-provider-available"/>
        <updated>2026-05-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Initial release of the StackQL Cloudflare provider with 108 services, 1259 resources, and 2840 operations spanning Zero Trust, Workers, R2, DNS, Zones, Radar, AI, Stream, Magic Transit, and more.]]></summary>
        <content type="html"><![CDATA[<p>We've released the latest version of the <a href="https://stackql.io/docs/providers" target="_blank" rel="noopener noreferrer" class=""><strong>StackQL Cloudflare provider</strong></a>, including the full Cloudflare V4 API surface under SQL with <strong>108 services</strong>, <strong>1259 resources</strong>, and <strong>2840 operations</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="service-highlights">Service highlights<a href="https://stackql.io/blog/updated-cloudflare-provider-available#service-highlights" class="hash-link" aria-label="Direct link to Service highlights" title="Direct link to Service highlights" translate="no">​</a></h2>
<p>Key services in this release include:</p>
<table><thead><tr><th>Service</th><th style="text-align:right">Resources</th><th style="text-align:right">Operations</th><th>What it covers</th></tr></thead><tbody><tr><td><code>zero_trust</code></td><td style="text-align:right">155</td><td style="text-align:right">427</td><td>Access apps, gateway, tunnels, identity providers, device posture</td></tr><tr><td><code>radar</code></td><td style="text-align:right">266</td><td style="text-align:right">273</td><td>Internet measurement: BGP, traffic, attacks, AS info, quality</td></tr><tr><td><code>cloudforce_one</code></td><td style="text-align:right">56</td><td style="text-align:right">130</td><td>Threat intel: requests, priorities, scans, threat events</td></tr><tr><td><code>ai</code></td><td style="text-align:right">114</td><td style="text-align:right">116</td><td>Workers AI inference across 100+ models</td></tr><tr><td><code>workers</code></td><td style="text-align:right">39</td><td style="text-align:right">107</td><td>Scripts, deployments, KV, Durable Objects, queues, cron triggers</td></tr><tr><td><code>magic_transit</code></td><td style="text-align:right">21</td><td style="text-align:right">90</td><td>Magic WAN: sites, connectors, GRE/IPsec tunnels, routes</td></tr><tr><td><code>zones</code></td><td style="text-align:right">26</td><td style="text-align:right">64</td><td>Zone lifecycle, settings, SSL/TLS, page rules, custom hostnames</td></tr><tr><td><code>realtime_kit</code></td><td style="text-align:right">27</td><td style="text-align:right">63</td><td>RealtimeKit meetings, sessions, recordings, presets</td></tr><tr><td><code>dns</code></td><td style="text-align:right">19</td><td style="text-align:right">58</td><td>DNS records, zone transfers, firewall, analytics</td></tr><tr><td><code>load_balancers</code></td><td style="text-align:right">12</td><td style="text-align:right">54</td><td>Pools, monitors, regions, search</td></tr><tr><td><code>aisearch</code></td><td style="text-align:right">20</td><td style="text-align:right">48</td><td>AI Search indexes, ingest jobs, models</td></tr><tr><td><code>email_security</code></td><td style="text-align:right">15</td><td style="text-align:right">47</td><td>Area 1: alerts, allow/block policies, investigation</td></tr><tr><td><code>firewall</code></td><td style="text-align:right">10</td><td style="text-align:right">47</td><td>WAF rules, packages, lockdowns, access rules, UA rules</td></tr><tr><td><code>streams</code></td><td style="text-align:right">13</td><td style="text-align:right">47</td><td>Stream video uploads, live inputs, signed URLs, captions</td></tr><tr><td><code>api_gateway</code></td><td style="text-align:right">17</td><td style="text-align:right">43</td><td>API discovery, schemas, operations, settings</td></tr><tr><td><code>r2</code></td><td style="text-align:right">17</td><td style="text-align:right">42</td><td>Buckets, lifecycle, CORS, custom domains, event notifications</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication">Authentication<a href="https://stackql.io/blog/updated-cloudflare-provider-available#authentication" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication" translate="no">​</a></h2>
<p>Authenticate with a Cloudflare API token via the <code>CLOUDFLARE_API_TOKEN</code> environment variable:</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">export CLOUDFLARE_API_TOKEN=...</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-queries">Example queries<a href="https://stackql.io/blog/updated-cloudflare-provider-available#example-queries" class="hash-link" aria-label="Direct link to Example queries" title="Direct link to Example queries" translate="no">​</a></h2>
<p>List your zones:</p>
<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"> id</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 keyword" style="color:rgb(127, 219, 202)">status</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)">plan</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"> cloudflare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">zones</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">zones</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"> account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">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)">'&lt;account_id&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Inspect Workers scripts in an account:</p>
<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"> id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> modified_on</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> usage_model</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"> cloudflare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">workers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">scripts</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"> account_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)">'&lt;account_id&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>List DNS records for a zone:</p>
<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"> name</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)">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> content</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ttl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> proxied</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"> cloudflare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">dns</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">records</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"> zone_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)">'&lt;zone_id&gt;'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Pull a Radar BGP summary:</p>
<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"> cloudflare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">radar</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">routes_stats</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="binary-and-non-json-responses">Binary and non-JSON responses<a href="https://stackql.io/blog/updated-cloudflare-provider-available#binary-and-non-json-responses" class="hash-link" aria-label="Direct link to Binary and non-JSON responses" title="Direct link to Binary and non-JSON responses" translate="no">​</a></h2>
<p>A number of Cloudflare endpoints return binary or plain-text payloads - PDF LOAs, PNG screenshots, raw script source, CSV exports. The provider wraps these as a one-row table with a <code>contents</code> column so they're still SELECT-able:</p>
<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"> contents</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"> cloudflare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">browser_rendering</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">screenshot</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"> account_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)">'&lt;account_id&gt;'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">AND</span><span class="token plain"> url </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://example.com'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get started<a href="https://stackql.io/blog/updated-cloudflare-provider-available#get-started" class="hash-link" aria-label="Direct link to Get started" title="Direct link to Get started" translate="no">​</a></h2>
<p>Pull the provider from the public registry:</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">registry pull cloudflare</span><br></div></code></pre></div></div>
<p>Then start querying. Let us know what you build. Star us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a>.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="cloudflare" term="cloudflare"/>
        <category label="provider" term="provider"/>
        <category label="zero trust" term="zero trust"/>
        <category label="workers" term="workers"/>
        <category label="r2" term="r2"/>
        <category label="dns" term="dns"/>
        <category label="radar" term="radar"/>
        <category label="ai" term="ai"/>
        <category label="stream" term="stream"/>
        <category label="magic transit" term="magic transit"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Confluent Provider Update - May 2026]]></title>
        <id>https://stackql.io/blog/confluent-provider-may-2026-update</id>
        <link href="https://stackql.io/blog/confluent-provider-may-2026-update"/>
        <updated>2026-05-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Update to the StackQL Confluent provider adding eight new services including ccl, ccpm, endpoints, pipelines, share_group, streams_group, tableflow, and usm, along with 40 additional resources across existing services.]]></summary>
        <content type="html"><![CDATA[<p>We've released an update to the <a href="https://confluent-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong>StackQL Confluent provider</strong></a> adding eight new services and 40 additional resources across existing services.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-services">New Services<a href="https://stackql.io/blog/confluent-provider-may-2026-update#new-services" class="hash-link" aria-label="Direct link to New Services" title="Direct link to New Services" translate="no">​</a></h2>
<p>The eight new services added in this update are:</p>
<table><thead><tr><th>Service</th><th>Description</th></tr></thead><tbody><tr><td><code>ccl</code></td><td>Custom Code Logging - manage log topics that capture stdout/stderr and worker process logs from custom connectors running in Confluent Cloud</td></tr><tr><td><code>ccpm</code></td><td>Custom Connect Plugin Management - upload, version, and manage custom connector plugins at the environment level, including plugin version resources for JAR/ZIP artifacts</td></tr><tr><td><code>endpoints</code></td><td>Manage PrivateLink access points and private network endpoints used to reach Confluent Cloud clusters and serverless products over private networking</td></tr><tr><td><code>pipelines</code></td><td>Manage Stream Designer pipelines - the visual SQL/ksqlDB pipeline builder for connecting sources, transforms, and sinks across Kafka topics</td></tr><tr><td><code>share_group</code></td><td>Manage Kafka share groups (KIP-932 / Queues for Kafka), which provide queue-like consumption semantics with per-message acknowledgement and consumer parallelism beyond partition count</td></tr><tr><td><code>streams_group</code></td><td>Manage Kafka Streams groups - the broker-side coordination resource for Kafka Streams applications introduced alongside the next-generation consumer rebalance protocol</td></tr><tr><td><code>tableflow</code></td><td>Materialize Kafka topics as Apache Iceberg or Delta Lake tables, including catalog integrations, storage configuration, and table maintenance settings</td></tr><tr><td><code>usm</code></td><td>Unified Stream Manager - register and govern self-managed Confluent Platform clusters from Confluent Cloud, including agent deployment and hybrid cluster monitoring</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updates">Updates<a href="https://stackql.io/blog/confluent-provider-may-2026-update#updates" class="hash-link" aria-label="Direct link to Updates" title="Direct link to Updates" translate="no">​</a></h2>
<p>This release also adds 40 additional resources across existing services, expanding coverage for:</p>
<ul>
<li class=""><code>kafka</code> - additional cluster configuration and topic-level resources</li>
<li class=""><code>connect</code> - new connector status, offset, and task management resources</li>
<li class=""><code>flink</code> - expanded coverage for Flink statements, compute pools, and artifacts</li>
<li class=""><code>iam</code> - new resources for service accounts, identity providers, and role bindings</li>
<li class=""><code>networking</code> - additional resources for transit gateways, peerings, and DNS forwarders</li>
<li class=""><code>schema_registry</code> - new resources for schema exporters, modes, and compatibility</li>
<li class=""><code>billing</code> - new cost and usage resources</li>
<li class=""><code>metrics</code> - additional query and descriptor resources</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get Started<a href="https://stackql.io/blog/confluent-provider-may-2026-update#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>Pull the latest Confluent provider:</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">stackql registry pull confluent</span><br></div></code></pre></div></div>
<p>Visit us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a> and let us know how you're using it.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="confluent" term="confluent"/>
        <category label="provider" term="provider"/>
        <category label="kafka" term="kafka"/>
        <category label="tableflow" term="tableflow"/>
        <category label="stream-designer" term="stream-designer"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GitHub Provider Update - April 2026]]></title>
        <id>https://stackql.io/blog/github-provider-april-2026-update</id>
        <link href="https://stackql.io/blog/github-provider-april-2026-update"/>
        <updated>2026-04-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Update to the StackQL GitHub provider adding six new services including agent_tasks, campaigns, classroom, hosted_compute, private_registries, and enterprise_teams, along with resource additions across existing services.]]></summary>
        <content type="html"><![CDATA[<p>We've released an update to the <a href="https://github-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong>StackQL GitHub provider</strong></a> adding new services and expanding coverage across several existing ones.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-services">New Services<a href="https://stackql.io/blog/github-provider-april-2026-update#new-services" class="hash-link" aria-label="Direct link to New Services" title="Direct link to New Services" translate="no">​</a></h2>
<p>Some of the newly added services of note include:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agent_tasks">agent_tasks<a href="https://stackql.io/blog/github-provider-april-2026-update#agent_tasks" class="hash-link" aria-label="Direct link to agent_tasks" title="Direct link to agent_tasks" translate="no">​</a></h3>
<p>The <code>agent_tasks</code> service exposes GitHub's AI agent task API, allowing you to query and manage agent task runs within a repository. Resources include:</p>
<table><thead><tr><th>Resource</th><th>Description</th></tr></thead><tbody><tr><td><code>agent_tasks</code></td><td>List, get, and manage agent task runs scoped to a repository</td></tr><tr><td><code>agent_task_steps</code></td><td>Retrieve individual step-level detail for an agent task run</td></tr><tr><td><code>agent_task_labels</code></td><td>Manage labels assigned to agent tasks</td></tr></tbody></table>
<p>This covers the audit and observability side of AI agent operations in GitHub - useful for tracking what agent tasks have run, their status, and step-level output.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="campaigns">campaigns<a href="https://stackql.io/blog/github-provider-april-2026-update#campaigns" class="hash-link" aria-label="Direct link to campaigns" title="Direct link to campaigns" translate="no">​</a></h3>
<p>The <code>campaigns</code> service covers GitHub's security campaign management, part of GitHub Advanced Security. Resources include:</p>
<table><thead><tr><th>Resource</th><th>Description</th></tr></thead><tbody><tr><td><code>campaigns</code></td><td>Create, list, get, update, and close security campaigns scoped to an organization</td></tr><tr><td><code>campaign_repositories</code></td><td>List repositories participating in a campaign</td></tr></tbody></table>
<p>Security campaigns let you coordinate remediation of code scanning or secret scanning alerts across an org. This service lets you query campaign state and participation programmatically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="classroom">classroom<a href="https://stackql.io/blog/github-provider-april-2026-update#classroom" class="hash-link" aria-label="Direct link to classroom" title="Direct link to classroom" translate="no">​</a></h3>
<p>The <code>classroom</code> service brings GitHub Classroom into StackQL. Resources include:</p>
<table><thead><tr><th>Resource</th><th>Description</th></tr></thead><tbody><tr><td><code>classrooms</code></td><td>List and get classrooms accessible to the authenticated user</td></tr><tr><td><code>assignments</code></td><td>List and get assignments within a classroom</td></tr><tr><td><code>accepted_assignments</code></td><td>Query student-accepted assignment repositories</td></tr><tr><td><code>assignment_grades</code></td><td>Retrieve grade data for accepted assignments</td></tr></tbody></table>
<p>This is useful for institutions managing GitHub Classroom at scale - querying assignment completion or generating reports across multiple classrooms.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hosted_compute">hosted_compute<a href="https://stackql.io/blog/github-provider-april-2026-update#hosted_compute" class="hash-link" aria-label="Direct link to hosted_compute" title="Direct link to hosted_compute" translate="no">​</a></h3>
<p>The <code>hosted_compute</code> service covers GitHub's hosted compute networking resources, relevant to organizations using GitHub-hosted runners with custom network configurations. Resources include:</p>
<table><thead><tr><th>Resource</th><th>Description</th></tr></thead><tbody><tr><td><code>hosted_compute_networks</code></td><td>Manage hosted compute network configurations at the org level</td></tr><tr><td><code>hosted_compute_network_settings</code></td><td>Query and update settings for a hosted compute network</td></tr></tbody></table>
<p>This is relevant if you're using GitHub's hosted compute with Azure private networking or similar integrations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="private_registries">private_registries<a href="https://stackql.io/blog/github-provider-april-2026-update#private_registries" class="hash-link" aria-label="Direct link to private_registries" title="Direct link to private_registries" translate="no">​</a></h3>
<p>The <code>private_registries</code> service exposes org-level private registry configurations - credentials and settings stored in GitHub for use by Actions workflows. Resources include:</p>
<table><thead><tr><th>Resource</th><th>Description</th></tr></thead><tbody><tr><td><code>org_private_registries</code></td><td>List, get, create, update, and delete private registry configurations for an organization</td></tr></tbody></table>
<p>This allows you to audit which private registries (npm, Docker Hub, Maven, etc.) are configured at the org level without going through the GitHub UI.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enterprise_teams">enterprise_teams<a href="https://stackql.io/blog/github-provider-april-2026-update#enterprise_teams" class="hash-link" aria-label="Direct link to enterprise_teams" title="Direct link to enterprise_teams" translate="no">​</a></h3>
<p>The <code>enterprise_teams</code> service provides enterprise-scoped team management, distinct from org-level teams. Resources include:</p>
<table><thead><tr><th>Resource</th><th>Description</th></tr></thead><tbody><tr><td><code>enterprise_teams</code></td><td>List and get teams at the enterprise level</td></tr><tr><td><code>enterprise_team_members</code></td><td>Query membership for enterprise teams</td></tr></tbody></table>
<p>This is useful for enterprises managing teams that span multiple organizations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updates">Updates<a href="https://stackql.io/blog/github-provider-april-2026-update#updates" class="hash-link" aria-label="Direct link to Updates" title="Direct link to Updates" translate="no">​</a></h2>
<p>Notable updates to existing services include:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="actions">actions<a href="https://stackql.io/blog/github-provider-april-2026-update#actions" class="hash-link" aria-label="Direct link to actions" title="Direct link to actions" translate="no">​</a></h3>
<p>New resources added to the <code>actions</code> service:</p>
<ul>
<li class=""><code>hosted_runners</code> - query and manage GitHub-hosted runner configurations at the org or repo level</li>
<li class=""><code>runner_group_network_configurations</code> - network config details for runner groups</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="orgs">orgs<a href="https://stackql.io/blog/github-provider-april-2026-update#orgs" class="hash-link" aria-label="Direct link to orgs" title="Direct link to orgs" translate="no">​</a></h3>
<ul>
<li class="">New <code>org_roles</code> and <code>org_role_assignments</code> resources for querying custom org role definitions and their assignments</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="repos">repos<a href="https://stackql.io/blog/github-provider-april-2026-update#repos" class="hash-link" aria-label="Direct link to repos" title="Direct link to repos" translate="no">​</a></h3>
<ul>
<li class="">New <code>repo_rules_suites</code> resource for querying rule suite evaluation history (useful for auditing branch protection rule evaluations)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get Started<a href="https://stackql.io/blog/github-provider-april-2026-update#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>Pull the latest GitHub provider:</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">stackql registry pull github</span><br></div></code></pre></div></div>
<p>Visit us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a> and let us know how you're using it.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="github" term="github"/>
        <category label="provider" term="provider"/>
        <category label="github actions" term="github actions"/>
        <category label="github classroom" term="github classroom"/>
        <category label="hosted compute" term="hosted compute"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[stackql-deploy 2.0 - Rewritten in Rust]]></title>
        <id>https://stackql.io/blog/stackql-deploy-2-0-rust-rewrite</id>
        <link href="https://stackql.io/blog/stackql-deploy-2-0-rust-rewrite"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[stackql-deploy 2.0 is a full rewrite in Rust - single static binary, no Python runtime, embedded StackQL server, and same CLI interface.]]></summary>
        <content type="html"><![CDATA[<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-rust">Why Rust<a href="https://stackql.io/blog/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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="embedded-postgres-wire-protocol-server">Embedded Postgres Wire Protocol Server<a href="https://stackql.io/blog/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>
<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>
<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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="additional-features-added">Additional Features Added<a href="https://stackql.io/blog/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>
<p>In addition to added the architectural change to use the embedded server, several other workflow improvements were added including:</p>
<ul>
<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>
<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>
<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>
<li class=""><strong>Improved logging and exception handling</strong>: Enhanced visibility simplifying troubleshooting.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://stackql.io/blog/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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage">Usage<a href="https://stackql.io/blog/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>
<p>The CLI interface is unchanged from the Python version:</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"># 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>
<p>Stack files and <code>stackql_manifest.yml</code> structure are unaffected - no migration work needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="python-package-deprecation">Python Package Deprecation<a href="https://stackql.io/blog/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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://stackql.io/blog/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>
<ul>
<li class="">GitHub: <a href="https://github.com/stackql/stackql-deploy" target="_blank" rel="noopener noreferrer" class="">github.com/stackql/stackql-deploy</a></li>
<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>
<li class="">StackQL docs: <a href="https://stackql.io/docs" target="_blank" rel="noopener noreferrer" class="">stackql.io/docs</a></li>
</ul>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="stackql-deploy" term="stackql-deploy"/>
        <category label="rust" term="rust"/>
        <category label="infrastructure-as-code" term="infrastructure-as-code"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Run StackQL Queries from the Databricks Web Terminal]]></title>
        <id>https://stackql.io/blog/stackql-in-databricks-web-terminal</id>
        <link href="https://stackql.io/blog/stackql-in-databricks-web-terminal"/>
        <updated>2026-02-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Run StackQL SQL queries against your Databricks workspace directly from the Databricks web terminal.]]></summary>
        <content type="html"><![CDATA[<p>If you have access to a Databricks workspace, you can run StackQL queries directly from the Databricks Web Terminal using your Databricks identity.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How It Works<a href="https://stackql.io/blog/stackql-in-databricks-web-terminal#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>Download the latest release of <code>stackql</code>, then run the convenience script included (similar scripts are included for other cloud provider terminals - e.g. AWS Cloud Shell).</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://bit.ly/stackql-zip -O &amp;&amp; unzip stackql-zip</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">sh stackql-databricks-shell.sh</span><br></div></code></pre></div></div>
<video controls="" width="100%" preload="metadata"><source src="https://pub-690c90d9ca2e4ad09b9455b620bd429f.r2.dev/databricks-stackql-web-terminal-demo.mp4" type="video/mp4"></video>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-queries">Example Queries<a href="https://stackql.io/blog/stackql-in-databricks-web-terminal#example-queries" class="hash-link" aria-label="Direct link to Example Queries" title="Direct link to Example Queries" translate="no">​</a></h2>
<p>Here are the sample queries run in the video, just change the <code>deployment_name</code> for your workspace.</p>
<p><strong>User entitlements</strong></p>
<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">  deployment_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">  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">  userName</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">  displayName</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">  entitlement</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"> databricks_workspace</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">vw_user_entitlements</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"> deployment_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)">'dbc-74aa95f7-8c7e'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p><strong>All workspace settings</strong></p>
<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><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">  databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">settings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">vw_all_settings</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"> deployment_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)">'dbc-74aa95f7-8c7e'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p><strong>Tag policies filtered by key prefix</strong></p>
<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">  tag_key </span><span class="token keyword" style="color:rgb(127, 219, 202)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">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">  description</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"> databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">tags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">tag_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"> deployment_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)">'dbc-74aa95f7-8c7e'</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"> tag_key </span><span class="token operator" style="color:rgb(127, 219, 202)">LIKE</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">'class%'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p><strong>Catalog count by type</strong></p>
<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">  catalog_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">  </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"> num_catalogs</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"> databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">catalog</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">catalogs</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"> deployment_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)">'dbc-74aa95f7-8c7e'</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)">GROUP</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">BY</span><span class="token plain"> catalog_type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-coverage">Provider Coverage<a href="https://stackql.io/blog/stackql-in-databricks-web-terminal#provider-coverage" class="hash-link" aria-label="Direct link to Provider Coverage" title="Direct link to Provider Coverage" translate="no">​</a></h2>
<p>The <code>databricks_workspace</code> provider covers workspace related services, the <code>databricks_account</code> provider covers account-level operations including provisioning, billing, and account IAM.</p>
<p>The web terminal flow covers workspace-scoped queries using the token of the logged-in user. For account-level queries (provisioning, billing, account IAM), you need a Databricks service principal with account admin rights and OAuth2 credentials:</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">export DATABRICKS_ACCOUNT_ID="your-account-id"</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export DATABRICKS_CLIENT_ID="your-client-id"</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export DATABRICKS_CLIENT_SECRET="your-client-secret"</span><br></div></code></pre></div></div>
<p>These are the same variables used by the Databricks CLI and Terraform provider, so if you already have those configured the auth story is identical.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get Started<a href="https://stackql.io/blog/stackql-in-databricks-web-terminal#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>Full provider documentation:</p>
<ul>
<li class=""><a href="https://databricks-workspace-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Databricks Workspace Provider for StackQL</strong></a></li>
<li class=""><a href="https://databricks-account-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Databricks Account Provider for StackQL</strong></a></li>
</ul>
<p>Visti <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>StackQL on GitHub</strong></a>.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="databricks" term="databricks"/>
        <category label="sql" term="sql"/>
        <category label="databricks workspace" term="databricks workspace"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New Databricks Providers for StackQL Released]]></title>
        <id>https://stackql.io/blog/new-databricks-providers-available</id>
        <link href="https://stackql.io/blog/new-databricks-providers-available"/>
        <updated>2026-02-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Updated providers for Databricks released covering account and workspace operations, with over 30 services, 300 resources, and nearly 1,000 operations queryable using SQL.]]></summary>
        <content type="html"><![CDATA[<p>Updated StackQL providers for Databricks are now available: <a href="https://databricks-account-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>databricks_account</code></strong></a> and <a href="https://databricks-workspace-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong><code>databricks_workspace</code></strong></a>, giving you SQL access to the full Databricks control plane across account-level and workspace-level operations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-structure">Provider Structure<a href="https://stackql.io/blog/new-databricks-providers-available#provider-structure" class="hash-link" aria-label="Direct link to Provider Structure" title="Direct link to Provider Structure" translate="no">​</a></h2>
<p>The following updated providers are available:</p>
<table><thead><tr><th>Provider</th><th>Scope</th><th>Services</th></tr></thead><tbody><tr><td><code>databricks_account</code></td><td>Account</td><td>8</td></tr><tr><td><code>databricks_workspace</code></td><td>Workspace</td><td>26</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="coverage">Coverage<a href="https://stackql.io/blog/new-databricks-providers-available#coverage" class="hash-link" aria-label="Direct link to Coverage" title="Direct link to Coverage" translate="no">​</a></h2>
<p>There are over <strong>30 services</strong>, <strong>300+ resources</strong>, and <strong>983 operations</strong> spanning IAM, compute, catalog, billing, jobs, ML, serving, sharing, vector search, and more.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-queries">Example Queries<a href="https://stackql.io/blog/new-databricks-providers-available#example-queries" class="hash-link" aria-label="Direct link to Example Queries" title="Direct link to Example Queries" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="list-workspaces-in-an-account">List workspaces in an account<a href="https://stackql.io/blog/new-databricks-providers-available#list-workspaces-in-an-account" class="hash-link" aria-label="Direct link to List workspaces in an account" title="Direct link to List workspaces in an account" translate="no">​</a></h3>
<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">  workspace_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">  workspace_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">  workspace_status</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">  aws_region</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">  compute_mode</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">  deployment_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 keyword" style="color:rgb(127, 219, 202)">datetime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">creation_time</span><span class="token operator" style="color:rgb(127, 219, 202)">/</span><span class="token number" style="color:rgb(247, 140, 108)">1000</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)">'unixepoch'</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"> creation_date_time</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"> databricks_account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">provisioning</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">workspaces</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"> account_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)">'ebfcc5a9-9d49-4c93-b651-b3ee6cf1c9ce'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="query-account-users-and-roles">Query account users and roles<a href="https://stackql.io/blog/new-databricks-providers-available#query-account-users-and-roles" class="hash-link" aria-label="Direct link to Query account users and roles" title="Direct link to Query account users and roles" translate="no">​</a></h3>
<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">  id </span><span class="token keyword" style="color:rgb(127, 219, 202)">as</span><span class="token plain"> user_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">  displayName </span><span class="token keyword" style="color:rgb(127, 219, 202)">as</span><span class="token plain"> display_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">  userName </span><span class="token keyword" style="color:rgb(127, 219, 202)">as</span><span class="token plain"> user_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">  active</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">  IIF</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">roles</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(173, 219, 103)">'$[0].value'</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)">'account_admin'</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)">'true'</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)">'false'</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"> is_account_admin</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"> databricks_account</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">account_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)">WHERE</span><span class="token plain"> account_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)">'ebfcc5a9-9d49-4c93-b651-b3ee6cf1c9ce'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="list-catalogs-in-a-workspace">List catalogs in a workspace<a href="https://stackql.io/blog/new-databricks-providers-available#list-catalogs-in-a-workspace" class="hash-link" aria-label="Direct link to List catalogs in a workspace" title="Direct link to List catalogs in a workspace" translate="no">​</a></h3>
<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">  full_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">  catalog_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">  </span><span class="token keyword" style="color:rgb(127, 219, 202)">comment</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)">datetime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">created_at</span><span class="token operator" style="color:rgb(127, 219, 202)">/</span><span class="token number" style="color:rgb(247, 140, 108)">1000</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)">'unixepoch'</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"> created_at</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">  created_by</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)">datetime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">updated_at</span><span class="token operator" style="color:rgb(127, 219, 202)">/</span><span class="token number" style="color:rgb(247, 140, 108)">1000</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)">'unixepoch'</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"> updated_at</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">  updated_by</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">  enable_predictive_optimization</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"> databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">catalog</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">catalogs</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"> deployment_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)">'dbc-36ff48e3-4a69'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="download-billable-usage-to-csv">Download billable usage to CSV<a href="https://stackql.io/blog/new-databricks-providers-available#download-billable-usage-to-csv" class="hash-link" aria-label="Direct link to Download billable usage to CSV" title="Direct link to Download billable usage to CSV" translate="no">​</a></h3>
<p>This one is worth calling out. You can pull billable usage data for a given period and write it straight to a CSV file:</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">./stackql exec \</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  -o text \</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  --hideheaders \</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  -f billable_usage.csv \</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  "SELECT contents</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  FROM databricks_account.billing.billable_usage</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  WHERE start_month = '2025-12'</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  AND end_month = '2026-01'</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  AND account_id = 'your-account-id'"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication">Authentication<a href="https://stackql.io/blog/new-databricks-providers-available#authentication" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication" translate="no">​</a></h2>
<p>Both providers authenticate using OAuth2 with a Databricks service principal. Set the following environment variables:</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">export DATABRICKS_ACCOUNT_ID="your-account-id"</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export DATABRICKS_CLIENT_ID="your-client-id"</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">export DATABRICKS_CLIENT_SECRET="your-client-secret"</span><br></div></code></pre></div></div>
<p>These are the same variables used by Terraform, the Databricks SDKs, and the Databricks CLI.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get Started<a href="https://stackql.io/blog/new-databricks-providers-available#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>Pull the providers:</p>
<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">registry pull databricks_account</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">registry pull databricks_workspace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Start querying via the <code>shell</code> or <code>exec</code>:</p>
<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><span class="token keyword" style="color:rgb(127, 219, 202)">FROM</span><span class="token plain"> databricks_account</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">account_groups </span><span class="token keyword" style="color:rgb(127, 219, 202)">WHERE</span><span class="token plain"> account_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)">'your-account-id'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<p>Full documentation is available at <a href="https://databricks-account-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">databricks-account-provider.stackql.io</a> and <a href="https://databricks-workspace-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class="">databricks-workspace-provider.stackql.io</a>. Let us know what you think on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a>.</p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="databricks" term="databricks"/>
        <category label="provider" term="provider"/>
        <category label="infrastructure-as-code" term="infrastructure-as-code"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New Dedicated AWS Cloud Control Provider Released]]></title>
        <id>https://stackql.io/blog/new-awscc-provider-available</id>
        <link href="https://stackql.io/blog/new-awscc-provider-available"/>
        <updated>2026-01-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introducing the standalone StackQL AWS Cloud Control provider with full CRUDL support, optimized resource naming, and comprehensive coverage of AWS Cloud Control API resources.]]></summary>
        <content type="html"><![CDATA[<p>We've released a new dedicated <a href="https://awscc-provider.stackql.io/" target="_blank" rel="noopener noreferrer" class=""><strong>StackQL AWS Cloud Control provider</strong></a>, providing full CRUDL operations across AWS services via the Cloud Control API including purpose-built resource definitions leveraging Cloud Control's consistent schema.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resource-naming-convention">Resource Naming Convention<a href="https://stackql.io/blog/new-awscc-provider-available#resource-naming-convention" class="hash-link" aria-label="Direct link to Resource Naming Convention" title="Direct link to Resource Naming Convention" translate="no">​</a></h2>
<p>Resources follow a clear pattern to differentiate operations:</p>
<table><thead><tr><th>Resource Pattern</th><th>Operations</th><th>Use Case</th></tr></thead><tbody><tr><td><code>{resource}</code> (e.g., <code>s3.buckets</code>)</td><td><code>SELECT</code>, <code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code></td><td>Full CRUD with complete resource properties</td></tr><tr><td><code>{resource}_list_only</code> (e.g., <code>s3.buckets_list_only</code>)</td><td><code>SELECT</code></td><td>Fast enumeration of resource identifiers</td></tr></tbody></table>
<br>
<p>This separation means listing thousands of resources won't trigger rate limits from individual <code>GET</code> calls:</p>
<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">-- Fast enumeration (list operation only)</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"> bucket_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"> awscc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">s3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">buckets_list_only </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><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">-- Full resource details (get operation)</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 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"> awscc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">s3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">buckets </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 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"> data__Identifier </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)">'my-bucket'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-coverage">Provider Coverage<a href="https://stackql.io/blog/new-awscc-provider-available#provider-coverage" class="hash-link" aria-label="Direct link to Provider Coverage" title="Direct link to Provider Coverage" translate="no">​</a></h2>
<p>The <code>awscc</code> provider includes:</p>
<ul>
<li class=""><strong>237 services</strong> and <strong>2371 resources</strong> covering the breadth of AWS</li>
<li class=""><strong>Full CRUDL support</strong> for all Cloud Control compatible resources</li>
<li class=""><strong>Consistent schema</strong> derived from AWS CloudFormation resource specifications</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-operations">Example Operations<a href="https://stackql.io/blog/new-awscc-provider-available#example-operations" class="hash-link" aria-label="Direct link to Example Operations" title="Direct link to Example Operations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-an-s3-bucket">Create an S3 Bucket<a href="https://stackql.io/blog/new-awscc-provider-available#create-an-s3-bucket" class="hash-link" aria-label="Direct link to Create an S3 Bucket" title="Direct link to Create an S3 Bucket" translate="no">​</a></h3>
<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)">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">INTO</span><span class="token plain"> awscc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">s3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">buckets </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">  BucketName</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">  region</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)">'my-new-bucket'</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)">'us-east-1'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="query-ec2-instances">Query EC2 Instances<a href="https://stackql.io/blog/new-awscc-provider-available#query-ec2-instances" class="hash-link" aria-label="Direct link to Query EC2 Instances" title="Direct link to Query EC2 Instances" translate="no">​</a></h3>
<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">  instance_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">  instance_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">  tags</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"> awscc</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</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)">'ap-southeast-2'</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"> data__Identifier </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)">'i-1234567890abcdef0'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="delete-a-resource">Delete a Resource<a href="https://stackql.io/blog/new-awscc-provider-available#delete-a-resource" class="hash-link" aria-label="Direct link to Delete a Resource" title="Direct link to Delete a Resource" translate="no">​</a></h3>
<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)">DELETE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">FROM</span><span class="token plain"> awscc</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"> data__Identifier </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)">'my-function'</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"> 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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-documentation">Enhanced Documentation<a href="https://stackql.io/blog/new-awscc-provider-available#enhanced-documentation" class="hash-link" aria-label="Direct link to Enhanced Documentation" title="Direct link to Enhanced Documentation" translate="no">​</a></h2>
<p>The provider documentation at <a href="https://awscc.stackql.io/providers/awscc/" target="_blank" rel="noopener noreferrer" class="">awscc.stackql.io</a> now features:</p>
<ul>
<li class=""><strong>Interactive schema explorer</strong> with expandable nested property trees</li>
<li class=""><strong>Complete field documentation</strong> including complex object structures</li>
<li class=""><strong>Ready-to-use SQL examples</strong> for <code>SELECT</code>, <code>INSERT</code>, and <code>DELETE</code> operations</li>
<li class=""><strong>IAM permissions reference</strong> for each resource operation</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get Started<a href="https://stackql.io/blog/new-awscc-provider-available#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>Pull the new provider:</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">stackql registry pull awscc</span><br></div></code></pre></div></div>
<p>Query your AWS resources:</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">stackql shell</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">&gt;&gt; SELECT region, bucket_name FROM awscc.s3.buckets_list_only WHERE region = 'us-east-1';</span><br></div></code></pre></div></div>
<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>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="aws" term="aws"/>
        <category label="awscc" term="awscc"/>
        <category label="cloud control" term="cloud control"/>
        <category label="provider" term="provider"/>
        <category label="infrastructure-as-code" term="infrastructure-as-code"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[StackQL Joins the Linux Foundation and Agentic AI Foundation]]></title>
        <id>https://stackql.io/blog/stackql-joins-linux-foundation-agentic-ai-foundation</id>
        <link href="https://stackql.io/blog/stackql-joins-linux-foundation-agentic-ai-foundation"/>
        <updated>2026-01-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[StackQL Studios joins the Linux Foundation and Agentic AI Foundation as a Silver Member.]]></summary>
        <content type="html"><![CDATA[<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>
<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>
<p>StackQL Studios has joined the Linux Foundation and the Agentic AI Foundation (AAIF) as a Silver Member.</p>
<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>
<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>
<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>
<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>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="open-source" term="open-source"/>
        <category label="linux-foundation" term="linux-foundation"/>
        <category label="agentic-ai" term="agentic-ai"/>
        <category label="mcp" term="mcp"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Google Provider Update - December 2025]]></title>
        <id>https://stackql.io/blog/google-provider-december-2025-update</id>
        <link href="https://stackql.io/blog/google-provider-december-2025-update"/>
        <updated>2025-12-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Major update to the StackQL Google provider featuring a new Speech-to-Text v2 service, enhanced Vertex AI with RAG capabilities, and significant improvements across BigQuery, Spanner, and 15+ other Google Cloud services.]]></summary>
        <content type="html"><![CDATA[<p>We've released a major update to the <a href="https://stackql.io/docs/providers" target="_blank" rel="noopener noreferrer" class=""><strong>StackQL Google provider</strong></a> with a new service, enhanced AI/ML capabilities, and improvements across 177 service files.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-service-speech-to-text-v2">New Service: Speech-to-Text v2<a href="https://stackql.io/blog/google-provider-december-2025-update#new-service-speech-to-text-v2" class="hash-link" aria-label="Direct link to New Service: Speech-to-Text v2" title="Direct link to New Service: Speech-to-Text v2" translate="no">​</a></h2>
<p>The <code>speechv2</code> service brings Cloud Speech-to-Text API v2 to StackQL with 6 resources:</p>
<table><thead><tr><th>Resource</th><th>Description</th></tr></thead><tbody><tr><td><code>recognizers</code></td><td>Manage speech recognition configurations with create, list, get, patch, delete, undelete, recognize, and batch_recognize methods</td></tr><tr><td><code>custom_classes</code></td><td>Create custom vocabulary classes for improved recognition accuracy</td></tr><tr><td><code>phrase_sets</code></td><td>Define phrase hints to boost recognition of specific terms</td></tr><tr><td><code>config</code></td><td>Manage location-level Speech-to-Text configuration</td></tr><tr><td><code>locations</code></td><td>Query available service locations</td></tr><tr><td><code>operations</code></td><td>Track long-running operations</td></tr></tbody></table>
<p>Key features include support for multiple audio encodings (WAV, FLAC, MP3, OGG, WebM, MP4/AAC), translation capabilities, denoiser config, and KMS encryption support.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vertex-ai--ai-platform">Vertex AI / AI Platform<a href="https://stackql.io/blog/google-provider-december-2025-update#vertex-ai--ai-platform" class="hash-link" aria-label="Direct link to Vertex AI / AI Platform" title="Direct link to Vertex AI / AI Platform" translate="no">​</a></h2>
<p>The largest update in this release with 87,000+ line changes introduces powerful new RAG and evaluation capabilities:</p>
<ul>
<li class=""><strong>RAG Resources</strong>: <code>rag_corpora</code>, <code>rag_files</code>, <code>rag_engine_config</code> for Retrieval-Augmented Generation</li>
<li class=""><strong>Conversational AI</strong>: New <code>chat</code> resource</li>
<li class=""><strong>Model Evaluation</strong>: <code>evaluation_sets</code> and <code>evaluation_items</code> for systematic model assessment</li>
<li class=""><strong>New Resources</strong>: <code>science</code>, <code>invoke</code>, and <code>openapi</code> resources</li>
<li class=""><strong>Performance</strong>: Enhanced <code>cache_config</code> for caching configurations</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="discovery-engine">Discovery Engine<a href="https://stackql.io/blog/google-provider-december-2025-update#discovery-engine" class="hash-link" aria-label="Direct link to Discovery Engine" title="Direct link to Discovery Engine" translate="no">​</a></h2>
<p>Major enhancements (50,000+ line changes) for search and conversational AI:</p>
<ul>
<li class="">New <code>assistants</code> resource</li>
<li class="">New <code>sitemaps</code> resource for site search</li>
<li class="">New <code>custom_models</code> resource</li>
<li class="">Enhanced <code>sessions</code> and <code>answers</code> for conversational search</li>
<li class="">New <code>authorized_views</code> and <code>authorized_view_sets</code> for access control</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact-center-ai-insights">Contact Center AI Insights<a href="https://stackql.io/blog/google-provider-december-2025-update#contact-center-ai-insights" class="hash-link" aria-label="Direct link to Contact Center AI Insights" title="Direct link to Contact Center AI Insights" translate="no">​</a></h2>
<p>Quality assurance and analytics improvements (20,000+ line changes):</p>
<ul>
<li class="">New <code>qa_questions</code> and <code>qa_question_tags</code> for quality assurance workflows</li>
<li class="">New <code>analysis_rules</code> resource</li>
<li class="">New <code>segments</code> resource</li>
<li class="">New <code>authorized_views</code> with IAM policy support</li>
<li class="">New <code>datasets</code> and <code>views</code> resources</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bigquery">BigQuery<a href="https://stackql.io/blog/google-provider-december-2025-update#bigquery" class="hash-link" aria-label="Direct link to BigQuery" title="Direct link to BigQuery" translate="no">​</a></h2>
<p>Enhanced governance and access control (18,000+ line changes):</p>
<ul>
<li class="">New <code>routines_iam_policies</code> for stored procedure/function IAM</li>
<li class="">Enhanced <code>row_access_policies</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="healthcare-api">Healthcare API<a href="https://stackql.io/blog/google-provider-december-2025-update#healthcare-api" class="hash-link" aria-label="Direct link to Healthcare API" title="Direct link to Healthcare API" translate="no">​</a></h2>
<p>Expanded metrics and data mapping (15,000+ line changes):</p>
<ul>
<li class="">New <code>data_mapper_workspaces_iam_policies</code></li>
<li class="">Enhanced metrics: <code>hl7_v2_store_metrics</code>, <code>dicom_store_metrics</code>, <code>series_metrics</code>, <code>study_metrics</code></li>
<li class="">New <code>instances_storage_info</code> resource</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-spanner">Cloud Spanner<a href="https://stackql.io/blog/google-provider-december-2025-update#cloud-spanner" class="hash-link" aria-label="Direct link to Cloud Spanner" title="Direct link to Cloud Spanner" translate="no">​</a></h2>
<p>Backup and security enhancements (14,000+ line changes):</p>
<ul>
<li class="">New <code>backup_schedules</code> with IAM support</li>
<li class="">New <code>databases_split_points</code> resource</li>
<li class="">New <code>database_roles</code> with IAM policies</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-sql-admin">Cloud SQL Admin<a href="https://stackql.io/blog/google-provider-december-2025-update#cloud-sql-admin" class="hash-link" aria-label="Direct link to Cloud SQL Admin" title="Direct link to Cloud SQL Admin" translate="no">​</a></h2>
<p>New integration and management features (12,000+ line changes):</p>
<ul>
<li class="">New <code>instances_entra_id_certificate</code> for Microsoft Entra ID integration</li>
<li class="">New <code>instances_disk_shrink_config</code></li>
<li class="">New <code>instances_latest_recovery_time</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gke-on-prem">GKE On-Prem<a href="https://stackql.io/blog/google-provider-december-2025-update#gke-on-prem" class="hash-link" aria-label="Direct link to GKE On-Prem" title="Direct link to GKE On-Prem" translate="no">​</a></h2>
<p>Enhanced IAM across VMware and Bare Metal clusters (9,000+ line changes):</p>
<ul>
<li class="">Enhanced VMware cluster resources with IAM policies</li>
<li class="">Enhanced Bare Metal cluster resources with IAM policies</li>
<li class="">New <code>vmware_node_pools</code> and <code>bare_metal_node_pools</code> with IAM</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developer-connect">Developer Connect<a href="https://stackql.io/blog/google-provider-december-2025-update#developer-connect" class="hash-link" aria-label="Direct link to Developer Connect" title="Direct link to Developer Connect" translate="no">​</a></h2>
<p>Git integration improvements (3,500+ line changes):</p>
<ul>
<li class="">New <code>git_repository_links_git_refs</code> resource</li>
<li class="">New <code>users_self</code> and <code>users_access_token</code> resources</li>
<li class="">New token resources: <code>read_token</code>, <code>read_write_token</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="text-to-speech">Text-to-Speech<a href="https://stackql.io/blog/google-provider-december-2025-update#text-to-speech" class="hash-link" aria-label="Direct link to Text-to-Speech" title="Direct link to Text-to-Speech" translate="no">​</a></h2>
<p>Enhanced <code>voices</code> and <code>text</code> resources with new capabilities.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get Started<a href="https://stackql.io/blog/google-provider-december-2025-update#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>Update to the latest Google provider:</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">stackql registry pull google</span><br></div></code></pre></div></div>
<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>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="google cloud" term="google cloud"/>
        <category label="gcp" term="gcp"/>
        <category label="provider" term="provider"/>
        <category label="vertex ai" term="vertex ai"/>
        <category label="speech-to-text" term="speech-to-text"/>
        <category label="bigquery" term="bigquery"/>
        <category label="spanner" term="spanner"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Window Functions and CTEs Now Available in StackQL]]></title>
        <id>https://stackql.io/blog/window-functions-and-ctes-now-available</id>
        <link href="https://stackql.io/blog/window-functions-and-ctes-now-available"/>
        <updated>2025-12-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Window functions and Common Table Expressions (CTEs) are now available in StackQL for advanced analytics across cloud and SaaS resources.]]></summary>
        <content type="html"><![CDATA[<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="window-functions">Window Functions<a href="https://stackql.io/blog/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>
<p>Window functions allow you to perform calculations across sets of rows related to the current row. Supported functions include:</p>
<ul>
<li class=""><strong>Ranking</strong>: <code>ROW_NUMBER()</code>, <code>RANK()</code>, <code>DENSE_RANK()</code>, <code>NTILE()</code></li>
<li class=""><strong>Offset</strong>: <code>LAG()</code>, <code>LEAD()</code>, <code>FIRST_VALUE()</code>, <code>LAST_VALUE()</code>, <code>NTH_VALUE()</code></li>
<li class=""><strong>Distribution</strong>: <code>PERCENT_RANK()</code>, <code>CUME_DIST()</code></li>
<li class=""><strong>Aggregates as window functions</strong>: <code>SUM()</code>, <code>COUNT()</code>, <code>AVG()</code>, etc. with <code>OVER</code> clause</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-ranking-contributors">Example: Ranking Contributors<a href="https://stackql.io/blog/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>
<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>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-running-totals">Example: Running Totals<a href="https://stackql.io/blog/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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-table-expressions-ctes">Common Table Expressions (CTEs)<a href="https://stackql.io/blog/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>
<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>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-aggregating-across-multiple-resources">Example: Aggregating Across Multiple Resources<a href="https://stackql.io/blog/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>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation">Documentation<a href="https://stackql.io/blog/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>
<p>Full documentation is available:</p>
<ul>
<li class=""><a class="" href="https://stackql.io/docs/language-spec/functions/window/row_number">Window Functions</a></li>
<li class=""><a class="" href="https://stackql.io/docs/language-spec/with">WITH (CTEs)</a></li>
<li class=""><a class="" href="https://stackql.io/docs/language-spec/select">SELECT</a></li>
</ul>
<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>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="analytics" term="analytics"/>
        <category label="window functions" term="window functions"/>
        <category label="cte" term="cte"/>
        <category label="sql" term="sql"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[StackQL Provider Development Skill for Claude]]></title>
        <id>https://stackql.io/blog/stackql-provider-development-skill-for-claude</id>
        <link href="https://stackql.io/blog/stackql-provider-development-skill-for-claude"/>
        <updated>2025-11-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A Claude Skill for developing StackQL providers, covering OpenAPI extensions, resource definitions, SQL verb mappings, and more.]]></summary>
        <content type="html"><![CDATA[<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-in-the-skill">What's in the Skill<a href="https://stackql.io/blog/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>
<p>The skill covers the full provider development workflow:</p>
<ul>
<li class=""><strong>Provider document structure</strong> - The <code>provider.yaml</code> schema and service document layout</li>
<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>
<li class=""><strong>Resource and method definitions</strong> - How to define resources, map methods to operations, and configure responses</li>
<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>
<li class=""><strong>Authentication patterns</strong> - API keys, service accounts, OAuth, and custom auth schemes</li>
<li class=""><strong>Pagination handling</strong> - Request/response token configuration</li>
<li class=""><strong>Response processing</strong> - JSONPath extraction, transformations, and schema handling</li>
</ul>
<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>
<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>
<li class="">In Claude, go to your Project settings</li>
<li class="">Add the skill file to your Project Knowledge</li>
</ol><p>Once added, Claude will automatically apply this knowledge when you're working on StackQL provider development.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="download">Download<a href="https://stackql.io/blog/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>
<p>Grab the skill from the any-sdk repository:</p>
<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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage">Usage<a href="https://stackql.io/blog/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>
<p>With the skill loaded, you can ask Claude things like:</p>
<ul>
<li class=""><em>"Create a provider definition for this API"</em></li>
<li class=""><em>"How do I map this endpoint to a SELECT operation?"</em></li>
<li class=""><em>"What's the correct objectKey syntax for this nested response?"</em></li>
<li class=""><em>"Help me configure pagination for this API"</em></li>
</ul>
<p>Claude will have the full context of StackQL's OpenAPI extensions and provider patterns to work from.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example">Example<a href="https://stackql.io/blog/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>
<p>Here's a sample interaction after loading the skill:</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">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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://stackql.io/blog/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>
<ul>
<li class=""><a href="https://github.com/stackql/stackql-provider-registry" target="_blank" rel="noopener noreferrer" class="">StackQL Provider Registry</a></li>
<li class=""><a href="https://github.com/stackql/any-sdk" target="_blank" rel="noopener noreferrer" class="">any-sdk documentation</a></li>
<li class=""><a href="https://stackql.io/docs" target="_blank" rel="noopener noreferrer" class="">StackQL documentation</a></li>
</ul>
<p>⭐ Star us on <a href="https://github.com/stackql/stackql" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub</strong></a></p>]]></content>
        <author>
            <name>Jeffrey Aven</name>
            <uri>https://www.linkedin.com/in/jeffreyaven/</uri>
        </author>
        <category label="stackql" term="stackql"/>
        <category label="claude" term="claude"/>
        <category label="ai" term="ai"/>
        <category label="provider development" term="provider development"/>
    </entry>
</feed>