<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Cradicle Explorer</title>
    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
    <style>
      .form-control-dark::placeholder {
          color: #aaa;
          opacity: 1;
      }
    </style>
    <link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
    <link rel="icon" type="image/png" href="/favicon.png">


                <link href="/css/dashboard.css" rel="stylesheet">
                </head>
                <body>
                <header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
                  <a class="navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6" href="/">Cradicle Explorer</a>
                  <button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                  </button>
                  <form method="get" action="/cgi-bin/main" style="width:100%;"><input class="form-control form-control-dark w-100 rounded-0 border-0" type="text" name="q" placeholder="Search repos" aria-label="Search"></form>
                  <div class="navbar-nav flex-row">
                    <div class="nav-item text-nowrap">
                      <a class="nav-link px-3 active" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf">ai-data-frameworks_solace-agent-mesh</a>
                    </div>
                  </div>
                </header>
                <div class="container-fluid">
                  <div class="row">
                    <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-dark sidebar collapse">
                      <div class="position-sticky pt-3 sidebar-sticky">
                        <ul class="nav flex-column">
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf">
                              <i class="align-text-bottom fa-solid fa-info"></i>
                              Info
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&issue=list">
                              <i class="align-text-bottom fa-solid fa-layer-group"></i>
                              Issues
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&patch=list">
                              <i class="align-text-bottom fa-solid fa-vest-patches"></i>
                              Patches
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&wallet=list">
                              <i class="align-text-bottom fa-solid fa-wallet"></i>
                              Wallets
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link active" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=.">
                              <i class="align-text-bottom fa-solid fa-code"></i>
                              Source
                            </a>
                          </li>
                        <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
                          <span></span>
                        </h6>
                        <ul class="nav flex-column mb-2">
                        
    <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-1 mb-1 text-muted text-uppercase">
      <span>Source</span>
    </h6>
    <li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=.github"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .github</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=.hooks"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .hooks</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=.vscode"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .vscode</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=THIRD_PARTY_LICENSES"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> THIRD_PARTY_LICENSES</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=cli"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> cli</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=client"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> client</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=config_portal"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> config_portal</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> documentation</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fcomponents"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> components</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fdeploying"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> deploying</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fdeveloping"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> developing</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fenterprise"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> enterprise</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fconnectors"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> connectors</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fgateways"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> gateways</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2F_category_.json"><i class="fa-solid fa-file" style="color:#888;"></i> _category_.json</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fagent-builder.md"><i class="fa-solid fa-file" style="color:#888;"></i> agent-builder.md</a></li><li><a class="nav-link py-0 active" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fauth-proxy.md"><i class="fa-solid fa-file" style="color:#888;"></i> auth-proxy.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fconnect-external-agents.md"><i class="fa-solid fa-file" style="color:#888;"></i> connect-external-agents.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fenterprise.md"><i class="fa-solid fa-file" style="color:#888;"></i> enterprise.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Finstallation.md"><i class="fa-solid fa-file" style="color:#888;"></i> installation.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fopenapi-tools.md"><i class="fa-solid fa-file" style="color:#888;"></i> openapi-tools.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fplatform-service-auth.md"><i class="fa-solid fa-file" style="color:#888;"></i> platform-service-auth.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Frbac-setup-guide.md"><i class="fa-solid fa-file" style="color:#888;"></i> rbac-setup-guide.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fsecure-user-delegated-access.md"><i class="fa-solid fa-file" style="color:#888;"></i> secure-user-delegated-access.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fsingle-sign-on.md"><i class="fa-solid fa-file" style="color:#888;"></i> single-sign-on.md</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fenterprise%2Fwheel-installation.md"><i class="fa-solid fa-file" style="color:#888;"></i> wheel-installation.md</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fgetting-started"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> getting-started</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Finstalling-and-configuring"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> installing-and-configuring</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fmigrations"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> migrations</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocs%2Fdocumentation%2Fvibe_coding.md"><i class="fa-solid fa-file" style="color:#888;"></i> vibe_coding.md</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fpartials"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> partials</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fsrc"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> src</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fstatic"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> static</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2F.gitignore"><i class="fa-solid fa-file" style="color:#888;"></i> .gitignore</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2F.npmrc"><i class="fa-solid fa-file" style="color:#888;"></i> .npmrc</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2FREADME.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fdocusaurus.config.ts"><i class="fa-solid fa-file" style="color:#888;"></i> docusaurus.config.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fpackage-lock.json"><i class="fa-solid fa-file" style="color:#888;"></i> package-lock.json</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fpackage.json"><i class="fa-solid fa-file" style="color:#888;"></i> package.json</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Fsidebars.ts"><i class="fa-solid fa-file" style="color:#888;"></i> sidebars.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=docs%2Ftsconfig.json"><i class="fa-solid fa-file" style="color:#888;"></i> tsconfig.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=evaluation"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> evaluation</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=examples"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> examples</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=preset"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> preset</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=scripts"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> scripts</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=src"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> src</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=templates"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> templates</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=tests"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> tests</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=.dockerignore"><i class="fa-solid fa-file" style="color:#888;"></i> .dockerignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=.fossa.yml"><i class="fa-solid fa-file" style="color:#888;"></i> .fossa.yml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=.gitignore"><i class="fa-solid fa-file" style="color:#888;"></i> .gitignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=.release-please-manifest.json"><i class="fa-solid fa-file" style="color:#888;"></i> .release-please-manifest.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=.versionrc.json"><i class="fa-solid fa-file" style="color:#888;"></i> .versionrc.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=CHANGELOG.md"><i class="fa-solid fa-file" style="color:#888;"></i> CHANGELOG.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=CODE_OF_CONDUCT.md"><i class="fa-solid fa-file" style="color:#888;"></i> CODE_OF_CONDUCT.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=CONTRIBUTING.md"><i class="fa-solid fa-file" style="color:#888;"></i> CONTRIBUTING.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=Dockerfile"><i class="fa-solid fa-file" style="color:#888;"></i> Dockerfile</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=LICENSE"><i class="fa-solid fa-file" style="color:#888;"></i> LICENSE</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=Makefile"><i class="fa-solid fa-file" style="color:#888;"></i> Makefile</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=README.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=RELEASE_PROCESS.md"><i class="fa-solid fa-file" style="color:#888;"></i> RELEASE_PROCESS.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=context7.json"><i class="fa-solid fa-file" style="color:#888;"></i> context7.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=pyproject.toml"><i class="fa-solid fa-file" style="color:#888;"></i> pyproject.toml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=release-please-config.json"><i class="fa-solid fa-file" style="color:#888;"></i> release-please-config.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=sonar-project.properties"><i class="fa-solid fa-file" style="color:#888;"></i> sonar-project.properties</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=uv.lock"><i class="fa-solid fa-file" style="color:#888;"></i> uv.lock</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&file=wss-unified-agent.config"><i class="fa-solid fa-file" style="color:#888;"></i> wss-unified-agent.config</a></li>
    
                        </ul>
                      </div>
                    </nav>
                <main class="col-md-9 ms-sm-auto col-lg-10">
                  <div class="container px-1 py-3">
        
<div class="mb-2" style="font-size:1.1rem;"><a href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=.">/</a> <a href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs">docs</a> / <a href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs">docs</a> / <a href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation">documentation</a> / <a href="/cgi-bin/repo?id=zRxKoYRDpYZptZmoWgddjvWDv4Hf&source=docs%2Fdocs%2Fdocumentation%2Fenterprise">enterprise</a> / auth-proxy.md</div>
        <div class="list-group">
        <div class="list-group-item">
        <div class="mb-2" style="font-weight:bold;"><i class="fa-solid fa-file"></i> auth-proxy.md</div>
        <pre style="margin:0; font-size:0.85rem; overflow-x:auto; color:#fafafa;"><span style="color:#666; user-select:none;">  1</span>  ---
<span style="color:#666; user-select:none;">  2</span>  title: Authentication Proxy
<span style="color:#666; user-select:none;">  3</span>  sidebar_position: 12
<span style="color:#666; user-select:none;">  4</span>  ---
<span style="color:#666; user-select:none;">  5</span>  
<span style="color:#666; user-select:none;">  6</span>  # Authentication Proxy
<span style="color:#666; user-select:none;">  7</span>  
<span style="color:#666; user-select:none;">  8</span>  Gateway OAuth enables apps and gateways (like MCP) to authenticate via the OAuth2 service without registering separate redirect URIs with OAuth providers. Apps redirect directly to the auth server, which handles the OAuth flow and returns a gateway code that can be exchanged for tokens.
<span style="color:#666; user-select:none;">  9</span>  
<span style="color:#666; user-select:none;"> 10</span>  
<span style="color:#666; user-select:none;"> 11</span>  ## How It Works
<span style="color:#666; user-select:none;"> 12</span>  
<span style="color:#666; user-select:none;"> 13</span>  High-level flow of the authentication proxy:
<span style="color:#666; user-select:none;"> 14</span>  
<span style="color:#666; user-select:none;"> 15</span>  ```mermaid
<span style="color:#666; user-select:none;"> 16</span>  graph TD
<span style="color:#666; user-select:none;"> 17</span>      D[MCP Client&lt;br&gt; e.g. Claude Code] --&gt; A;
<span style="color:#666; user-select:none;"> 18</span>      A[MCP Server Gateway&lt;br&gt;port 8090] --&gt; B;
<span style="color:#666; user-select:none;"> 19</span>      B[OAuth2 Service&lt;br&gt;port 8080] --&gt; C;
<span style="color:#666; user-select:none;"> 20</span>      C[OAuth Provider] --&gt; B;
<span style="color:#666; user-select:none;"> 21</span>      B --&gt; A;
<span style="color:#666; user-select:none;"> 22</span>      A --&gt; D;
<span style="color:#666; user-select:none;"> 23</span>      linkStyle 0 stroke-width:2px,fill:none,stroke:white;
<span style="color:#666; user-select:none;"> 24</span>      linkStyle 1 stroke-width:2px,fill:none,stroke:white;
<span style="color:#666; user-select:none;"> 25</span>      linkStyle 2 stroke-width:2px,fill:none,stroke:white;
<span style="color:#666; user-select:none;"> 26</span>      linkStyle 3 stroke-width:2px,fill:none,stroke:grey;
<span style="color:#666; user-select:none;"> 27</span>      linkStyle 4 stroke-width:2px,fill:none,stroke:grey;
<span style="color:#666; user-select:none;"> 28</span>      linkStyle 5 stroke-width:2px,fill:none,stroke:grey;
<span style="color:#666; user-select:none;"> 29</span>  ```
<span style="color:#666; user-select:none;"> 30</span>  
<span style="color:#666; user-select:none;"> 31</span>  
<span style="color:#666; user-select:none;"> 32</span>  Detailed sequence diagram of the OAuth2 authentication proxy flow:
<span style="color:#666; user-select:none;"> 33</span>  
<span style="color:#666; user-select:none;"> 34</span>  ```mermaid
<span style="color:#666; user-select:none;"> 35</span>  sequenceDiagram
<span style="color:#666; user-select:none;"> 36</span>      participant MC as MCP Client
<span style="color:#666; user-select:none;"> 37</span>      participant UB as User Browser
<span style="color:#666; user-select:none;"> 38</span>      participant AG as MCP Server Gateway
<span style="color:#666; user-select:none;"> 39</span>      participant AS as Auth Server (OAuth2)
<span style="color:#666; user-select:none;"> 40</span>      participant OP as OAuth Provider
<span style="color:#666; user-select:none;"> 41</span>  
<span style="color:#666; user-select:none;"> 42</span>      MC-&gt;&gt;+AG: 1. GET /.well-known/oauth-authorization-server
<span style="color:#666; user-select:none;"> 43</span>      AG--&gt;&gt;-MC: 2. Returns auth address
<span style="color:#666; user-select:none;"> 44</span>  
<span style="color:#666; user-select:none;"> 45</span>      MC-&gt;&gt;UB: 3. Opens browser at auth URL
<span style="color:#666; user-select:none;"> 46</span>      Note right of MC: Includes redirect_uri and code params
<span style="color:#666; user-select:none;"> 47</span>  
<span style="color:#666; user-select:none;"> 48</span>      UB-&gt;&gt;+AG: 4. GET /oauth/authorize
<span style="color:#666; user-select:none;"> 49</span>      AG--&gt;&gt;-UB: 5. Redirect: /login?gateway_uri=...
<span style="color:#666; user-select:none;"> 50</span>  
<span style="color:#666; user-select:none;"> 51</span>      Note over UB, AS: User is redirected to Auth Server
<span style="color:#666; user-select:none;"> 52</span>      UB-&gt;&gt;+AS: Follows redirect
<span style="color:#666; user-select:none;"> 53</span>      AS--&gt;&gt;-UB: 6. Redirect to OAuth Provider
<span style="color:#666; user-select:none;"> 54</span>  
<span style="color:#666; user-select:none;"> 55</span>      Note over UB, OP: User is redirected to OAuth Provider
<span style="color:#666; user-select:none;"> 56</span>      UB-&gt;&gt;+OP: Follows redirect
<span style="color:#666; user-select:none;"> 57</span>      OP--&gt;&gt;-UB: 7. User authenticates &amp; grants consent
<span style="color:#666; user-select:none;"> 58</span>  
<span style="color:#666; user-select:none;"> 59</span>      Note over OP, AS: Provider redirects back to Auth Server with auth code
<span style="color:#666; user-select:none;"> 60</span>      OP-&gt;&gt;+AS: 8. Redirect: /callback?code=...
<span style="color:#666; user-select:none;"> 61</span>      
<span style="color:#666; user-select:none;"> 62</span>      AS-&gt;&gt;+OP: 9. Exchange authorization code for tokens
<span style="color:#666; user-select:none;"> 63</span>      OP--&gt;&gt;-AS: Returns access_token, refresh_token
<span style="color:#666; user-select:none;"> 64</span>  
<span style="color:#666; user-select:none;"> 65</span>      Note over AS, UB: Auth Server creates a gateway code and redirects to App
<span style="color:#666; user-select:none;"> 66</span>      AS--&gt;&gt;-UB: 10. Redirect: /oauth/callback?code=GATEWAY_CODE
<span style="color:#666; user-select:none;"> 67</span>  
<span style="color:#666; user-select:none;"> 68</span>      Note over UB, AG: User is redirected back to the App Gateway
<span style="color:#666; user-select:none;"> 69</span>      UB-&gt;&gt;+AG: Follows redirect with GATEWAY_CODE
<span style="color:#666; user-select:none;"> 70</span>      
<span style="color:#666; user-select:none;"> 71</span>      AG-&gt;&gt;+AS: 11. Exchange gateway code for tokens
<span style="color:#666; user-select:none;"> 72</span>      AS--&gt;&gt;-AG: Returns access_token, refresh_token
<span style="color:#666; user-select:none;"> 73</span>      AG--&gt;&gt;MC: 12. Return access_token to client
<span style="color:#666; user-select:none;"> 74</span>  ```
<span style="color:#666; user-select:none;"> 75</span>  
<span style="color:#666; user-select:none;"> 76</span>  ## Configuration
<span style="color:#666; user-select:none;"> 77</span>  To enable the authentication proxy, add the following to your OAuth2 YAML configuration, usually named `oauth2_config.yaml`
<span style="color:#666; user-select:none;"> 78</span>  
<span style="color:#666; user-select:none;"> 79</span>  ```yaml
<span style="color:#666; user-select:none;"> 80</span>  # This enables apps to redirect through this auth server for OAuth
<span style="color:#666; user-select:none;"> 81</span>  proxy_oauth:
<span style="color:#666; user-select:none;"> 82</span>    enabled: true
<span style="color:#666; user-select:none;"> 83</span>    # Whitelist of allowed gateway callback URIs
<span style="color:#666; user-select:none;"> 84</span>    # Apps with URIs in this list can use this auth server for OAuth proxy
<span style="color:#666; user-select:none;"> 85</span>    allowed_redirect_uris:
<span style="color:#666; user-select:none;"> 86</span>      - &quot;http://localhost:8090/oauth/callback&quot;  # MCP gateway
<span style="color:#666; user-select:none;"> 87</span>      - &quot;http://localhost:*&quot;  # Wildcard for development - requires strict_uri_validation set to `false`
<span style="color:#666; user-select:none;"> 88</span>      - &quot;https://mcp.example.com/oauth/callback&quot;  # Production Example
<span style="color:#666; user-select:none;"> 89</span>  
<span style="color:#666; user-select:none;"> 90</span>    # Gateway code time-to-live in seconds (default: 300 = 5 minutes)
<span style="color:#666; user-select:none;"> 91</span>    # Codes expire after this time for security
<span style="color:#666; user-select:none;"> 92</span>    gateway_code_ttl_seconds: 300
<span style="color:#666; user-select:none;"> 93</span>  
<span style="color:#666; user-select:none;"> 94</span>    # URI validation mode (default: false = wildcard matching allowed)
<span style="color:#666; user-select:none;"> 95</span>    # Set to true for production to require exact URI matches
<span style="color:#666; user-select:none;"> 96</span>    strict_uri_validation: false
<span style="color:#666; user-select:none;"> 97</span>  ```
<span style="color:#666; user-select:none;"> 98</span>  
<span style="color:#666; user-select:none;"> 99</span>  Update `allowed_redirect_uris` with the actual callback URIs of your gateways.
<span style="color:#666; user-select:none;">100</span>  
<span style="color:#666; user-select:none;">101</span>  :::info
<span style="color:#666; user-select:none;">102</span>  The path `/gateway-oauth` must be exposed and accessible in your deployment environment (e.g., Docker, Kubernetes) and it should point to the Auth Server service port.
<span style="color:#666; user-select:none;">103</span>  :::
<span style="color:#666; user-select:none;">104</span>  
<span style="color:#666; user-select:none;">105</span>  ### Gateway Configuration
<span style="color:#666; user-select:none;">106</span>  
<span style="color:#666; user-select:none;">107</span>  In your MCP Gateway configuration YAML (e.g. `my-mcp-gateway.yaml`), update the `adapter` section to enable OAuth and point to the Auth Server:
<span style="color:#666; user-select:none;">108</span>  
<span style="color:#666; user-select:none;">109</span>  ```yaml
<span style="color:#666; user-select:none;">110</span>  adapter_config:
<span style="color:#666; user-select:none;">111</span>      enable_auth: ${OAUTH2_ENABLED}
<span style="color:#666; user-select:none;">112</span>  
<span style="color:#666; user-select:none;">113</span>      external_auth_service_url: ${EXTERNAL_AUTH_SERVICE_URL, http://localhost:8080}
<span style="color:#666; user-select:none;">114</span>      external_auth_provider: ${EXTERNAL_AUTH_PROVIDER, azure}
<span style="color:#666; user-select:none;">115</span>  ```
</pre>
        </div>
        </div>

</div>
</main>
</div>
</div>


</body>
</html>

