Skip to main content
Glama

baselinker-mcp

CI License: MIT Node

Ein MCP-Server, der die gesamte BaseLinker-API — Bestellungen, Rechnungen, Retouren, Kurierdienste, CRM, Lager, Produkte — einem LLM-Client wie Claude Code, Claude Desktop oder Cursor zur Verfügung stellt.

  • Vollständig. Alle 179 dokumentierten API-Methoden, keine davon nur als Stub.

  • Nur lesend, bis du etwas anderes bestimmst. Die 92 Schreibmethoden bleiben unsichtbar, solange du dich nicht anmeldest; bei deaktiviertem Schreibzugriff meldet jedes Tool readOnlyHint: true.

  • Lokal oder remote. stdio für einen Client auf deinem Rechner oder Streamable HTTP mit OAuth 2.1 (Keycloak) für einen gemeinsamen Endpunkt im Internet.

"How many orders came in yesterday that aren't paid yet?"
"Which catalog products dropped below 5 in stock this week?"
"Pull the courier label for order 1234567 and tell me the tracking number."

Inhalt

Related MCP server: TextQL MCP Server

Schnellstart

Voraussetzungen: Node.js 20 oder neuer und ein BaseLinker-API-Token aus dem BaseLinker-Panel unter Konto & Sonstiges → Mein Konto → API.

git clone https://github.com/PiotrRaszkowski/baselinker-mcp.git
cd baselinker-mcp
npm install
npm run build
cp .env.example .env     # paste your token into BASELINKER_API_TOKEN

Das Token kann auch direkt aus der Umgebung stammen, was Vorrang vor .env hat. .env wird aus dem Paketstammverzeichnis gelesen, sodass der Server unabhängig davon, aus welchem Verzeichnis dein MCP-Client ihn startet, korrekt startet.

Client verbinden

Claude Code

claude mcp add baselinker -e BASELINKER_API_TOKEN=your-token -- node /path/to/baselinker-mcp/dist/index.js

Claude Desktop, Cursor oder eine beliebige mcpServers-Konfiguration

{
  "mcpServers": {
    "baselinker": {
      "command": "node",
      "args": ["/path/to/baselinker-mcp/dist/index.js"],
      "env": { "BASELINKER_API_TOKEN": "your-token" }
    }
  }
}

Für einen gemeinsamen Endpunkt, der von claude.ai aus erreichbar ist, siehe Remote-Bereitstellung.

Tools

179 einzelne Tools würden den Kontext eines Modells und seine Fähigkeit, zwischen ihnen zu wählen, überlasten. Deshalb sind die Methoden so gruppiert, wie BaseLinker sie selbst gruppiert: zehn Tools, eines pro API-Kategorie. Jedes akzeptiert einen method-Namen und ein parameters-Objekt, und die Beschreibung jedes Tools listet die akzeptierten Methoden samt Parametern und Paginierungshinweisen auf.

Die Zahlen unten sind read + write; Schreibmethoden erscheinen nur, wenn BASELINKER_ALLOW_WRITES=true ist.

Tool

Umfang

Methoden

baselinker_orders

Bestellungen, Status, Zahlungen, Journal, PickPack-Warenkörbe

15 + 22

baselinker_invoices

Rechnungen, Rechnungsdateien, Nummernkreise, Belege

6 + 6

baselinker_returns

Retouren, Status, Gründe, Zahlungen, Journal

8 + 13

baselinker_courier

Kurierdienste, Pakete, Etiketten, Protokolle, Dokumente

11 + 4

baselinker_crm

CRM-Kunden und -Status

5 + 6

baselinker_inventory

Kataloge, Lager, Standorte, Kategorien, Hersteller, Lieferanten, Zahlungspflichtige, Tags

18 + 24

baselinker_products

Produktlisten, Daten, Bestand, Preise, Protokolle

5 + 5

baselinker_documents

Lagerbelege, Bestellungen, Fulfillment-Lieferungen

10 + 9

baselinker_connect

Base-Connect-Integrationen und Auftragnehmerguthaben

3 + 2

baselinker_external_storage

Externe Lager (Shops, Großhändler)

6 + 1

87 + 92

Parameter werden pro Methode gegen ein Zod-Schema validiert, bevor etwas gesendet wird. Ein fehlerhafter Aufruf führt also zu einem lesbaren Fehler statt zu einem BaseLinker-Fehlercode. Unbekannte Schlüssel werden unverändert weitergeleitet — BaseLinker fügt Parameter ohne Vorwarnung hinzu, und der Server bricht nicht ab, wenn das passiert.

Schreibmethoden

Standardmäßig deaktiviert. Zum Aktivieren:

BASELINKER_ALLOW_WRITES=true

Solange sie deaktiviert sind, werden Schreibmethoden weder im method-Enum eines Tools aufgeführt noch sind sie aufrufbar. Durch das Aktivieren werden alle 92 auf einmal eingeschaltet — Erstellen, Aktualisieren und Löschen von Bestellungen, Produkten, Beständen, Preisen, Rechnungen, Sendungen, Retouren und Lagerbelegen. Einige davon löschen Datensätze; einige lösen echte Kuriersendungen aus, die echtes Geld kosten. Es gibt keine Freischaltung pro Methode. Aktiviere den Schreibzugriff also nur für einen Client, dem du vertraust, und erwäge, für alles andere eine zweite schreibgeschützte Instanz zu betreiben.

Wissenswertes Verhalten

Ratenbegrenzung. BaseLinker erlaubt 100 Anfragen pro Minute. Ein clientseitiger Sliding-Window-Limiter setzt das durch — überzählige Aufrufe warten, anstatt zu scheitern.

Paginierung. Listenantworten sind begrenzt (in der Regel 100 Einträge für Bestellungen, Rechnungen und Retouren; 1000 für Katalogprodukte). Die Beschreibung jeder Methode enthält den entsprechenden Hinweis, z. B. erwartet getOrders, dass date_confirmed_from auf date_confirmed der zuletzt zurückgegebenen Bestellung plus eine Sekunde gesetzt wird, während getInventoryProductsList eine bei 1 beginnende page erwartet.

Dateidownloads. getLabel, getProtocol, getCourierDocument, getInvoiceFile, getInventoryDocumentFile und getInventoryFulfillmentDeliveryLabels geben die Datei als eingebettete MCP-Ressource mit echtem MIME-Typ zurück. Übergib den zusätzlichen Parameter save_to_path — wird lokal behandelt, nie an BaseLinker gesendet —, um sie stattdessen dekodiert auf der Festplatte zu speichern und { saved_to, extension, bytes } zurückzubekommen. Das ergibt nur über stdio Sinn, wo der Server auf deinem eigenen Rechner läuft; über HTTP wird es mit einem erklärenden Fehler abgelehnt.

Remote-Bereitstellung (HTTP + OAuth)

Mit --transport http spricht der Server Streamable HTTP und fungiert als OAuth-2.0-Ressourcenserver (RFC 9728): Er veröffentlicht Metadaten für geschützte Ressourcen, beantwortet nicht authentifizierte Aufrufe mit 401 plus einer WWW-Authenticate-Herausforderung und prüft jedes Zugriffstoken als RS256-JWT gegen die JWKS einer Keycloak-Realm. Clients entdecken die Realm über diese Metadaten und registrieren sich über die dynamische Client-Registrierung, sodass auf keiner Seite eine Client-ID oder ein Geheimnis konfiguriert ist.

node dist/index.js --transport http --host 0.0.0.0 --port 8000 --path /mcp

Pfad

Auth

Zweck

POST /mcp

Bearer

MCP Streamable HTTP, zustandslos — ein neuer Server pro Anfrage

GET / DELETE /mcp

Bearer

405; der zustandslose Modus hat keine serverinitiierten Streams

/.well-known/oauth-protected-resource[/mcp]

öffentlich

RFC-9728-Ressourcenmetadaten

/healthz

öffentlich

Liveness-Probe

Der HTTP-Transport weigert sich, ohne eine Auth-Realm zu starten, es sei denn, du entscheidest dich ausdrücklich mit BASELINKER_MCP_AUTH_DISABLED=true dagegen. Das ist beabsichtigt: Bei aktiviertem Schreibzugriff übergibt ein nicht authentifizierter Endpunkt dein BaseLinker-Konto dem Internet.

deploy/ enthält die vollständige Anleitung — Keycloak-Realm-Einrichtung, einen gehärteten Compose-Dienst mit Traefik-Labels, Reverse-Proxy-Ausschnitte für Caddy und nginx, Verifikationsbefehle und ein Bedrohungsmodell. Die Kurzfassung:

docker build -t baselinker-mcp:0.2.0 .
docker run -d --name baselinker-mcp -p 8000:8000 \
  -e BASELINKER_API_TOKEN=your-token \
  -e BASELINKER_MCP_AUTH_REALM_URL=https://keycloak.example.com/realms/myrealm \
  -e BASELINKER_MCP_AUTH_BASE_URL=https://mcp.example.com \
  baselinker-mcp:0.2.0

Dann einen Client darauf ausrichten:

claude mcp add --transport http baselinker https://mcp.example.com/mcp

In claude.ai sind es Einstellungen → Konnektoren → Benutzerdefinierten Konnektor hinzufügen, URL https://mcp.example.com/mcp, wobei Client-ID und Client-Geheimnis leer bleiben.

Eines sollte klar sein, bevor du es bereitstellst: Das BaseLinker-Token wird geteilt. Jeder, der sich in der Realm anmelden kann, arbeitet mit demselben BaseLinker-Konto. Weitere Grenzen findest du in SECURITY.md.

Konfigurationsreferenz

Alles ist eine Umgebungsvariable; .env im Paketstammverzeichnis wird automatisch geladen.

Immer

Variable

Standard

Zweck

BASELINKER_API_TOKEN

Erforderlich. BaseLinker-API-Token

BASELINKER_ALLOW_WRITES

false

true legt alle 92 Schreibmethoden offen

Transport

CLI-Flags haben Vorrang vor diesen.

Variable

Flag

Standard

Zweck

BASELINKER_MCP_TRANSPORT

--transport

stdio

stdio oder http

BASELINKER_MCP_HOST

--host

0.0.0.0

Bindeadresse, nur HTTP

BASELINKER_MCP_PORT

--port

8000

Bind-Port, nur HTTP

BASELINKER_MCP_PATH

--path

/mcp

Endpunktpfad, nur HTTP

OAuth — erforderlich, wenn der Transport http ist

Variable

Standard

Zweck

BASELINKER_MCP_AUTH_REALM_URL

Keycloak-Realm, die Token ausstellt, z. B. https://keycloak.example.com/realms/myrealm

BASELINKER_MCP_AUTH_BASE_URL

Öffentliche URL dieses Servers; zusammen mit dem Pfad ergibt sie die OAuth-Ressourcenkennung

BASELINKER_MCP_AUTH_AUDIENCE

unset

Audience(s), die ein Token enthalten muss. Benötigt einen Audience-Mapper in Keycloak; nicht gesetzt überspringt die Prüfung

BASELINKER_MCP_AUTH_REQUIRED_SCOPES

openid

Scopes, die jedes Token enthalten muss. openid garantiert einen sub-Claim

BASELINKER_MCP_AUTH_DISABLED

false

true startet HTTP ohne Authentifizierung. Niemals auf einer öffentlichen Adresse

BASELINKER_MCP_ALLOWED_HOSTS

unset

DNS-Rebinding-Schutz: akzeptierte Host-Header. Hinter einem Host-Routing-Proxy überflüssig

BASELINKER_MCP_ALLOWED_ORIGINS

unset

DNS-Rebinding-Schutz: akzeptierte Origin-Header

Listen akzeptieren Kommas oder Leerzeichen.

Fehlerbehebung

Symptom

Ursache

Missing BASELINKER_API_TOKEN

Kein Token in der Umgebung oder in .env im Paketstammverzeichnis

BaseLinker API error [ERROR_AUTH_TOKEN]

Token von BaseLinker abgelehnt — im Panel neu generieren

Eine Schreibmethode ist „unbekannt"

BASELINKER_ALLOW_WRITES ist nicht true

Aufrufe werden unter Last langsamer

Der Ratenbegrenzer begrenzt dich auf 100 Anfragen/Minute. Funktioniert wie vorgesehen

HTTP transport requires BASELINKER_MCP_AUTH_REALM_URL

Realm und Basis-URL festlegen oder mit BASELINKER_MCP_AUTH_DISABLED abwählen

401 no applicable key found in the JSON Web Key Set

Token wurde nicht von der konfigurierten Realm signiert

403 insufficient_scope

Token enthält kein openid

Weitere OAuth-spezifische Fälle findest du in deploy/README.md.

Entwicklung

npm run dev         # run from sources (tsx), stdio transport
npm run start:http  # built server, HTTP transport
npm test            # unit tests — fully offline, no live API calls
npm run check       # format check + typecheck + tests, what CI runs
npm run smoke       # manual smoke test against the live API (uses .env)
npm run inspect     # MCP Inspector against the built server

CONTRIBUTING.md beschreibt, wie die Tool-Registry aufgebaut ist und worauf beim Hinzufügen einer Methode zu achten ist.

Lizenz

MIT. Nicht mit BaseLinker verbunden oder von BaseLinker unterstützt.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

Related MCP Connectors

  • Manage your Savanto store from your AI: catalog, content, prompts, and analytics, by chat.

  • Manage your Jumpseller store with AI. Products, orders, customers, and more.

  • Stop re-explaining yourself to Agents. Give it the right context, right when needed.

View all MCP Connectors

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/PiotrRaszkowski/baselinker-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server