57 lines
4 KiB
HTML
57 lines
4 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}{{ 'Verbindung bearbeiten' if server else 'MCP-Server hinzufügen' }}{% endblock %}
|
|
{% block content %}
|
|
{% set back = '/workspaces/' ~ workspace.id ~ '/settings?tab=mcp#connections' %}
|
|
<h1>{{ server.label if server else 'MCP-Server hinzufügen' }}</h1>
|
|
<div class="card"><div class="card-body">
|
|
<form method="post" action="{{ '/connections/' ~ server.id if server else '/workspaces/' ~ workspace.id ~ '/connections' }}" class="stack">
|
|
<input type="hidden" name="_csrf" value="{{ p.csrf }}">
|
|
{% if server %}
|
|
<p class="text-sm">Kurzname <code>{{ server.name }}</code> · <code>{{ server.url }}</code></p>
|
|
<p class="form-hint">Kurzname und URL bleiben; für eine andere Adresse eine neue Verbindung anlegen.</p>
|
|
{% else %}
|
|
<div class="form-group">
|
|
<label for="name">Kurzname</label>
|
|
<input id="name" name="name" required maxlength="16" pattern="[a-z][a-z0-9_]*" value="{{ form.name or '' }}" placeholder="jira">
|
|
<p class="form-hint">Präfix der Tool-Namen, z. B. <code>jira__search</code>. Über alle Workspaces eindeutig; lässt sich später nicht ändern.</p>
|
|
</div>
|
|
{% endif %}
|
|
<div class="form-group">
|
|
<label for="label">Bezeichnung</label>
|
|
<input id="label" name="label" maxlength="200" value="{{ server.label if server else form.label or '' }}" placeholder="Jira des Teams">
|
|
</div>
|
|
{% if not server %}
|
|
<div class="form-group">
|
|
<label for="url">URL</label>
|
|
<input id="url" name="url" required type="url" value="{{ form.url or '' }}" placeholder="https://jira-mcp.intern/mcp">
|
|
<p class="form-hint">Streamable HTTP, nur https und nur Hosts aus AIW_MCP_ALLOWED_HOSTS. Eine Adresse, die die Plattform noch nicht nutzt, muss ein Plattform-Admin freigeben.</p>
|
|
</div>
|
|
{% endif %}
|
|
<div class="form-group">
|
|
<label for="token">Token{% if server and server.secret_hint %} (gesetzt: …{{ server.secret_hint }}){% else %} (optional){% endif %}</label>
|
|
<input id="token" name="token" type="password" autocomplete="off" {% if server %}placeholder="leer lassen = unverändert"{% endif %}>
|
|
{% if server and server.secret_hint %}<label class="checkbox"><input type="checkbox" name="remove_token" value="1"> Token entfernen</label>{% endif %}
|
|
<p class="form-hint">Wird als Bearer-Token gesendet, verschlüsselt gespeichert und nie wieder angezeigt.</p>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="headers">Weitere Header{% if server and server.header_names %} (gesetzt: {{ server.header_names|join(', ') }}){% else %} (optional){% endif %}</label>
|
|
<textarea id="headers" name="headers" rows="3" autocomplete="off" placeholder="X-Api-Key: …"></textarea>
|
|
{% if server and server.header_names %}<label class="checkbox"><input type="checkbox" name="remove_headers" value="1"> Header entfernen</label>{% endif %}
|
|
<p class="form-hint">Je Zeile „Name: Wert“. Verschlüsselt gespeichert, die Werte werden nie wieder angezeigt; {% if server %}neue Header ersetzen alle bisherigen{% else %}Authorization gehört ins Feld Token{% endif %}.</p>
|
|
</div>
|
|
{% if server %}
|
|
<label class="checkbox"><input type="checkbox" name="active" value="1" {% if server.active %}checked{% endif %}> aktiv (inaktive Verbindungen bieten keine Tools an)</label>
|
|
{% else %}
|
|
<label class="cluster">
|
|
<input type="checkbox" name="exposure_confirmed" value="1" {% if form.exposure_confirmed %}checked{% endif %}>
|
|
<span>Ich bestätige, dass alle Mitglieder dieses Workspace sehen dürfen, was dieser Server über die KI liefert. Der Zugriff erfolgt mit dem hinterlegten Token, nicht mit den Rechten der einzelnen Mitglieder.</span>
|
|
</label>
|
|
{% endif %}
|
|
{% if error %}<p class="form-error">{{ error }}</p>{% endif %}
|
|
<div class="cluster">
|
|
<button class="btn btn-primary" type="submit">{{ 'Speichern' if server else 'Hinzufügen' }}</button>
|
|
<a class="btn btn-ghost" href="{{ back }}">Abbrechen</a>
|
|
</div>
|
|
</form>
|
|
</div></div>
|
|
{% endblock %}
|