Skip to main content
Glama

baselinker-mcp

CI License: MIT Node

Un servidor MCP que pone toda la API de BaseLinker — pedidos, facturas, devoluciones, mensajería, CRM, almacenes, productos — delante de un cliente LLM como Claude Code, Claude Desktop o Cursor.

  • Completo. Los 179 métodos de API documentados, ninguno simulado.

  • Solo lectura hasta que se indique lo contrario. Los 92 métodos de escritura permanecen invisibles a menos que se active la opción; con la escritura desactivada, cada herramienta informa de readOnlyHint: true.

  • Local o remoto. stdio para un cliente en tu máquina, o Streamable HTTP con OAuth 2.1 (Keycloak) para un endpoint compartido en 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."

Contenidos

Related MCP server: TextQL MCP Server

Inicio rápido

Requisitos: Node.js 20 o superior, y un token de API de BaseLinker desde el panel de BaseLinker en Cuenta y otros → Mi cuenta → 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

El token también puede venir directamente del entorno, que tiene prioridad sobre .env. .env se lee desde la raíz del paquete, por lo que el servidor se inicia correctamente sin importar desde qué directorio lo lance tu cliente MCP.

Conexión de un cliente

Claude Code

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

Claude Desktop, Cursor o cualquier configuración de mcpServers

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

Para un endpoint compartido accesible desde claude.ai, consulta Despliegue remoto.

Herramientas

179 herramientas separadas saturarían el contexto de un modelo y su capacidad para elegir entre ellas, así que los métodos se agrupan de la misma manera que los agrupa la propia BaseLinker: diez herramientas, una por categoría de API. Cada una acepta un nombre de method y un objeto parameters, y la descripción de cada herramienta enumera los métodos que acepta junto con sus parámetros y sugerencias de paginación.

Los recuentos siguientes son lectura + escritura; los métodos de escritura solo aparecen cuando BASELINKER_ALLOW_WRITES=true.

Herramienta

Alcance

Métodos

baselinker_orders

Pedidos, estados, pagos, diario, carritos PickPack

15 + 22

baselinker_invoices

Facturas, archivos de factura, series de numeración, recibos

6 + 6

baselinker_returns

Devoluciones de pedidos, estados, motivos, pagos, diario

8 + 13

baselinker_courier

Mensajeros, paquetes, etiquetas, protocolos, documentos

11 + 4

baselinker_crm

Clientes y estados de CRM

5 + 6

baselinker_inventory

Catálogos, almacenes, ubicaciones, categorías, fabricantes, proveedores, pagadores, etiquetas

18 + 24

baselinker_products

Listas de productos, datos, existencias, precios, registros

5 + 5

baselinker_documents

Documentos de almacén, órdenes de compra, entregas de cumplimiento

10 + 9

baselinker_connect

Integraciones de Base Connect y crédito de contratistas

3 + 2

baselinker_external_storage

Almacenamientos externos (tiendas, mayoristas)

6 + 1

87 + 92

Los parámetros se validan contra un esquema Zod por método antes de enviar nada, por lo que una llamada mal formada devuelve un error legible en lugar de un código de error de BaseLinker. Las claves desconocidas se reenvían sin tocar: BaseLinker añade parámetros sin previo aviso, y el servidor no se rompe cuando lo hace.

Métodos de escritura

Desactivados por defecto. Para activarlos:

BASELINKER_ALLOW_WRITES=true

Mientras estén desactivados, los métodos de escritura no aparecen en la enumeración method de ninguna herramienta ni se pueden llamar. Activarlos enciende los 92 a la vez: crear, actualizar y eliminar pedidos, productos, existencias, precios, facturas, envíos, devoluciones y documentos de almacén. Algunos de ellos eliminan registros; otros envían envíos reales de mensajería que cuestan dinero real. No hay control por método, así que activa la escritura solo para un cliente en el que confíes y considera ejecutar una segunda instancia de solo lectura para todo lo demás.

Comportamiento que conviene conocer

Límite de peticiones. BaseLinker permite 100 peticiones por minuto. Un limitador de ventana deslizante del lado del cliente lo hace cumplir: las llamadas excesivas esperan su turno en lugar de fallar.

Paginación. Las respuestas de listas están limitadas (normalmente 100 elementos para pedidos, facturas y devoluciones; 1000 para productos de catálogo). La descripción de cada método incluye la sugerencia específica, por ejemplo, getOrders requiere que date_confirmed_from se establezca en el date_confirmed del último pedido devuelto más un segundo, mientras que getInventoryProductsList acepta una page basada en 1.

Descargas de archivos. getLabel, getProtocol, getCourierDocument, getInvoiceFile, getInventoryDocumentFile y getInventoryFulfillmentDeliveryLabels devuelven el archivo como un recurso incrustado de MCP con un tipo MIME real. Pasa el parámetro adicional save_to_path (gestionado localmente, nunca enviado a BaseLinker) para decodificarlo en disco y obtener { saved_to, extension, bytes }. Esto solo tiene sentido a través de stdio, donde el servidor se ejecuta en tu propia máquina; a través de HTTP se rechaza con un error explicativo.

Despliegue remoto (HTTP + OAuth)

Con --transport http, el servidor habla Streamable HTTP y actúa como un servidor de recursos OAuth 2.0 (RFC 9728): publica metadatos de recursos protegidos, responde a llamadas no autenticadas con 401 más un desafío WWW-Authenticate, y verifica cada token de acceso como un JWT RS256 contra el JWKS de un reino de Keycloak. Los clientes descubren el reino a partir de esos metadatos y se registran mediante el registro dinámico de clientes, por lo que no se configura ningún ID de cliente ni secreto en ninguno de los dos lados.

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

Ruta

Autenticación

Propósito

POST /mcp

Bearer

MCP Streamable HTTP, sin estado: un servidor nuevo por petición

GET / DELETE /mcp

Bearer

405; el modo sin estado no tiene flujos iniciados por el servidor

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

público

Metadatos de recursos RFC 9728

/healthz

público

Sonda de actividad

El transporte HTTP se niega a arrancar sin un reino de autenticación a menos que se desactive explícitamente con BASELINKER_MCP_AUTH_DISABLED=true. Es deliberado: con la escritura activada, un endpoint no autenticado entrega tu cuenta de BaseLinker a Internet.

deploy/ contiene la guía completa: configuración del reino de Keycloak, un servicio Compose endurecido con etiquetas de Traefik, fragmentos de proxy inverso para Caddy y nginx, comandos de verificación y un modelo de amenazas. La versión corta:

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

Luego apunta un cliente a él:

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

En claude.ai es Configuración → Conectores → Añadir conector personalizado, URL https://mcp.example.com/mcp, con ID de cliente y Secreto de cliente vacíos.

Una cosa que debe quedar clara antes de exponerlo: el token de BaseLinker es compartido. Todos los que puedan iniciar sesión en el reino operan en la misma cuenta de BaseLinker. Consulta SECURITY.md para el resto de los límites.

Referencia de configuración

Todo es una variable de entorno; .env en la raíz del paquete se carga automáticamente.

Siempre

Variable

Por defecto

Propósito

BASELINKER_API_TOKEN

Obligatorio. Token de API de BaseLinker

BASELINKER_ALLOW_WRITES

false

true expone los 92 métodos de escritura

Transporte

Las banderas de línea de comandos tienen prioridad sobre estas.

Variable

Bandeja

Por defecto

Propósito

BASELINKER_MCP_TRANSPORT

--transport

stdio

stdio o http

BASELINKER_MCP_HOST

--host

0.0.0.0

Dirección de enlace, solo HTTP

BASELINKER_MCP_PORT

--port

8000

Puerto de enlace, solo HTTP

BASELINKER_MCP_PATH

--path

/mcp

Ruta del endpoint, solo HTTP

OAuth: obligatorio cuando el transporte es http

Variable

Por defecto

Propósito

BASELINKER_MCP_AUTH_REALM_URL

Reino de Keycloak que emite tokens, p. ej. https://keycloak.example.com/realms/myrealm

BASELINKER_MCP_AUTH_BASE_URL

URL pública de este servidor; con la ruta forma el identificador de recurso OAuth

BASELINKER_MCP_AUTH_AUDIENCE

sin definir

Audiencia(s) que debe llevar un token. Necesita un mapeador de audiencia en Keycloak; sin definir omite la comprobación

BASELINKER_MCP_AUTH_REQUIRED_SCOPES

openid

Ámbitos que debe llevar cada token. openid garantiza una reclamación sub

BASELINKER_MCP_AUTH_DISABLED

false

true inicia HTTP sin autenticación. Nunca en una dirección pública

BASELINKER_MCP_ALLOWED_HOSTS

sin definir

Protección contra rebinding de DNS: cabeceras Host aceptadas. Redundante detrás de un proxy de enrutamiento de host

BASELINKER_MCP_ALLOWED_ORIGINS

sin definir

Protección contra rebinding de DNS: cabeceras Origin aceptadas

Las listas aceptan comas o espacios.

Solución de problemas

Síntoma

Causa

Missing BASELINKER_API_TOKEN

No hay token en el entorno ni en .env en la raíz del paquete

BaseLinker API error [ERROR_AUTH_TOKEN]

BaseLinker rechazó el token: regenéralo en el panel

Un método de escritura es "desconocido"

BASELINKER_ALLOW_WRITES no es true

Las llamadas se ralentizan bajo carga

El limitador de peticiones te ajusta a 100 peticiones/minuto. Funciona según lo previsto

HTTP transport requires BASELINKER_MCP_AUTH_REALM_URL

Establece el reino y la URL base, o desactívalo con BASELINKER_MCP_AUTH_DISABLED

401 no applicable key found in the JSON Web Key Set

El token no fue firmado por el reino configurado

403 insufficient_scope

Al token le falta openid

Hay más casos específicos de OAuth en deploy/README.md.

Desarrollo

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 cubre cómo se compone el registro de herramientas y qué tener en cuenta al añadir un método.

Licencia

MIT. No está afiliado ni respaldado por BaseLinker.

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