MariaDB MCP Server
Allows read-only querying of a MariaDB database, providing tools for executing SELECT queries, exploring schema, and listing tables and databases.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MariaDB MCP Serverlist all tables in the database"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MariaDB MCP Server mit streamable HTTP für Open-WebUI
Ein read-only MCP Server, der als Schnittstelle zwischen einer MariaDB Datenbank und Open-WebUI dient. Der Server erlaubt ausschließlich lesende Abfragen und blockiert alle Schreiboperationen wie INSERT, UPDATE, DELETE, CREATE, ALTER, DROP usw.
Hinweis: Der Server verwendet
mysql-connector-python, der vollständig mit MariaDB kompatibel ist und keine externen Systembibliotheken benötigt. Der Server ist MCP-kompatibel und implementiert die notwendigen Endpunkte für Open-WebUI. Aktuellste Version verwendet Python 3.12 als Base Image.
:rocket: Schnellstart
Mit Docker (empfohlen)
# Klone das Repository
git clone https://github.com/AndiAtom/mariadb-mcp-strhttp.git
cd mariadb-mcp-strhttp
# Starte mit Docker Compose (enthält MariaDB + MCP Server)
docker-compose up -d
# Der Server ist jetzt unter http://localhost:8000 verfügbarOhne Docker
# Installiere Abhängigkeiten
pip install -r requirements.txt
# Starte den Server
python -m src.server
# Oder direkt
python src/server.pyRelated MCP server: tusk-mcp
:gear: Konfiguration
Umgebungsvariablen
Der Server kann über Umgebungsvariablen oder eine config.json-Datei konfiguriert werden.
Datenbank-Konfiguration
Variable | Beschreibung | Standardwert | Beispiel |
| MariaDB Hostname |
|
|
| MariaDB Port |
|
|
| MariaDB Benutzername |
|
|
| MariaDB Passwort |
|
|
| Standard-Datenbank |
|
|
| Timeout für Datenbankabfragen (Sekunden) |
|
|
Server-Konfiguration
Variable | Beschreibung | Standardwert | Beispiel |
| Server Host |
|
|
| Server Port |
|
|
| Log-Level |
|
|
API-Token-Authentifizierung
Variable | Beschreibung | Standardwert | Beispiel |
| Einzelner API-Token |
|
|
| Mehrere API-Tokens (komma-separiert) |
|
|
| Pfad zur Token-Datei |
|
|
| Authentifizierung deaktivieren |
|
|
| Name des Authorization Headers |
|
|
| Name des Query-Parameters |
|
|
Rate Limiting
Variable | Beschreibung | Standardwert | Beispiel |
| Rate Limiting aktivieren |
|
|
| Anfragen pro Minute |
|
|
| Burst-Anfragen |
|
|
| Whitelisted Pfade |
|
|
Konfigurationsdatei
Erstelle oder bearbeite config.json:
{
"server": {
"host": "0.0.0.0",
"port": 8000,
"log_level": "info"
},
"database": {
"host": "localhost",
"port": 3306,
"user": "mcpuser",
"password": "securepassword",
"database": "mydatabase",
"timeout": 30
},
"security": {
"read_only": true,
"block_write_operations": true,
"validate_queries": true
},
"authentication": {
"enabled": true,
"type": "api_token",
"tokens": ["token1", "token2"],
"token_file": null,
"header_name": "Authorization",
"query_param_name": "api_key"
},
"rate_limiting": {
"enabled": true,
"requests_per_minute": 100,
"burst_requests": 10,
"whitelist": ["/health", "/", "/docs", "/openapi.json", "/redoc"]
}
}Hinweis: Die Konfiguration kann auch über Umgebungsvariablen überschrieben werden.
:key: API-Token-Authentifizierung
Der Server unterstützt optionale API-Token-Authentifizierung, um den Zugriff auf die API zu schützen.
Token-Generierung
Das Projekt enthält ein Skript generate_token.py zur Generierung sicherer API-Tokens:
# Einzelnen Token generieren
python generate_token.py
# Mehrere Tokens generieren
python generate_token.py --num 5
# Token mit bestimmter Länge generieren (Standard: 32 Zeichen)
python generate_token.py --length 64
# Token in Datei speichern
python generate_token.py --file tokens.json
# Tokens nur anzeigen (nicht speichern)
python generate_token.py --no-fileAuthentifizierung aktivieren
Es gibt mehrere Möglichkeiten, die Authentifizierung zu konfigurieren:
1. Einzelner Token über Umgebungsvariable
# In docker-compose.yml oder beim Starten
API_TOKEN=your-secure-token-here2. Mehrere Tokens über Umgebungsvariable (komma-separiert)
API_TOKENS=token1,token2,token33. Token aus Datei laden
Erstelle eine JSON-Datei tokens.json:
{
"tokens": [
"your-secure-token-1",
"your-secure-token-2"
]
}Oder eine einfache Textdatei (ein Token pro Zeile):
token1
token2
token3Dann in docker-compose.yml:
environment:
- API_TOKEN_FILE=/app/tokens.json
volumes:
- ./tokens.json:/app/tokens.json:ro4. Authentifizierung deaktivieren (Standard)
DISABLE_API_AUTH=trueToken verwenden
Es gibt drei Möglichkeiten, den Token zu übergeben:
1. Authorization Header (empfohlen)
curl -X POST http://localhost:8000/query \
-H "Authorization: Bearer your-secure-token" \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM customers LIMIT 10"}'2. Query Parameter
curl -X POST http://localhost:8000/query?api_key=your-secure-token \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM customers LIMIT 10"}'3. Im Request Body
curl -X POST http://localhost:8000/query \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM customers LIMIT 10", "api_key": "your-secure-token"}'Öffentliche Endpunkte
Die folgenden Endpunkte benötigen keine Authentifizierung:
GET /- Server-InformationenGET /health- Health-CheckGET /docs- Swagger UIGET /openapi.json- OpenAPI-SpezifikationGET /redoc- ReDoc
Alle anderen Endpunkte erfordern einen gültigen API-Token, wenn die Authentifizierung aktiviert ist.
:desktop_computer: Open-WebUI Integration
MCP Server in Open-WebUI hinzufügen
Öffne Open-WebUI (z.B.
http://localhost:8080)Gehe zu Einstellungen --> MCP Server oder Externe Tool-Server
Klicke auf "Add MCP Server" oder "Neuer Server"
Füge folgende Konfiguration ein:
{
"name": "MariaDB Read-Only",
"type": "http",
"url": "http://localhost:8000",
"readOnly": true,
"headers": {
"Authorization": "Bearer your-api-token-here"
},
"capabilities": {
"query": true,
"stream": true,
"validate": true,
"list_resources": false,
"read_resource": false
},
"timeout": 60
}:bulb: Hinweis: Open-WebUI erkennt automatisch den MCP-kompatiblen Endpunkt. Die URL kann einfach
http://localhost:8000sein, der Server hat sowohl den Standard- als auch den/mcp-Endpunkt.
Verbindung testen
Frage Open-WebUI:
"Was sind die Tabellen in der Datenbank?"Erwartete Antwort: Eine Liste aller Tabellen aus deiner MariaDB.
:shield: Sicherheitsfeatures
Read-Only Implementierung
Der Server implementiert zwei Ebenen von Read-Only-Schutz:
Session-Ebene:
SET SESSION read_only=ONwird einmal beim Verbinden gesetztAbfrage-Ebene: Jede Abfrage wird vor der Ausführung auf Schreiboperationen geprüft
Hinweis: Selbst wenn die Abfrage-Validierung umgangen würde, blockiert MariaDB alle Schreiboperationen auf Session-Ebene. Die Kombination beider Mechanismen bietet maximalen Schutz.
Query Timeout Schutz
Standard-Timeout: Alle Datenbankabfragen haben einen Standard-Timeout von 30 Sekunden
Individueller Timeout: Kann pro Abfrage über den
timeout-Parameter angepasst werdenStreaming-Limit: Streaming-Abfragen sind auf 10.000 Zeilen begrenzt, um sehr große Resultsets zu verhindern
Konfigurierbar: Timeout kann über die Umgebungsvariable
DB_TIMEOUToder in der Konfigurationsdatei angepasst werden
Blockierte Befehle
Der Server blockiert alle Schreiboperationen, einschließlich:
DDL (Data Definition Language)
CREATE- Tabellen, Datenbanken, Indizes erstellenALTER- Objekte ändernDROP- Objekte löschenTRUNCATE- Tabellen leerenRENAME- Objekte umbenennen
DML (Data Manipulation Language)
INSERT- Daten einfügenUPDATE- Daten aktualisierenDELETE- Daten löschenREPLACE- Daten ersetzenLOAD- Daten ladenMERGE- Daten zusammenführen
DCL (Data Control Language)
GRANT- Berechtigungen erteilenREVOKE- Berechtigungen entziehenDENY- Berechtigungen verweigern
Transaktionssteuerung
COMMIT- Transaktionen bestätigenROLLBACK- Transaktionen zurücksetzenSAVEPOINT- Speicherpunkte erstellenRELEASE- Speicherpunkte freigeben
Administrative Befehle
SHUTDOWN- Server herunterfahrenKILL- Verbindungen beendenPURGE- Logs bereinigenRESET- ZurücksetzenFLUSH- Caches leerenSET PASSWORD- Passwort ändernSET GLOBAL- Globale Variablen setzenSET SESSION- Sitzungsvariablen setzen (außer read_only)
Replikation
CHANGE MASTER- Master ändernSTART SLAVE- Slave startenSTOP SLAVE- Slave stoppen
MariaDB/MySQL-spezifische Befehle
OPTIMIZE TABLE- Tabellen defragmentieren (Schreiboperation)REPAIR TABLE- Tabellen reparieren (Schreiboperation)ANALYZE TABLE- Statistiken aktualisieren (Schreiboperation)CHECK TABLE- Tabellen prüfen (kann Reparaturen auslösen)CHECKSUM TABLE- Prüfsummen berechnen
Erlaubte Befehle
Nur folgende Befehle sind erlaubt:
Datenabfragen
SELECT- Daten abfragenWITH/CTE- Common Table Expressions
Metadaten-Abfragen
SHOW- Informationen anzeigen (TABLES, DATABASES, COLUMNS, INDEX, etc.)DESCRIBE/DESC- Tabellenstruktur anzeigenEXPLAIN- Ausführungsplan anzeigen
Informationsschema
INFORMATION_SCHEMA- Metadaten abfragen
Transaktionssteuerung (nur lesend)
START TRANSACTION READ ONLY- Read-Only Transaktion startenBEGIN READ ONLY- Read-Only Transaktion beginnenSET TRANSACTION READ ONLY- Transaktion als read-only setzen
Sonstige
USE- Datenbank auswählenHELP- Hilfe anzeigen
:satellite: API Endpunkte
MCP Endpunkte (für Open-WebUI)
Methode | Endpunkt | Beschreibung |
GET |
| MCP Server Information (Tools, Capabilities) |
POST |
| MCP Anfragen verarbeiten |
Standard API Endpunkte (für direkte Nutzung)
Methode | Endpunkt | Beschreibung | Parameter |
GET |
| Server-Informationen | - |
GET |
| Health-Check | - |
POST |
| SQL-Abfrage ausführen |
|
GET |
| SQL-Abfrage validieren |
|
POST |
| SQL-Abfrage validieren |
|
GET |
| SQL-Abfrage mit Streaming |
|
GET |
| Alle Tabellen auflisten |
|
GET |
| Alle Datenbanken auflisten | - |
GET |
| Schema einer Tabelle abrufen |
|
GET |
| Spalten einer Tabelle abrufen |
|
GET |
| Beispiele für erlaubte Abfragen | - |
GET |
| OpenAPI-Spezifikation | - |
GET |
| Swagger UI Dokumentation | - |
:computer: API Beispiele
Einfache Abfrage mit Authentifizierung
# Mit Authorization Header
curl -X POST http://localhost:8000/query \
-H "Authorization: Bearer your-api-token" \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM customers LIMIT 10"}'
# Mit Query Parameter
curl -X POST http://localhost:8000/query?api_key=your-api-token \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM customers LIMIT 10"}'
# Mit Token im Body
curl -X POST http://localhost:8000/query \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM customers LIMIT 10", "api_key": "your-api-token"}'
# Mit Datenbank-Angabe
curl -X POST http://localhost:8000/query \
-H "Authorization: Bearer your-api-token" \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM mails LIMIT 5", "database": "tanss"}'MCP Endpunkt testen
# MCP Server Info abrufen (keine Authentifizierung nötig)
curl http://localhost:8000/mcp
# MCP Anfrage ausführen (mit Authentifizierung)
curl -X POST http://localhost:8000/mcp \
-H "Authorization: Bearer your-api-token" \
-H "Content-Type: application/json" \
-d '{"method": "execute_query", "params": {"query": "SELECT * FROM customers LIMIT 5"}}'Streaming Abfrage
curl -H "Authorization: Bearer your-api-token" \
http://localhost:8000/query/stream?query=SELECT%20*%20FROM%20large_tableAntwort (Server-Sent Events):
data: {"type": "metadata", "columns": ["id", "name"], "query": "SELECT * FROM large_table"}
data: {"type": "row", "data": {"id": 1, "name": "Row 1"}}
data: {"type": "row", "data": {"id": 2, "name": "Row 2"}}
data: {"type": "complete", "total_rows": 1000}Abfrage validieren
curl -X POST http://localhost:8000/query/validate \
-H "Authorization: Bearer your-api-token" \
-H "Content-Type: application/json" \
-d '{"query": "INSERT INTO users VALUES (1, \"test\")"}'Antwort:
{
"valid": false,
"error": "Abfrage enthält Schreiboperationen. Nur lesende Abfragen sind erlaubt.",
"blocked_keywords": ["INSERT"]
}Tabellen auflisten
# Alle Tabellen in der aktuellen Datenbank
curl -H "Authorization: Bearer your-api-token" \
http://localhost:8000/tables
# Tabellen in einer bestimmten Datenbank
curl -H "Authorization: Bearer your-api-token" \
http://localhost:8000/tables?database=tanssSchema einer Tabelle abrufen
curl -H "Authorization: Bearer your-api-token" \
http://localhost:8000/schema/customers:hourglass: Rate Limiting
Der Server implementiert Rate Limiting, um die API vor übermäßiger Nutzung zu schützen.
Standard-Konfiguration
Aktiviert: Ja (standardmäßig)
Anfragen pro Minute: 100
Burst-Anfragen: 10
Whitelist:
/,/health,/docs,/openapi.json,/redoc
Rate Limit Header
Jede Antwort enthält folgende Header:
X-RateLimit-Limit: Maximale Anfragen pro MinuteX-RateLimit-Remaining: Verbleibende AnfragenX-RateLimit-Reset: Zeitstempel, wann das Limit zurückgesetzt wird
Fehlerbehandlung
Bei Überschreitung des Rate Limits:
HTTP Status: 429 Too Many Requests
Header:
Retry-After: 60(Sekunden bis zum nächsten Versuch)Body:
{ "error": "Too Many Requests", "detail": "Rate Limit überschritten. Maximale Anfragen: 100 pro Minute", "retry_after": 60 }
:test_tube: Testen
Automatisierte Tests
# Installiere Test-Abhängigkeiten
pip install pytest httpx
# Führe Tests aus
pytest tests/Manuelles Testen
Verbindung testen:
curl http://localhost:8000/healthMCP Endpunkt testen:
curl http://localhost:8000/mcpErlaubte Abfrage testen:
curl -X POST http://localhost:8000/query \ -H "Authorization: Bearer your-token" \ -d '{"query": "SELECT 1"}'Blockierte Abfrage testen:
curl -X POST http://localhost:8000/query \ -H "Authorization: Bearer your-token" \ -d '{"query": "INSERT INTO test VALUES (1)"}'--> Sollte Fehler 403 zurückgeben
Authentifizierung testen:
# Ohne Token (sollte 401 zurückgeben, wenn Auth aktiviert) curl -X POST http://localhost:8000/query \ -d '{"query": "SELECT 1"}' # Mit falschem Token (sollte 401 zurückgeben) curl -X POST http://localhost:8000/query \ -H "Authorization: Bearer wrong-token" \ -d '{"query": "SELECT 1"}' # Mit richtigem Token (sollte funktionieren) curl -X POST http://localhost:8000/query \ -H "Authorization: Bearer your-correct-token" \ -d '{"query": "SELECT 1"}'
:wrench: Fehlerbehebung
Häufige Probleme und Lösungen
1. Open-WebUI erkennt den MCP Server nicht
Ursache: Falsche URL oder Server nicht erreichbar
Lösung:
URL in Open-WebUI auf
http://localhost:8000setzenServer-Status prüfen:
curl http://localhost:8000/healthMCP-Endpunkt testen:
curl http://localhost:8000/mcp
2. "Leere Abfrage" Fehler
Ursache: Open-WebUI sendet die Abfrage in einem anderen Format
Lösung: Der Server unterstützt jetzt:
JSON Body:
{"query": "SELECT ..."}Formular-Daten:
query=SELECT ...Alternative Feldnamen:
query,sql,qDatenbank-Angabe:
{"query": "...", "database": "tanss"}
3. Verbindung zur Datenbank scheitert
Ursache: Falsche Credentials oder MariaDB nicht für Remote-Zugriff konfiguriert
Lösung:
Prüfe
DB_HOST,DB_USER,DB_PASSWORDindocker-compose.ymlMariaDB für Remote-Zugriff konfigurieren:
# In /etc/mysql/mariadb.conf.d/50-server.cnf bind-address = 0.0.0.0Benutzer berechtigen:
GRANT SELECT ON *.* TO 'mcp_user'@'%'; FLUSH PRIVILEGES;network_mode: hostindocker-compose.ymlverwenden
4. Server nicht erreichbar
Ursache: Port Konflikt oder Firewall
Lösung:
Prüfe mit
curl http://localhost:8000/healthPort 8000 freigeben:
sudo ufw allow 8000Andere Dienste auf Port 8000 beenden:
sudo lsof -i :8000
5. Docker-Container startet nicht
Ursache: Berechtigungsprobleme oder fehlende Abhängigkeiten
Lösung:
docker-compose down docker-compose up -d --build docker-compose logs mariadb-mcp-server
6. Abfragen werden blockiert
Ursache: Abfrage enthält Schreiboperationen
Lösung:
Validierung prüfen:
curl -X POST http://localhost:8000/query/validate -d '{"query": "DEINE_ABFRAGE"}'Nur lesende Abfragen verwenden (SELECT, SHOW, DESCRIBE, etc.)
7. 401 Unauthorized Fehler
Ursache: API-Token-Authentifizierung aktiviert, aber kein oder falscher Token angegeben
Lösung:
Token in Authorization Header angeben:
-H "Authorization: Bearer your-token"Token als Query Parameter angeben:
?api_key=your-tokenToken im Request Body angeben:
{"api_key": "your-token"}Authentifizierung deaktivieren:
DISABLE_API_AUTH=true
:package: Abhängigkeiten
Der Server verwendet folgende Python-Pakete:
Paket | Version | Zweck |
fastapi | >=0.104.0 | Web-Framework für die API |
uvicorn | >=0.24.0 | ASGI-Server |
mysql-connector-python | >=8.0.0 | MariaDB/MySQL Connector |
sse-starlette | >=1.6.0 | Server-Sent Events Unterstützung |
pydantic | >=2.5.0 | Datenvalidierung |
python-multipart | >=0.0.6 | Formular-Daten Unterstützung |
:bulb: Hinweis: Wir verwenden
mysql-connector-pythonstattmariadb, da dieser Connector keine externen Systembibliotheken benötigt und damit Docker-freundlicher ist. Er ist vollständig kompatibel mit MariaDB.
:bookmark: Versionshistorie
Version | Datum | Änderungen |
v1.0.0 | 2024-07-28 | Erste stabile Version |
Read-only SQL-Validierung | ||
Streaming-Unterstützung | ||
Docker-Unterstützung | ||
Wechsel zu mysql-connector-python | ||
MCP-kompatibler Endpunkt | ||
v1.0.1 | 2024-07-29 | Bugfixes |
Behebe "Leere Abfrage" Fehler | ||
Behebe TRANSACTION READ ONLY Fehler | ||
Unterstützung für alternative Anfrage-Formate | ||
Verbesserte Docker-Netzwerk-Konfiguration | ||
v1.1.0 | 2024-07-30 | API-Token-Authentifizierung |
Unterstützung für einzelne und mehrere Tokens | ||
Token aus Datei laden | ||
Flexible Token-Übertragung (Header, Query, Body) | ||
Benutzerdefinierte Header/Parameter Namen | ||
Öffentliche Endpunkte ohne Authentifizierung | ||
v1.2.0 | 2025-01-01 | Erweiterte Sicherheit |
Thread-sicheres Rate Limiting | ||
Korrigierte asyncio-Probleme | ||
Verbesserte Fehlerbehandlung | ||
Aktualisierte Dokumentation |
:busts_in_silhouette: Mitwirken
Fork das Repository
Erstelle einen Feature-Branch (
git checkout -b feature/AmazingFeature)Commit deine Änderungen (
git commit -m 'Add some AmazingFeature')Push zum Branch (
git push origin feature/AmazingFeature)Öffne einen Pull Request
:memo: Lizenz
Dieses Projekt ist unter der MIT-Lizenz lizenziert - siehe LICENSE für Details.
:email: Kontakt
GitHub: AndiAtom/mariadb-mcp-strhttp
Issues: GitHub Issues
Hinweis: Dieser Server ist ausschließlich für lesende Abfragen konzipiert. Alle Versuche, Schreiboperationen auszuführen, werden blockiert und führen zu einem Fehler.
Technischer Hinweis: Der Server verwendet mysql-connector-python, der vollständig mit MariaDB kompatibel ist und keine externen C-Bibliotheken benötigt, was die Docker-Installation deutlich vereinfacht. Der Server implementiert einen MCP-kompatiblen Endpunkt (/mcp) für nahtlose Integration mit Open-WebUI und unterstützt sowohl JSON- als auch Formular-Daten-Anfragen. Die Read-Only-Funktionalität wird auf Session-Ebene (SET SESSION read_only=ON) und auf Abfrage-Ebene (Validierung) sichergestellt. Die API-Token-Authentifizierung bietet eine zusätzliche Sicherheitsebene für den Zugriff auf die API.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that provides read-only access to MySQL databases.451970MIT
- Alicense-qualityCmaintenanceA read-only PostgreSQL MCP server that enables AI agents to perform schema introspection and execute SELECT-only queries. It supports secure database connections through SSL and SSH tunnels while offering a structure-only mode to restrict query access.163MIT
- Alicense-qualityDmaintenanceA lightweight MCP server providing safe, read-only access to MySQL databases. It enables users to query multiple MySQL instances securely while preventing write operations.848MIT
- AlicenseAqualityCmaintenanceRead-only MySQL/MariaDB MCP server for running SELECT queries safely, with automatic read-only enforcement and query limits.316MIT
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Read-only MCP server for wafergraph.com's semiconductor & AI supply-chain data: 30 tools, no auth.
MCP (Model Context Protocol) server for Appwrite
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AndiAtom/mariadb-mcp-strhttp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server