npm-mcp
npm-mcp
Model Context Protocol-Server für Nginx Proxy Manager
Verwalten Sie Reverse-Proxy-Routing, TLS-Zertifikate, Zugriffslisten und Stream-Weiterleitungen im Dialog – mit Leitplanken, die davon ausgehen, dass Sie es letztendlich auf die Produktion ausrichten werden.
Inhalt
Related MCP server: npm-mcp
Warum es das gibt
Nginx Proxy Manager hat eine vollständige REST-API und keinen MCP-Server. Dies ist genau dieser Server – aber der interessante Teil ist nicht die technische Infrastruktur, sondern die Beschränkungen.
Ein Reverse-Proxy ist ein Single Point of Failure für alles dahinter. Ein Agent mit Schreibzugriff auf einen solchen kann Dienste lahmlegen, die er nie anfassen sollte. Das Design beginnt also genau dort:
Tools werden aus dem OpenAPI-Dokument der API selbst generiert, nicht handgeschrieben. Das Dokument ist im Repository festgeschrieben, und ein Drift-Test lässt die CI fehlschlagen, wenn sich die Upstream-Oberfläche ändert – statt dass Tools zur Laufzeit still 404 liefern.
Jedes Ergebnis durchläuft eine Schwärzungsgrenze, die im Zweifel blockiert. Sie wirft bei allem, was sie nicht prüfen kann, einen Fehler, statt es durchzureichen.
Leitplanken sind mutationsgetestet. Jede Sicherheitskontrolle hat einen Test, der nachweislich rot wird, wenn die Kontrolle deaktiviert ist.
So funktioniert es
flowchart LR
C["MCP Client"] -->|"Bearer (optional)"| S
subgraph S["npm-mcp"]
direction TB
A["Bearer verifier<br/><i>hmac.compare_digest</i>"] --> G["Guardrails<br/><i>S1 · S2 · S6 · S7 · S8</i>"]
G --> T["66 generated tools"]
T --> R["serialize_result()<br/><i>redact + cap</i>"]
end
S -->|"JWT, auto-refreshed"| N["Nginx Proxy Manager"]
P["npm-openapi.json<br/><i>pinned, in-package</i>"] -.->|generates| TTool-Signaturen werden beim Import aus dem festgeschriebenen Dokument erzeugt, daher bietet create_proxy_host 18 typisierte Argumente mit echten Enums – kein undurchsichtiger **kwargs-Durchgriff.
Schnellstart
uv sync
cp .env.example .env # then fill in NPM_URL / NPM_IDENTITY / NPM_SECRET
uv run npm-mcp{
"mcpServers": {
"npm": {
"command": "uv",
"args": ["run", "npm-mcp"],
"env": {
"NPM_URL": "https://nginx-proxy-manager.example.net",
"NPM_IDENTITY": "npm-mcp@example.net",
"NPM_SECRET": "…",
"NPM_MCP_TRANSPORT": "stdio"
}
}
}
}{
"mcpServers": {
"npm": {
"type": "http",
"url": "https://npm-mcp.example.net/mcp",
"headers": { "Authorization": "Bearer <NPM_MCP_BEARER_TOKEN>" }
}
}
}FastMCP bedient unter /mcp. Ein abschließender Schrägstrich erzeugt eine 307-Weiterleitung, was einige Clients falsch behandeln – lassen Sie nicht zu, dass ein Proxy den Pfad umschreibt.
[!TIP] Rufen Sie zuerst
get_guidanceauf. Es meldet Antwortstrukturen, die Unterscheidung zwischen Deaktivieren und Löschen, welche Verriegelungen derzeit offen sind und die aktive Liste geschützter Domains.
Authentifizierung
Zwei Ebenen, die leicht zu verwechseln sind:
Richtung | Mechanismus | |
Eingehend | client → npm-mcp | Optional |
Ausgehend | npm-mcp → NPM | Kontozugangsdaten → kurzlebiges JWT, automatisch erneuert. Aufrufer sehen oder übermitteln es nie. |
NPM vergibt keine langlebigen API-Schlüssel; deshalb hält der Server Zugangsdaten, statt ein Token zu akzeptieren.
[!IMPORTANT]
POST /tokenshat zwei mögliche Antworten: ein Token oder eine 2FA-Herausforderung. Wenn das Konto 2FA aktiviert hat, setzen SieNPM_TOTP_SECRET– andernfalls schlägt der Server beim Start fehl und benennt beide Abhilfen, statt gesund hochzufahren und beim ersten Tool-Aufruf zu brechen.
Tool-Katalog
66 Tools = 65 API-Operationen + get_guidance.
Familie | # | Repräsentative Tools |
🔀 Proxy-Hosts | 7 |
|
↪️ Weiterleitungs-Hosts | 7 |
|
🚫 404-Hosts | 7 |
|
🔌 Streams | 7 |
|
🔐 Zugriffslisten | 5 |
|
📜 Zertifikate | 10 |
|
👤 Benutzer | 8 |
|
🔑 Benutzer-2FA | 5 |
|
⚙️ Einstellungen | 3 |
|
📋 Audit-Log | 2 |
|
ℹ️ Meta | 4 |
|
🧭 Anleitung | 1 |
|
Die Namen leiten sich aus der OpenAPI-operationId ab, daher sind Listenoperationen get_* und nicht list_*.
[!WARNING] Drei Operationen sind bewusst nicht exponiert:
requestToken,refreshToken,loginWith2FA. Sie sind die eigene Auth-Infrastruktur des Servers, undrequestTokenakzeptiert eine beliebige Identität und ein beliebiges Geheimnis – es zu registrieren würde diesen Server in ein Orakel zum Testen von Zugangsdaten gegen NPM verwandeln, mit jedem Versuch, der dem Dienstkonto zugeschrieben würde.
Es gibt keine Paginierung. Kein einziger Endpunkt akzeptiert
limit/offset. Die Tools akzeptieren sie und schneiden clientseitig; die Tool-Beschreibungen sagen das.expandist ein Pro-Endpunkt-Enum, kein Durchgriff – Proxy-Hosts akzeptiertaccess_list,owner,certificate; Zertifikate nurowner. Werte außerhalb des Enums werden abgelehnt, bevor die Anfrage gesendet wird.
Sicherheitsmodell
[!CAUTION] Schreibvorgänge sind standardmäßig aktiviert. Dieser Server kann die Routing-Tabelle für jeden Dienst hinter dem Proxy neu schreiben. Setzen Sie
NPM_READ_ONLY=1, um alle Mutationen zu deaktivieren.
Kontrolle | Überschreibung | |
| Lehnt jedes mutierende Tool ab; wird geprüft, bevor irgendeine Leitplanke gelesen wird | — |
S1 | Verweigert |
|
S2 | Jedes | pro Aufruf |
S5 | Jede Mutation erzeugt eine Audit-Zeile; NPMs eigenes Audit-Log ist abfragbar | — |
S6 | Jede mutierende Operation unter |
|
S7 | Verweigert, das eigene Konto zu ändern, zu deaktivieren, zu löschen oder | keine |
S8 |
|
|
S1 matcht JEDE geschützte Domain, nicht ALLE. ALLE würde es erlauben, die Leitplanke durch die Tools, die sie schützt, zu entwaffnen: Fügen Sie einem Host eine unzusammenhängende Domain hinzu, und der Schutz verpufft.
S1 deckt
updateab, nicht nur delete/disable. Sonst entfernen Sie den geschützten Namen ausdomain_namesund löschen dann sauber – gleiche Störung.S1 matcht auf den aktuellen Upstream-Zustand, niemals auf den übermittelten Body. Würde die Anfrage geprüft, könnte der Strip-then-Update-Pfad direkt durchlaufen.
S1-Wildcards matchen in beide Richtungen.
NPM_PROTECTED_DOMAINS=*.example.netmussapp.example.netschützen. Es matchte einmal nichts und unterdrückte die Warnung „ungeschützt“, weil der Wert explizit gesetzt war.S2 wird über die HTTP-Methode eingegrenzt, nicht über ein Namenspräfix. Eine
delete_*-Regel übersiehtdisable_user_2fa– einDELETE, das jemandem den zweiten Faktor entzieht.S6 ist eine Regel, keine Liste. Eine aufgezählte Version ließ
update_userstillschweigend aus, sodass die Verriegelung geschlossen blieb, währendis_disabled: trueeinen Admin aussperrte.S7 hat keine Überschreibung. Ein Server, der seine eigenen Zugangsdaten löschen kann, sperrt sich dauerhaft aus.
Konfiguration
Variable | Bedeutung |
| Basis-URL der NPM-Instanz |
| Konto-E-Mail |
| Konto-Passwort |
Variable | Standard | Bedeutung |
| nicht gesetzt | Eingehendes Token. Nicht gesetzt ⇒ keine eingehende Authentifizierung |
|
|
|
|
| Bind-Adresse |
|
| Bind-Port |
Variable | Standard | Hebt |
|
| — ( |
| aus | S1-Blockliste, per Komma getrennt |
|
| S1 |
|
| S6 |
|
| S8 |
Variable | Standard | Bedeutung |
| nicht gesetzt | Base32-Startwert; nur falls das Konto 2FA aktiviert hat |
|
| NPM-Zertifikat verifizieren |
|
| Upstream-Timeout (Sekunden) |
|
| Antwortlimit vor der Kürzung |
|
| Hinweis auf |
|
|
Deployment
docker build -t npm-mcp:latest .
docker compose up -dDer Container tritt einem vorhandenen Docker-Netzwerk neben NPM bei und veröffentlicht keine Ports. NPM erreicht ihn über den Container-DNS und terminiert TLS, sodass das Bearer-Token niemals im Klartext über die Leitung geht.
Kein
build:-Schlüssel in der Compose-Datei. Ein Compose-String-Deployment (z. B. Portainer) liefert keinen Build-Kontext mit. Das Image wird deshalb zuerst gebaut und über ein Tag referenziert.Der Healthcheck löst den Bind-Host auf, statt
127.0.0.1hartzukodieren. Mit einem benutzerdefiniertenNPM_MCP_HTTP_HOSTmarkiert die naive Variante einen völlig gesunden Container für immer als ungesund. Unterstdioschlägt sie zusätzlich fehl, da dort überhaupt nichts lauscht.Die authentifizierende Aufwärmphase läuft in der Serverlebensdauer. So führt eine Fehlkonfiguration zu einem fehlgeschlagenen Healthcheck, statt dass der Container grün wird und erst bei der ersten Verwendung bricht.
Testing
uv run pytest # 420 tests
uv run ruff check
uv run ruff format --checkRund 4.700 Zeilen Tests gegenüber 3.300 Zeilen Quellcode – aber die bloße Anzahl zählt weniger als die Struktur:
🧬 Mutationsverifizierte Schutzvorkehrungen – für jede Sicherheitsabschirmung existiert ein Test, der nachweislich fehlschlägt, wenn die Absicherung abgeschaltet ist. Entstanden nach der Entdeckung eines
asyncio.Lock, dessen Entfernung die Testsuite grün ließ.🌐 Null Netzwerkzugriff – jeder Upstream-Aufruf ist mit
respxgemockt. Ein Test, der das Netzwerk braucht, ist ein kaputter Test.🔍 A7-Sweep – alle 65 Werkzeuge werden gegen einen Upstream aufgerufen, der Geheimnisse in vier Verschachtelungsebenen liefert; eine Negativkontrolle sichert ab, dass das Fixture diese Geheimnisse wirklich enthält, sodass der Sweep nicht ins Leere laufen kann.
📐 Schema-Drifit-Schutz – Operationszahlen, Payload-Strukturen und die eingepackte Datendatei werden alle überprüft; dadurch scheitert ein Upstream-Upgrade hier statt in der Produktion.
Designhinweise
Dokument | Inhalt |
Produktvertrag – Entscheidungen D1–D13, Schutzvorkehrungen S1–S8, Abnahmekriterien A1–A10 | |
Alle 68 Operationen mit Body-Feld und Pflichtfeld-Kennzeichnung | |
Schnittstellen der internen Module | |
Zwei Dinge, die das OpenAPI-Dokument falsch angibt, gemessen an einer Live-Instanz | |
Unveränderte Kopie der |
This server cannot be installed
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
- AlicenseBqualityCmaintenanceEnables management of Nginx Proxy Manager instances for configuring proxy hosts, requesting Let's Encrypt SSL certificates, and managing access lists. It allows users to control their web proxy infrastructure through natural language commands in MCP-compatible environments.503MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Nginx Proxy Manager instances through natural language, covering 28 tools for proxy hosts, certificates, streams, and more.MIT
- AlicenseCqualityDmaintenanceMCP server that abstracts the Nginx Proxy Manager API, enabling management of proxy hosts, redirections, streams, certificates, access lists, and users through natural language.54171AGPL 3.0
- AlicenseAqualityAmaintenanceEnables natural language management of FastPanel 2 servers, including creating sites, databases, SSL certificates, and hardening nginx configurations.322MIT
Related MCP Connectors
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
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/omichelbraga/nginx-proxy-manager-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server