#!/usr/bin/env python3 """Tests for the single declarative MCP client registry.""" from __future__ import annotations import importlib.util import json import sqlite3 import tempfile import unittest from pathlib import Path ROOT = Path(__file__).parents[1] SOURCE = ROOT / "platform/mcp/sync-clients.py" def load_module(): spec = importlib.util.spec_from_file_location("sync_clients", SOURCE) module = importlib.util.module_from_spec(spec) assert spec.loader spec.loader.exec_module(module) return module class RegistryTests(unittest.TestCase): def setUp(self): self.module = load_module() self.temp = tempfile.TemporaryDirectory() self.root = Path(self.temp.name) self.registry = self.root / "registry.json" self.registry.write_text(json.dumps({"version": 1, "servers": [{ "id": "one", "name": "One", "description": "Test", "url": "http://one/mcp", "clients": ["hermes", "openwebui"], "timeout": 123, }]})) def tearDown(self): self.temp.cleanup() def test_same_registry_generates_both_clients(self): items = self.module.active(self.registry, "hermes") block = self.module.hermes_block(items) self.assertIn("one:", block) db = self.root / "webui.db" con = sqlite3.connect(db) con.execute("create table config (key text primary key, value text, updated_at integer)") con.commit(); con.close() self.module.update_openwebui(db, self.module.active(self.registry, "openwebui")) con = sqlite3.connect(db) value = json.loads(con.execute("select value from config where key='tool_server.connections'").fetchone()[0]) con.close() self.assertEqual(value[0]["info"]["id"], "one") def test_old_platform_context_registration_is_removed(self): db = self.root / "webui.db" con = sqlite3.connect(db) con.execute("create table config (key text primary key, value text, updated_at integer)") con.execute("insert into config values (?,?,?)", ("tool_server.connections", json.dumps([ {"info": {"id": "athena-platform"}, "url": "http://old/mcp"}, {"info": {"id": "unmanaged"}, "url": "http://keep/mcp"}, ]), 0)) con.commit(); con.close() self.module.update_openwebui(db, self.module.active(self.registry, "openwebui")) con = sqlite3.connect(db) ids = [item["info"]["id"] for item in json.loads(con.execute("select value from config where key='tool_server.connections'").fetchone()[0])] con.close() self.assertEqual(ids, ["unmanaged", "one"]) def test_production_registry_has_unique_ids_and_fritzbox(self): document = json.loads((ROOT / "config/mcp-registry.json").read_text()) ids = [item["id"] for item in document["servers"]] hermes_ids = [ item.get("hermes_id", item["id"]) for item in document["servers"] if "hermes" in item.get("clients", []) ] self.assertEqual(len(ids), len(set(ids))) self.assertEqual(len(hermes_ids), len(set(hermes_ids))) fritz = next(item for item in document["servers"] if item["id"] == "fritzbox-local") self.assertEqual(fritz["hub"]["type"], "stdio") self.assertIn("fritz-mcp", fritz["hub"]["args"][-1]) self.assertEqual(len(fritz["tool_include"]), 4) def test_hermes_tool_filter_is_generated(self): item = { "id": "wide", "name": "Wide", "description": "Test", "url": "http://wide/mcp", "clients": ["hermes"], "tool_include": ["list", "describe", "call"], } block = self.module.hermes_block([item]) self.assertIn(" tools:\n include:", block) self.assertIn(' - "describe"', block) def test_raw_mcphub_token_can_replace_host_specific_env_file(self): item = { "id": "hub", "name": "Hub", "description": "Test", "url": "http://hub/mcp/test", "clients": ["hermes"], "env_file": "/missing/client.env", "key_env": "MCPHUB_BEARER_TOKEN", } self.module.CLIENT_TOKEN = "local-token" self.assertTrue(self.module.enabled(item)) self.assertEqual(self.module.resolved(item), ("http://hub/mcp/test", "local-token")) if __name__ == "__main__": unittest.main()