<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>NOCFoundry Docs</title><link>https://docs.nocfoundry.dev/dev/</link><description>Recent content on NOCFoundry Docs</description><generator>Hugo</generator><language>en</language><atom:link href="https://docs.nocfoundry.dev/dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Local Quickstart</title><link>https://docs.nocfoundry.dev/dev/getting-started/local-quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/getting-started/local-quickstart/</guid><description>&lt;h1 id="local-quickstart">Local Quickstart&lt;/h1>
&lt;p>This quickstart gets a local NOCFoundry instance running with the validation demo and UI.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;ul>
&lt;li>Go 1.25 or later&lt;/li>
&lt;li>Docker if you want the local Keycloak flow&lt;/li>
&lt;li>a shell with access to this repository&lt;/li>
&lt;/ul>
&lt;h2 id="optional-start-the-local-sr-linux-topology">Optional: start the local SR Linux topology&lt;/h2>
&lt;p>If you want to test against a realistic network fabric instead of static examples,
use the containerlab topology in &lt;code>examples/containerlab/&lt;/code>.&lt;/p>
&lt;p>Install containerlab only when you need it:&lt;/p></description></item><item><title>MCP Client Quickstart</title><link>https://docs.nocfoundry.dev/dev/getting-started/mcp-client-quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/getting-started/mcp-client-quickstart/</guid><description>&lt;h1 id="mcp-client-quickstart">MCP Client Quickstart&lt;/h1>
&lt;p>NOCFoundry exposes the Model Context Protocol at:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">http://127.0.0.1:5000/mcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With the protected validation example, &lt;code>/mcp&lt;/code> is protected by OIDC endpoint auth.&lt;/p>
&lt;h2 id="what-clients-need">What clients need&lt;/h2>
&lt;ul>
&lt;li>the MCP endpoint URL&lt;/li>
&lt;li>an access token whose &lt;code>aud&lt;/code> matches the configured &lt;code>/mcp&lt;/code> audience&lt;/li>
&lt;li>support for bearer tokens on HTTP-based MCP transports&lt;/li>
&lt;/ul>
&lt;p>The protected resource metadata is served from:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">/.well-known/oauth-protected-resource/mcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="minimal-connection-model">Minimal connection model&lt;/h2>
&lt;ol>
&lt;li>Start NOCFoundry with &lt;code>examples/tools-configs/keycloak-protected-validation.yaml&lt;/code> and &lt;code>examples/server-configs/protected-api-mcp-ui.yaml&lt;/code>.&lt;/li>
&lt;li>Obtain an access token from Keycloak.&lt;/li>
&lt;li>Configure your MCP client to connect to &lt;code>http://127.0.0.1:5000/mcp&lt;/code>.&lt;/li>
&lt;li>Supply &lt;code>Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code> on every HTTP request.&lt;/li>
&lt;/ol>
&lt;h2 id="audience-reminder">Audience reminder&lt;/h2>
&lt;p>The access token must match the &lt;code>/mcp&lt;/code> audience configured in:&lt;/p></description></item><item><title>Tool Catalogs</title><link>https://docs.nocfoundry.dev/dev/configuration/tool-catalogs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/configuration/tool-catalogs/</guid><description>&lt;h1 id="tool-catalogs">Tool Catalogs&lt;/h1>
&lt;p>Tool catalogs define the operational resources NOCFoundry loads at startup.&lt;/p>
&lt;h2 id="supported-catalog-flags">Supported catalog flags&lt;/h2>
&lt;ul>
&lt;li>&lt;code>--tools-file&lt;/code>&lt;/li>
&lt;li>&lt;code>--tools-files&lt;/code>&lt;/li>
&lt;li>&lt;code>--tools-folder&lt;/code>&lt;/li>
&lt;li>&lt;code>--prebuilt&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>These are mutually exclusive where appropriate:&lt;/p>
&lt;ul>
&lt;li>&lt;code>--tools-file&lt;/code>, &lt;code>--tools-files&lt;/code>, and &lt;code>--tools-folder&lt;/code> cannot be combined&lt;/li>
&lt;li>&lt;code>--prebuilt&lt;/code> can be combined with custom tool catalogs when you want bundled capabilities plus your own configs&lt;/li>
&lt;/ul>
&lt;h2 id="what-a-catalog-can-contain">What a catalog can contain&lt;/h2>
&lt;p>Tool catalogs can define:&lt;/p>
&lt;ul>
&lt;li>sources&lt;/li>
&lt;li>device groups&lt;/li>
&lt;li>auth services&lt;/li>
&lt;li>tools&lt;/li>
&lt;li>toolsets&lt;/li>
&lt;li>prompts&lt;/li>
&lt;li>promptsets&lt;/li>
&lt;li>embedding models&lt;/li>
&lt;/ul>
&lt;h2 id="prebuilt-catalogs">Prebuilt catalogs&lt;/h2>
&lt;p>&lt;code>--prebuilt&lt;/code> takes a bundled catalog name, not an individual tool name.&lt;/p></description></item><item><title>Server Config</title><link>https://docs.nocfoundry.dev/dev/configuration/server-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/configuration/server-config/</guid><description>&lt;h1 id="server-config">Server Config&lt;/h1>
&lt;p>&lt;code>--server-config&lt;/code> carries server-wide runtime policy that should not be owned by individual tool catalog files.&lt;/p>
&lt;h2 id="current-focus">Current focus&lt;/h2>
&lt;p>Today, the most important server config capabilities are:&lt;/p>
&lt;ul>
&lt;li>endpoint auth for &lt;code>/api&lt;/code>&lt;/li>
&lt;li>endpoint auth for &lt;code>/mcp&lt;/code>&lt;/li>
&lt;li>browser UI auth configuration for PKCE login&lt;/li>
&lt;/ul>
&lt;h2 id="example">Example&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">auth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">endpointAuth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">api&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">enabled&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">authServices&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;noc-keycloak&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">audience&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${NOCFOUNDRY_BASE_URL:http://127.0.0.1:5000}/api&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">mcp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">enabled&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">authServices&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;noc-keycloak&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">audience&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${NOCFOUNDRY_BASE_URL:http://127.0.0.1:5000}/mcp&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ui&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">enabled&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">authService&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">noc-keycloak&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">clientId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${KEYCLOAK_UI_CLIENT_ID:noc-foundry-ui}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">scopes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;openid&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;profile&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;email&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">redirectPath&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/ui/auth/callback&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="rules-to-remember">Rules to remember&lt;/h2>
&lt;ul>
&lt;li>endpoint auth policy is global to the server, not per tool catalog&lt;/li>
&lt;li>auth services are still defined in tool catalogs and referenced here by name&lt;/li>
&lt;li>UI login depends on API endpoint auth being enabled&lt;/li>
&lt;/ul>
&lt;h2 id="start-command">Start command&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./nocfoundry &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --tools-file examples/tools-configs/keycloak-protected-validation.yaml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --server-config examples/server-configs/protected-api-mcp-ui.yaml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --validation-config examples/validation-runtime-configs/durable-validation-sqlite.yaml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --ui
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Validation Runtime</title><link>https://docs.nocfoundry.dev/dev/configuration/validation-runtime/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/configuration/validation-runtime/</guid><description>&lt;h1 id="validation-runtime">Validation Runtime&lt;/h1>
&lt;p>&lt;code>--validation-config&lt;/code> controls how validation runs are executed and stored.&lt;/p>
&lt;h2 id="key-runtime-settings">Key runtime settings&lt;/h2>
&lt;ul>
&lt;li>&lt;code>executionBackend&lt;/code>&lt;/li>
&lt;li>&lt;code>storeBackend&lt;/code>&lt;/li>
&lt;li>&lt;code>sqlitePath&lt;/code>&lt;/li>
&lt;li>&lt;code>durableTaskSQLitePath&lt;/code>&lt;/li>
&lt;li>&lt;code>maxConcurrentRuns&lt;/code>&lt;/li>
&lt;li>&lt;code>maxConcurrentSteps&lt;/code>&lt;/li>
&lt;li>&lt;code>resultRetention&lt;/code>&lt;/li>
&lt;li>&lt;code>eventRetention&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="example">Example&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">executionBackend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">durabletask&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">storeBackend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sqlite&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">sqlitePath&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/var/lib/nocfoundry/noc-foundry-validation-runs.sqlite&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">durableTaskSQLitePath&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/var/lib/nocfoundry/noc-foundry-validation-taskhub.sqlite&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">maxConcurrentRuns&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">4&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">maxConcurrentSteps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">4&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">resultRetention&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">24h&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">eventRetention&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">24h&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="backend-choices">Backend choices&lt;/h2>
&lt;ul>
&lt;li>&lt;code>local&lt;/code> is simpler and good for lightweight execution&lt;/li>
&lt;li>&lt;code>durabletask&lt;/code> is better for long-running validations that should survive interruption&lt;/li>
&lt;/ul>
&lt;h2 id="store-choices">Store choices&lt;/h2>
&lt;ul>
&lt;li>&lt;code>memory&lt;/code> is ephemeral&lt;/li>
&lt;li>&lt;code>sqlite&lt;/code> provides persistence for status, results, and events&lt;/li>
&lt;/ul>
&lt;h2 id="recommended-local-lab-setup">Recommended local lab setup&lt;/h2>
&lt;p>For the protected validation example, use:&lt;/p></description></item><item><title>OIDC Endpoint Auth</title><link>https://docs.nocfoundry.dev/dev/auth/oidc-endpoint-auth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/auth/oidc-endpoint-auth/</guid><description>&lt;h1 id="oidc-endpoint-auth">OIDC Endpoint Auth&lt;/h1>
&lt;p>NOCFoundry can protect the HTTP surfaces themselves, not just individual tool calls.&lt;/p>
&lt;h2 id="protected-surfaces">Protected surfaces&lt;/h2>
&lt;ul>
&lt;li>&lt;code>/api&lt;/code>&lt;/li>
&lt;li>&lt;code>/mcp&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>These surfaces are configured separately in &lt;code>--server-config&lt;/code> and can require different audiences.&lt;/p>
&lt;h2 id="auth-service-model">Auth service model&lt;/h2>
&lt;ul>
&lt;li>OIDC providers are defined as &lt;code>authServices&lt;/code> in tool catalog files&lt;/li>
&lt;li>the server config references those services by name&lt;/li>
&lt;li>only auth services selected by server policy can satisfy a protected surface&lt;/li>
&lt;/ul>
&lt;h2 id="metadata-and-rfc-9728">Metadata and RFC 9728&lt;/h2>
&lt;p>NOCFoundry serves protected resource metadata for:&lt;/p></description></item><item><title>UI Login with Keycloak</title><link>https://docs.nocfoundry.dev/dev/auth/ui-login-keycloak/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/auth/ui-login-keycloak/</guid><description>&lt;h1 id="ui-login-with-keycloak">UI Login with Keycloak&lt;/h1>
&lt;p>NOCFoundry’s browser UI acts as an OIDC public client and uses Authorization Code + PKCE to access the protected &lt;code>/api&lt;/code> surface.&lt;/p>
&lt;h2 id="local-demo-flow">Local demo flow&lt;/h2>
&lt;ol>
&lt;li>Start Keycloak:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker compose -f examples/keycloak/docker-compose.keycloak.yaml up -d
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>Bootstrap the demo realm and clients:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./examples/keycloak/keycloak-setup.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>Start NOCFoundry with:&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/tools-configs/keycloak-protected-validation.yaml">&lt;code>examples/tools-configs/keycloak-protected-validation.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/server-configs/protected-api-mcp-ui.yaml">&lt;code>examples/server-configs/protected-api-mcp-ui.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="important-client-details">Important client details&lt;/h2>
&lt;p>The setup script creates:&lt;/p>
&lt;ul>
&lt;li>&lt;code>noc-foundry&lt;/code> for the resource-side auth service&lt;/li>
&lt;li>&lt;code>noc-foundry-ui&lt;/code> for the browser PKCE client&lt;/li>
&lt;/ul>
&lt;p>The UI client must:&lt;/p></description></item><item><title>Validation Runs</title><link>https://docs.nocfoundry.dev/dev/workflows/validation-runs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/workflows/validation-runs/</guid><description>&lt;h1 id="validation-runs">Validation Runs&lt;/h1>
&lt;p>Validation runs provide a long-running execution model for multi-step network validation workflows.&lt;/p>
&lt;p>Typical lifecycle:&lt;/p>
&lt;ol>
&lt;li>start a run&lt;/li>
&lt;li>poll status&lt;/li>
&lt;li>fetch final result&lt;/li>
&lt;li>cancel if needed&lt;/li>
&lt;/ol>
&lt;p>Use the protected validation example tools for this workflow:&lt;/p>
&lt;ul>
&lt;li>&lt;code>start_validation_run&lt;/code>&lt;/li>
&lt;li>&lt;code>validation_run_status&lt;/code>&lt;/li>
&lt;li>&lt;code>validation_run_result&lt;/code>&lt;/li>
&lt;li>&lt;code>cancel_validation_run&lt;/code>&lt;/li>
&lt;/ul></description></item><item><title>Skills</title><link>https://docs.nocfoundry.dev/dev/workflows/skills/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/workflows/skills/</guid><description>&lt;h1 id="skills">Skills&lt;/h1>
&lt;p>NOCFoundry can generate agent-facing workflow bundles with &lt;code>skills-generate&lt;/code>.&lt;/p>
&lt;p>The current model emphasizes:&lt;/p>
&lt;ul>
&lt;li>one skill per explicit toolset&lt;/li>
&lt;li>workflow-oriented docs&lt;/li>
&lt;li>optional prompt guidance&lt;/li>
&lt;li>direct &lt;code>nocfoundry invoke ...&lt;/code> examples instead of generated runtime wrappers&lt;/li>
&lt;/ul></description></item><item><title>SSH Source</title><link>https://docs.nocfoundry.dev/dev/resources/sources/ssh/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/resources/sources/ssh/</guid><description>&lt;h1 id="ssh-source">SSH Source&lt;/h1>
&lt;p>Use the SSH source for CLI-oriented collection and command execution. In NOCFoundry, SSH timeouts are normalized as full operation timeouts per attempt.&lt;/p></description></item><item><title>NETCONF Source</title><link>https://docs.nocfoundry.dev/dev/resources/sources/netconf/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/resources/sources/netconf/</guid><description>&lt;h1 id="netconf-source">NETCONF Source&lt;/h1>
&lt;p>Use the NETCONF source for structured operational retrieval and config reads, with operation-scoped timeout behavior and retry-aware collection.&lt;/p></description></item><item><title>gNMI Source</title><link>https://docs.nocfoundry.dev/dev/resources/sources/gnmi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/resources/sources/gnmi/</guid><description>&lt;h1 id="gnmi-source">gNMI Source&lt;/h1>
&lt;p>Use the gNMI source for structured operational state retrieval with source-level timeout control and audience-safe tool workflows.&lt;/p></description></item><item><title>HTTP Source</title><link>https://docs.nocfoundry.dev/dev/resources/sources/http/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/resources/sources/http/</guid><description>&lt;h1 id="http-source">HTTP Source&lt;/h1>
&lt;p>Use the HTTP source for adjacent operational systems and service APIs that need to participate in workflows alongside device-facing tools.&lt;/p></description></item><item><title>Nokia Validate</title><link>https://docs.nocfoundry.dev/dev/resources/tools/nokia-validate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/resources/tools/nokia-validate/</guid><description>&lt;h1 id="nokia-validate">&lt;code>nokia-validate&lt;/code>&lt;/h1>
&lt;p>&lt;code>nokia-validate&lt;/code> is a read-only validation tool for Nokia devices and blast-radius checks. It collects evidence from one or more devices, evaluates configured assertions, and returns structured pass/fail results for a selected phase such as &lt;code>pre&lt;/code>, &lt;code>during&lt;/code>, or &lt;code>post&lt;/code>.&lt;/p>
&lt;p>This tool is intentionally not a change engine. Agents and operators should use it as a deterministic validation primitive inside a larger maintenance workflow.&lt;/p>
&lt;h2 id="what-it-is-good-for">What it is good for&lt;/h2>
&lt;ul>
&lt;li>pre-change readiness validation&lt;/li>
&lt;li>post-change verification&lt;/li>
&lt;li>blast-radius checks across multiple devices&lt;/li>
&lt;li>structured result collection for async validation runs&lt;/li>
&lt;/ul>
&lt;h2 id="key-behavior">Key behavior&lt;/h2>
&lt;ul>
&lt;li>supports either a single &lt;code>source&lt;/code> or a fleet-oriented &lt;code>sourceSelector&lt;/code>&lt;/li>
&lt;li>runs ordered phases made up of &lt;code>collect&lt;/code> and &lt;code>assert&lt;/code> steps&lt;/li>
&lt;li>uses protocol-aware transport selection for network retrieval&lt;/li>
&lt;li>returns structured evidence, step status, and overall validation outcomes&lt;/li>
&lt;li>integrates with durable validation runs through the &lt;code>validation_run_*&lt;/code> lifecycle tools&lt;/li>
&lt;/ul>
&lt;h2 id="runtime-parameters">Runtime parameters&lt;/h2>
&lt;ul>
&lt;li>&lt;code>phase&lt;/code>: required when more than one phase is defined&lt;/li>
&lt;li>&lt;code>device&lt;/code>: optional when &lt;code>sourceSelector&lt;/code> is used and you want to narrow execution&lt;/li>
&lt;/ul>
&lt;h2 id="example-operator-flow">Example operator flow&lt;/h2>
&lt;ol>
&lt;li>run the &lt;code>pre&lt;/code> phase before maintenance&lt;/li>
&lt;li>perform the network change outside the tool&lt;/li>
&lt;li>run the &lt;code>post&lt;/code> phase&lt;/li>
&lt;li>compare results and decide whether rollback is required&lt;/li>
&lt;/ol>
&lt;h2 id="example-configuration">Example configuration&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">tools&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">maintenance_validation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">nokia-validate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">authRequired&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">noc-keycloak&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">sourceSelector&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">matchLabels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">validation_demo&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;true&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">phases&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">pre&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">collect_control_version&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">collect&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">into&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">control_versions&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">targets&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;control_plane&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">operation&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">get_system_version&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">assert_versions&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">assert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">expected_version&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;control_versions&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">scope&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">per_record&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">expr&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;.payload.software_version == &amp;#34;23.10.R1&amp;#34;&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="related-examples">Related examples&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/tools-configs/keycloak-protected-validation.yaml">&lt;code>examples/tools-configs/keycloak-protected-validation.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.nocfoundry.dev/dev/workflows/validation-runs/">Validation runs&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>CLI Reference</title><link>https://docs.nocfoundry.dev/dev/reference/cli/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/reference/cli/</guid><description>&lt;h1 id="cli-reference">CLI Reference&lt;/h1>
&lt;p>The root command is:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">nocfoundry
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Core entry points include:&lt;/p>
&lt;ul>
&lt;li>&lt;code>nocfoundry invoke&lt;/code>&lt;/li>
&lt;li>&lt;code>nocfoundry skills-generate&lt;/code>&lt;/li>
&lt;li>&lt;code>nocfoundry --ui&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="prebuilt-catalogs">Prebuilt catalogs&lt;/h2>
&lt;p>The &lt;code>--prebuilt&lt;/code> flag loads a bundled tool catalog by name.&lt;/p>
&lt;p>Current bundled prebuilt:&lt;/p>
&lt;ul>
&lt;li>&lt;code>validation-runs&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./nocfoundry --prebuilt validation-runs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>--prebuilt&lt;/code> is not a boolean flag, and it does not take an individual tool name. This is invalid:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./nocfoundry --prebuilt start_validation_run
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>because &lt;code>start_validation_run&lt;/code> is a tool inside the &lt;code>validation-runs&lt;/code> catalog, not the catalog name itself.&lt;/p></description></item><item><title>FAQ</title><link>https://docs.nocfoundry.dev/dev/reference/faq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/reference/faq/</guid><description>&lt;h1 id="faq">FAQ&lt;/h1>
&lt;h2 id="does-nocfoundry-execute-prompts-itself">Does NOCFoundry execute prompts itself?&lt;/h2>
&lt;p>No. Prompt resources are exposed for clients and agents to consume. NOCFoundry does not execute prompts against an LLM.&lt;/p>
&lt;h2 id="why-is-api-returning-401">Why is &lt;code>/api&lt;/code> returning 401?&lt;/h2>
&lt;p>If endpoint auth is enabled, callers must present a bearer token that matches the configured &lt;code>/api&lt;/code> audience.&lt;/p>
&lt;h2 id="does-the-ui-require-login">Does the UI require login?&lt;/h2>
&lt;p>The UI shell can remain public while its backing &lt;code>/api&lt;/code> calls are protected. When UI auth is enabled, the browser signs in through OIDC + PKCE.&lt;/p></description></item><item><title>Local Lab with Keycloak</title><link>https://docs.nocfoundry.dev/dev/examples/local-lab-with-keycloak/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/examples/local-lab-with-keycloak/</guid><description>&lt;h1 id="local-lab-with-keycloak">Local Lab with Keycloak&lt;/h1>
&lt;p>Use this protected local lab stack when you want to test:&lt;/p>
&lt;ul>
&lt;li>Keycloak-backed OIDC auth services&lt;/li>
&lt;li>endpoint auth on &lt;code>/api&lt;/code> and &lt;code>/mcp&lt;/code>&lt;/li>
&lt;li>browser PKCE login for the UI&lt;/li>
&lt;li>durable validation runs&lt;/li>
&lt;/ul>
&lt;p>Main files:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/tools-configs/keycloak-protected-validation.yaml">&lt;code>examples/tools-configs/keycloak-protected-validation.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/server-configs/protected-api-mcp-ui.yaml">&lt;code>examples/server-configs/protected-api-mcp-ui.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/validation-runtime-configs/durable-validation-sqlite.yaml">&lt;code>examples/validation-runtime-configs/durable-validation-sqlite.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/keycloak/docker-compose.keycloak.yaml">&lt;code>examples/keycloak/docker-compose.keycloak.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/keycloak/keycloak-setup.sh">&lt;code>examples/keycloak/keycloak-setup.sh&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/containerlab/noc-foundry-lab.clab.yaml">&lt;code>examples/containerlab/noc-foundry-lab.clab.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/containerlab/install-containerlab.sh">&lt;code>examples/containerlab/install-containerlab.sh&lt;/code>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>For contributors who want a realistic local network instead of static sample targets,
pair this protected stack with the SR Linux containerlab fabric.&lt;/p>
&lt;ul>
&lt;li>install containerlab on demand with &lt;code>./examples/containerlab/install-containerlab.sh&lt;/code>&lt;/li>
&lt;li>deploy the lab with &lt;code>sudo containerlab deploy -t examples/containerlab/noc-foundry-lab.clab.yaml&lt;/code>&lt;/li>
&lt;li>destroy it with &lt;code>sudo containerlab destroy -t examples/containerlab/noc-foundry-lab.clab.yaml&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="start-keycloak">Start Keycloak&lt;/h2>
&lt;p>Start the local Keycloak example:&lt;/p></description></item><item><title>Containerlab SR Linux Lab</title><link>https://docs.nocfoundry.dev/dev/examples/containerlab-srlinux-lab/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.nocfoundry.dev/dev/examples/containerlab-srlinux-lab/</guid><description>&lt;h1 id="containerlab-sr-linux-lab">Containerlab SR Linux Lab&lt;/h1>
&lt;p>Use this example when you want a realistic local network topology for NOCFoundry
development and validation testing.&lt;/p>
&lt;p>Main files:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/containerlab/noc-foundry-lab.clab.yaml">&lt;code>examples/containerlab/noc-foundry-lab.clab.yaml&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/blob/main/examples/containerlab/install-containerlab.sh">&lt;code>examples/containerlab/install-containerlab.sh&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adrien19/noc-foundry/tree/main/examples/containerlab/configs/noc-foundry-lab">&lt;code>examples/containerlab/configs/noc-foundry-lab/&lt;/code>&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="topology">Topology&lt;/h2>
&lt;p>This lab deploys:&lt;/p>
&lt;ul>
&lt;li>2 SR Linux spines: &lt;code>srl-b&lt;/code>, &lt;code>srl-c&lt;/code>&lt;/li>
&lt;li>3 SR Linux leaves: &lt;code>srl-a&lt;/code>, &lt;code>srl-d&lt;/code>, &lt;code>srl-e&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Each node is configured with:&lt;/p>
&lt;ul>
&lt;li>ISIS on the underlay links&lt;/li>
&lt;li>a loopback address on &lt;code>system0&lt;/code>&lt;/li>
&lt;li>NETCONF enabled on the management plane&lt;/li>
&lt;li>native SR Linux gNMI enabled on the management plane&lt;/li>
&lt;/ul>
&lt;p>The lab also uses a dedicated management network:&lt;/p></description></item></channel></rss>