Entkoppelt "Server erzeugen" von "Server erlauben": Ein MCP-Eintrag ohne URL erzeugt keinen eigenen (kollidierenden) HTTP-Server mehr, steuert aber weiterhin die Allowlist-Freigabe mcp__<name>__* bei. Gedacht für extern (z.B. stdio via ~/.claude.json) laufende Server, die gott nur erlauben, aber nicht selbst starten soll – sonst kollidiert gotts URL-Server mit dem gleichnamigen externen und der Server verschwindet ganz. - ParseMcpServers: Url optional (null erlaubt), nur Name+leer wird verworfen - Frontend: Name genügt, URL-Placeholder + Hinweistext angepasst Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
49 lines
2.0 KiB
JavaScript
49 lines
2.0 KiB
JavaScript
// ── MCP-Server UI (Liste pro Session) ──
|
||
// Spiegelt das Muster von commands-ui.js: dynamische Add/Remove-Zeilen, JSON-Persistenz.
|
||
// Pro Eintrag: Name, URL (http/sse), optionaler Token.
|
||
|
||
function createMcpServerRow(container, name, url, token) {
|
||
name = name || '';
|
||
url = url || '';
|
||
token = token || '';
|
||
|
||
const item = document.createElement('div');
|
||
item.className = 'mcp-server-item';
|
||
item.innerHTML = `
|
||
<div class="mcp-server-fields">
|
||
<input type="text" class="mcp-name" placeholder="Name (z.B. UnityMCP)" value="${esc(name)}" autocomplete="off">
|
||
<input type="text" class="mcp-url" placeholder="URL (optional – leer = nur Freigabe)" value="${esc(url)}" autocomplete="off">
|
||
<input type="password" class="mcp-token" placeholder="Token (optional)" value="${esc(token)}" autocomplete="off">
|
||
</div>
|
||
<button type="button" class="remove-mcp-btn icon-btn"><i class="fa fa-times"></i></button>
|
||
`;
|
||
item.querySelector('.remove-mcp-btn').addEventListener('click', function() { item.remove(); });
|
||
container.appendChild(item);
|
||
}
|
||
|
||
function getMcpServersFromUI(container) {
|
||
var items = container.querySelectorAll('.mcp-server-item');
|
||
var servers = [];
|
||
for (var i = 0; i < items.length; i++) {
|
||
var item = items[i];
|
||
var name = item.querySelector('.mcp-name').value.trim();
|
||
var url = item.querySelector('.mcp-url').value.trim();
|
||
var token = item.querySelector('.mcp-token').value.trim();
|
||
// Name genügt. Ohne URL = reiner Freigabe-Eintrag (kein eigener Server, nur Allowlist).
|
||
if (name) servers.push({ name: name, url: url || null, token: token || null });
|
||
}
|
||
return servers.length > 0 ? servers : null;
|
||
}
|
||
|
||
function loadMcpServersIntoUI(container, mcpServers) {
|
||
if (!mcpServers) return;
|
||
try {
|
||
var list = typeof mcpServers === 'string' ? JSON.parse(mcpServers) : mcpServers;
|
||
if (!Array.isArray(list)) return;
|
||
for (var i = 0; i < list.length; i++) {
|
||
var s = list[i];
|
||
createMcpServerRow(container, s.name || '', s.url || '', s.token || '');
|
||
}
|
||
} catch (e) { /* ignore parse errors */ }
|
||
}
|