jsmcp
jsmcp existiert für Fälle, in denen ein Agent mehr als einen einzelnen MCP-Tool-Aufruf tätigen muss.
Die meisten MCP-Clients sind großartig für einen Tool-Aufruf nach dem anderen, aber umständlich, wenn die Arbeit Folgendes erfordert:
mehrere zusammenhängende Tool-Aufrufe
Verzweigungslogik basierend auf früheren Ergebnissen
Schleifen, Wiederholungsversuche oder Ergebnisaggregation
Transformation von Tool-Ausgaben vor dem nächsten Aufruf
jsmcp löst dies, indem es zugelassene MCP-Tools als JavaScript-Namespaces bereitstellt. Anstatt das Modell zu zwingen, viele separate Tool-Aufrufe zu jonglieren, kann es entdecken, was verfügbar ist, und dann eine kleine Menge JavaScript schreiben, um diese Tools programmatisch zu nutzen.
In der Praxis bedeutet das:
der Agent lernt zuerst, welche Server und Tools verfügbar sind, während
jsmcpden Zugriff auf die Server und Tools beschränkt, die Sie in einem Preset erlaubender Agent kann dann JavaScript für mehrstufige Arbeit schreiben
Protokolle bleiben von Rückgabewerten getrennt, sodass der Code leichter nachvollziehbar bleibt
Die Konfiguration wird aus $XDG_CONFIG_HOME/jsmcp/ gelesen oder, falls XDG_CONFIG_HOME nicht gesetzt ist, aus ~/.config/jsmcp/. Genau eine der Dateien config.json, config.yaml oder config.yml muss dort existieren.
Warum
Verwenden Sie jsmcp, wenn Sie möchten, dass Agenten MCP-Tools eher wie eine kleine programmierbare API-Oberfläche behandeln als wie eine Abfolge isolierter Tastendrücke.
Dies ist besonders nützlich, wenn ein Agent:
Ergebnisse von mehreren MCP-Tools kombinieren muss
Arbeitsabläufe über einen oder mehrere MCP-Server hinweg skripten muss
Entscheidungen im Code treffen muss, anstatt wiederholt zwischen Tool-Aufrufen neu zu planen
den Tool-Zugriff auf ein geprüftes Preset beschränkt halten muss
Related MCP server: MCPMan
Installation
npm install -g @alesya_h/jsmcpOder führen Sie es aus, ohne es global zu installieren:
npx @alesya_h/jsmcp runAusführen
jsmcp run
jsmcp run work
jsmcp server work --port 3000 --bind 0.0.0.0
jsmcp client --profile work --host 127.0.0.1 --port 3000
jsmcp client --profile work --port 3000 --session-id my-agent-session
jsmcp auth
jsmcp auth firefox_devtoolsWenn Sie aus einem Quell-Checkout statt aus einem installierten Paket ausführen, ersetzen Sie jsmcp durch node src/index.js, zum Beispiel node src/index.js run.
run startet den Meta-MCP-Server direkt über stdio.
server startet einen langlebigen Daemon unter ws://<bind>:<port>/mcp, lädt das gewählte Preset einmal und hält die zugrunde liegenden MCP-Server-Verbindungen warm. Er bindet standardmäßig an 0.0.0.0 und akzeptiert --bind <host>, um eine andere Bind-Adresse zu wählen.
client stellt einen stdio-MCP-Server bereit, der rohe MCP/JSON-RPC-Nachrichten über WebSocket an server weiterleitet. Er akzeptiert --host <host> und --port <number>, um den Daemon zu wählen, mit dem eine Verbindung hergestellt werden soll, kann optional --profile <name> übergeben, um zu verlangen, dass der Daemon das erwartete Preset ausführt, und akzeptiert --session-id <id>, um dieselbe daemon-seitige Protokollsitzung über Client-Wiederverbindungen hinweg wiederzuverwenden.
run, server und client akzeptieren alle ein optionales Preset entweder als positionelles Argument oder als --profile <name>. Der Standard-Daemon-Port ist 41528. Wenn client --session-id weggelassen wird, generiert der Client eine zufällige Sitzungs-ID und verwendet sie für Wiederverbindungen während dieses Client-Prozesses wieder.
Beim ersten Start von server erstellt jsmcp einen API-Schlüssel unter $XDG_CONFIG_HOME/jsmcp/api-key.txt oder ~/.config/jsmcp/api-key.txt, falls XDG_CONFIG_HOME nicht gesetzt ist. Daemon-WebSocket- und HTTP-API-Anfragen müssen diesen im Header X-JSMCP-API-Key enthalten; nicht authentifizierte Anfragen erhalten 401.
Der Daemon stellt außerdem die fünf Meta-Tools über einen JSON-HTTP-Endpunkt bereit:
POST /api/call?tool=list_servers&profile=<name>
POST /api/call?tool=list_tools&profile=<name>
POST /api/call?tool=execute_code&sessionId=<id>&profile=<name>
POST /api/call?tool=fetch_logs&sessionId=<id>
POST /api/call?tool=clear_logs&sessionId=<id>Der Anfragetext ist ein JSON-Objekt, das den ausgewählten MCP-Tool-Argumenten entspricht. HTTP-Aufrufer können sessionId in die Abfragezeichenfolge aufnehmen, um eine stabile daemon-seitige Protokollsitzung zu verwenden. Sie können profile aufnehmen, um zu verlangen, dass der Daemon das erwartete Preset ausführt; bei Nichtübereinstimmung wird 409 zurückgegeben.
Verwenden Sie jsmcp auth, um OAuth für Remote-Server zu verwalten. Ohne Argumente werden Remote-Server aufgelistet, für die OAuth aktiviert ist. Mit einem Servernamen wird der OAuth-Ablauf für diesen Server gestartet.
Wenn keine grafische Umgebung erkannt wird oder wenn Sie --no-browser übergeben, druckt jsmcp auth <server> die Autorisierungs-URL und wartet entweder auf den Localhost-Callback oder eine eingefügte Callback-URL/einen Code.
systemd Benutzerdienst
Dieses Repo enthält systemd/jsmcp.service, eine Benutzereinheit, die jsmcp server über die global installierte CLI startet.
Installieren Sie sie mit:
npm install -g .
mkdir -p ~/.config/systemd/user
ln -sfn "$PWD/systemd/jsmcp.service" ~/.config/systemd/user/jsmcp.service
systemctl --user daemon-reload
systemctl --user enable --now jsmcp.serviceNützliche Befehle:
systemctl --user status jsmcp.service
journalctl --user -u jsmcp.service -f
systemctl --user restart jsmcp.serviceDie eingecheckte Einheit startet das Standard-Preset auf dem Standard-Daemon-Port und löst jsmcp über die tatsächliche Login-Shell des Benutzers aus getent passwd auf.
Konfiguration
Die Konfigurationsdatei kann JSON oder YAML sein und verwendet diese Schlüssel auf oberster Ebene:
servers: Serverdefinitionenpresets: optionale Überschreibungen dafür, welche Server und Tools dem Agenten ausgesetzt sind
Servernamen müssen gültige JavaScript-Bezeichner sein, da execute_code() sie direkt als Globals bereitstellt.
jsmcp akzeptiert sowohl den OpenCode-MCP-Konfigurationsstil als auch den überlappenden Claude-Code-MCP-Stil für die gemeinsamen Felder:
lokale Server:
type: "local"odertype: "stdio"Remote-Server:
type: "remote",type: "http"odertype: "sse"Befehle: entweder
command: ["cmd", "arg1"]odercommand: "cmd"mitargs: ["arg1"]Umgebungsvariablen: entweder
environmentoderenv
Unterstützte servers.<name>-Felder:
type: erforderlich; einer der Wertelocal,stdio,remote,http,ssedescription: optionale Zeichenfolge, die inlist_servers()angezeigt wirdenabled: optionaler boolescher Wert; standardmäßigtruetimeout: optionale Zahl in Millisekunden, die für die anfängliche Tool-Erkennung verwendet wird
Für lokale / stdio-Server:
command: erforderlich; nicht leere Zeichenfolge oder nicht leeres Arrayargs: optionales Array; wird ancommandangehängt, wenncommandeine Zeichenfolge ist, und auch akzeptiert, wenncommandein Array istenv: optionales Objekt mit Umgebungsvariablenenvironment: optionales Objekt mit Umgebungsvariablen; wird mitenvzusammengeführt und gewinnt bei doppelten Schlüsselncwd: optionales Arbeitsverzeichnis
Für Remote- / HTTP- / SSE-Server:
url: erforderliche Zeichenfolgeheaders: optionales Objekt mit Anfrage-Headernoauth: optionale OAuth-Konfiguration
Unterstützte oauth-Formen:
weggelassen,
nullodertrue: OAuth mit Standardverhalten aktivierenfalse: OAuth für diesen Server deaktivierenObjekt mit einem der folgenden Felder:
clientIdclientSecretscope
Unterstützte Wertesubstitutionen in Zeichenfolgenfeldern:
{env:NAME}: aus der aktuellen Umgebung erweitern${NAME}: Umgebungserweiterung im Claude-Code-Stil${NAME:-default}: Erweiterung im Claude-Code-Stil mit Fallback{file:path}: durch Dateiinhalt ersetzen
Für {file:path}:
relative Pfade werden relativ zum Verzeichnis der Konfigurationsdatei aufgelöst
~/...wird vom Benutzer-Home-Verzeichnis aus aufgelöstabsolute Pfade werden unverändert verwendet
Wenn presets weggelassen wird, enthält das Standard-Preset jeden Server mit enabled !== false und erlaubt alle Tools dieses Servers.
Wenn presets vorhanden ist, handelt es sich um ein Objekt von Preset-Namen. Jedes Preset ist ein Objekt von pro-Server-Überschreibungen, die über die Serverdefinitionen gelegt werden:
presets.default: optionale Überschreibungen für das Standard-Presetjeder andere Preset-Name, wie
presets.work: zusätzliche benannte Preset-Überschreibungen
Innerhalb eines Presets funktionieren Serverregeln wie folgt:
weggelassene Serverregel: die Serverdefinition unverändert verwenden
true: diesen Server einbeziehen und alle seine Tools erlaubenfalse: diesen Server aus diesem Preset ausschließen"tool_name": nur dieses exakte Tool einbeziehenArray-Einträge können sein:
exakte Tool-Namenszeichenfolgen
{ "regex": "..." }Selektoren{ "glob": "..." }Selektoren
Wenn ein Server enabled: false in servers hat, aktiviert das Hinzufügen zu einem Preset ihn für dieses Preset.
Beispiel:
{
"servers": {
"math": {
"type": "stdio",
"description": "Basic arithmetic tools",
"command": "node",
"args": ["/absolute/path/to/math-server.js"],
"env": {
"LOG_LEVEL": "debug"
},
"cwd": "${PWD}"
},
"docs": {
"type": "http",
"description": "Documentation search and retrieval",
"url": "https://example.com/mcp",
"headers": {
"Authorization": "Bearer ${DOCS_TOKEN}"
},
"oauth": {
"scope": "docs.read"
}
}
},
"presets": {
"default": {
"math": ["add", { "glob": "mul_*" }],
"docs": [{ "regex": "(search|fetch)" }]
},
"work": {
"docs": true
}
}
}Kompatibilitätshinweise:
Claude-Code-Stil
env,type: "stdio",type: "http",type: "sse"undcommandplusargswerden unterstütztOpenCode-Stil
type: "local",type: "remote", Befehls-Arrays undenvironmentwerden ebenfalls unterstütztClaude-Code-spezifische Funktionen wie
headersHelperund fortgeschrittene OAuth-Felder wiecallbackPortoderauthServerMetadataUrlwerden noch nicht unterstützt
OAuth-Token und Registrierungsstatus werden unter $XDG_DATA_HOME/jsmcp/oauth.json oder ~/.local/share/jsmcp/oauth.json gespeichert.
Bereitgestellte Tools
list_serverslist_toolsexecute_codefetch_logsclear_logs
Verhalten
Server im Standard-Preset werden gestartet, wenn
jsmcpstartetlist_servers()ist der erforderliche erste Schritt, damit der Agent lernen kann, welche Fähigkeiten verfügbar sindSie müssen
list_tools(server)aufrufen, bevor Sie einen Server inexecute_code()verwenden, damit Sie die exakten Tool-Namen, Aliase und Schemas kennenlist_tools(server)gibt nur die Tools zurück, die für diesen Server im Preset erlaubt sindexecute_code({ code, data?, timeoutMs? })verwaltet nicht den Server-Lebenszyklus; es kann nur Server verwenden, die bereits gestartet sindbevorzugen Sie
execute_code({ code, ... }), wann immer die Arbeit mehr als einen einzelnen Tool-Aufruf erfordern würdeconsole.log,console.info,console.warnundconsole.errorinnerhalb vonexecute_code()werden fürfetch_logs()gespeichertfetch_logs()leert den Protokollpuffer beim Lesen
execute_code
execute_code führt JavaScript als Körper einer asynchronen Funktion aus.
Gestartete Server werden als Globals injiziert. Jedes erlaubte MCP-Tool wird zu einer Funktion auf diesem Server-Objekt. Bevorzugen Sie Unterstrich-Aliase, wenn verfügbar.
Wenn Sie data übergeben, wird es dem Skript als globale Variable data bereitgestellt. Dies ist nützlich für Zeichenfolgen oder strukturierte Werte, die sonst innerhalb der Code-Zeichenfolge maskiert werden müssten.
Sie sollten list_tools(server) aufrufen, bevor Sie einen Server in execute_code() verwenden. Bevorzugen Sie für mehrstufige Arbeit das Schreiben von JavaScript, anstatt zu versuchen, mental mehrere Tool-Aufrufe zu verketten.
Beispiel:
return await math.add({ a: 2, b: 5 });Mit Daten:
return data.message;Wenn das MCP-Tool structuredContent zurückgibt, ist dies das, worauf der JavaScript-Aufruf aufgelöst wird. Das obige Beispiel kann also Folgendes zurückgeben:
{
"sum": 7
}Wenn ein Tool-Name kein gültiger JavaScript-Bezeichner ist, bevorzugen Sie seinen Unterstrich-Alias:
return await math.tool_name({ value: 1 });Der ursprüngliche Tool-Name funktioniert weiterhin mit Klammerzugriff:
return await math["tool-name"]({ value: 1 });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.
Latest Blog Posts
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/alesya-h/jsmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
