# MCP für die Testumgebung

> Den MCP-Server der lokalen Podman-Testumgebung als eigenen Server databridge-dev in Claude Code nutzen — parallel zur Cloud-Instanz.

---

Site [llms.txt](/llms.txt)

---

Die DataBridge in der [Podman-Testumgebung](../lokale-testumgebung/) bringt denselben
[MCP-Server](/docs/mcp-server/) mit wie jede andere Instanz. Damit kann ein KI-Assistent die
Beispiel-Jobs und -Mappings lesen und die Metadaten der Testdatenbanken abfragen, ohne dass
dafür etwas in Azure laufen muss.

## Zwei Server nebeneinander

Die `.mcp.json` im Repository definiert zwei DataBridge-Server:

| Server | Ziel | URL |
|---|---|---|
| `databridge` | Eine Azure-Instanz (bzw. ohne Konfiguration der lokale Host) | `${DATABRIDGE_MCP_URL:-http://localhost:7062}/api/mcp?code=${DATABRIDGE_FUNCTION_KEY:-local}` |
| `databridge-dev` | Die Podman-Testumgebung | `http://localhost:7062/api/mcp?code=local` |

```json
{
  "mcpServers": {
    "databridge": {
      "type": "http",
      "url": "${DATABRIDGE_MCP_URL:-http://localhost:7062}/api/mcp?code=${DATABRIDGE_FUNCTION_KEY:-local}"
    },
    "databridge-dev": {
      "type": "http",
      "url": "http://localhost:7062/api/mcp?code=local"
    }
  }
}
```

- `databridge` zeigt auf eine Azure-Instanz, sobald `DATABRIDGE_MCP_URL` und
  `DATABRIDGE_FUNCTION_KEY` gesetzt sind — üblicherweise im Block `env` der persönlichen
  `.claude/settings.local.json` (siehe [MCP-Server → Nutzung](/docs/mcp-server/nutzung/)).
- `databridge-dev` zeigt immer auf die Testumgebung. Der Function Key ist dort fest auf `local`
  gesetzt (`dev/functions-secrets/host.json`), es muss also nichts konfiguriert werden.

In Claude Code erscheinen die Tools entsprechend mit den Präfixen `mcp__databridge__…` und
`mcp__databridge-dev__…`. Im Prompt genügt es zu sagen, welcher Server gemeint ist, z. B. „frag
über databridge-dev die Tabellen von oracle-dev ab“.

> **Session neu starten**
>
> Claude Code verbindet sich nur beim Start einer Session mit den MCP-Servern. Läuft die
> Testumgebung beim Start noch nicht, meldet `databridge-dev` einen Verbindungsfehler. Dann
> `dev/up.sh` abwarten und die Session neu starten. Beim ersten Mal fragt Claude Code, ob der
> Projekt-Server `databridge-dev` erlaubt werden soll.



Port 7062 ist derselbe wie beim Debuggen aus der IDE. Läuft gleichzeitig ein lokaler Function
Host aus Visual Studio, Rider oder VS Code, belegt er den Port — dann entweder den Host oder die
Testumgebung stoppen, oder in `dev/.env` einen anderen `DATABRIDGE_PORT` wählen und die URL von
`databridge-dev` entsprechend anpassen.

## Was sich damit testen lässt

Alle Tools aus [MCP-Server → Operationen](/docs/mcp-server/operationen/) stehen zur Verfügung.
Mit den Beispieldaten sind vor allem diese sinnvoll:

| Tool | Beispiel | Ergebnis |
|---|---|---|
| `list_jobs` | — | Die generierten Jobs, z. B. `oracle-to-mssql-account` |
| `get_job` | `rowKey: "mssql-to-postgres-opportunity"` | Quelle, Ziel, Mapping und Watermark des Jobs |
| `list_mappings` | — | `dev-account`, `dev-opportunity`, `dev-opportunityproduct` |
| `get_mapping` | `rowKey: "dev-account"` | Die 19 Feldzuordnungen von `Account` |
| `list_connector_tables` | `connectionName: "postgres-dev"` | `account`, `opportunity`, `opportunityproduct` |
| `get_connector_table_schema` | `connectionName: "oracle-dev"`, `tableName: "Account"` | Spalten mit .NET-Typ, Nullable, Länge, Precision/Scale und Primary Key |
| `list_connector_tables` | `connectionName: "bc-dev"` (`apiPath` optional, leer = `v2.0`) | `customers`, `opportunities`, `opportunityLines` (aus der EDMX des Mocks, nur mit `dev/up.sh … bc`) |
| `get_connector_table_schema` | `connectionName: "nav-dev"`, `tableName: "Customers"` | 8 Spalten, Primärschlüssel `No` |
| `get_connector_table_schema` | `connectionName: "openapi-dev"`, `tableName: "customers"` | 8 Spalten aus der OpenAPI-Spec des Mocks |
| `get_connector_table_schema` | `connectionName: "bc-dev"`, `tableName: "v2.0/opportunities"` (`apiPath` weggelassen) | Funktioniert ebenso — das Tool trennt den API-Pfad selbst ab, wenn er noch Teil von `tableName` ist |

Die Service-Bus-Tools (`list_queue_statuses`, `get_queue_status`, `peek_*`) funktionieren, sobald
das Profil `servicebus` läuft (`dev/up.sh servicebus` oder automatisch über `getchanges`/`process`,
siehe [Service Bus](../lokale-testumgebung/#service-bus)). Ohne dieses Profil liefern sie einen
Verbindungsfehler, weil unter `ExportQueueServiceBus` dann nur der Dummy-Connection-String steht.

Weil in allen Datenbanken dieselben Tabellen liegen, eignet sich die Umgebung gut, um die
Typ-Abbildung der Connectoren zu vergleichen: dieselbe Spalte, z. B. `IsActive` oder
`CreatedOnUtc`, einmal je Connection abfragen.

## Ohne Claude Code aufrufen

Der Endpoint spricht Standard-MCP über HTTP und lässt sich auch direkt aufrufen, z. B. zum
schnellen Prüfen nach einer Code-Änderung:




<ul class="nav nav-tabs" id="tabs-1" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-01-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-00" role="tab"
          data-td-tp-persist="windows (powershell)" aria-controls="tabs-01-00" aria-selected="true">
        Windows (PowerShell)
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-01-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-01" role="tab"
          data-td-tp-persist="linux / macos" aria-controls="tabs-01-01" aria-selected="false">
        Linux / macOS
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-1-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-01-00" role="tabpanel" aria-labelled-by="tabs-01-00-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>Invoke-RestMethod <span style="color:#e6db74">&#39;http://localhost:7062/api/mcp?code=local&#39;</span> -Method Post `
</span></span><span style="display:flex;"><span>  -ContentType <span style="color:#e6db74">&#39;application/json&#39;</span> -Headers @{ Accept = <span style="color:#e6db74">&#39;application/json, text/event-stream&#39;</span> } `
</span></span><span style="display:flex;"><span>  -Body <span style="color:#e6db74">&#39;{&#34;jsonrpc&#34;:&#34;2.0&#34;,&#34;id&#34;:1,&#34;method&#34;:&#34;tools/call&#34;,&#34;params&#34;:{&#34;name&#34;:&#34;get_connector_table_schema&#34;,&#34;arguments&#34;:{&#34;connectionName&#34;:&#34;mssql-dev&#34;,&#34;tableName&#34;:&#34;Account&#34;}}}&#39;</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-01-01" role="tabpanel" aria-labelled-by="tabs-01-01-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl -s <span style="color:#e6db74">&#39;http://localhost:7062/api/mcp?code=local&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#39;Content-Type: application/json&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#39;Accept: application/json, text/event-stream&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -d <span style="color:#e6db74">&#39;{&#34;jsonrpc&#34;:&#34;2.0&#34;,&#34;id&#34;:1,&#34;method&#34;:&#34;tools/call&#34;,&#34;params&#34;:{&#34;name&#34;:&#34;get_connector_table_schema&#34;,&#34;arguments&#34;:{&#34;connectionName&#34;:&#34;mssql-dev&#34;,&#34;tableName&#34;:&#34;Account&#34;}}}&#39;</span>
</span></span></code></pre></div>
    </div>
</div>


## Log

Jeder MCP-Aufruf schreibt eine Zeile ins Log der DataBridge, mit dem Namen der Operation und —
wo vorhanden — dem gelesenen Job, Mapping bzw. der Connection und Tabelle:

```
MCP list_jobs
MCP get_job: job=oracle-to-mssql-account
MCP get_mapping: mapping=dev-opportunity
MCP get_connector_table_schema: connection=oracle-dev, table=Account
```

In der Testumgebung sieht man sie mit:




<ul class="nav nav-tabs" id="tabs-2" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
          data-td-tp-persist="windows (powershell)" aria-controls="tabs-02-00" aria-selected="true">
        Windows (PowerShell)
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
          data-td-tp-persist="linux / macos" aria-controls="tabs-02-01" aria-selected="false">
        Linux / macOS
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-2-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>podman compose <span style="color:#f92672">-f</span> dev/compose.dev.yml logs <span style="color:#f92672">-f</span> databridge | Select-String <span style="color:#e6db74">&#34;MCP &#34;</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-02-01" role="tabpanel" aria-labelled-by="tabs-02-01-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>podman compose -f dev/compose.dev.yml logs -f databridge | grep <span style="color:#e6db74">&#34;MCP &#34;</span>
</span></span></code></pre></div>
    </div>
</div>
