baselinker-mcp
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., "@baselinker-mcpHow many orders came in yesterday that aren't paid yet?"
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.
baselinker-mcp
An MCP server that puts the whole BaseLinker API — orders, invoices, returns, couriers, CRM, warehouses, products — in front of an LLM client such as Claude Code, Claude Desktop or Cursor.
Complete. All 179 documented API methods, none of them stubbed.
Read-only until you say otherwise. The 92 write methods stay invisible unless you opt in; with writes off, every tool reports
readOnlyHint: true.Local or remote. stdio for a client on your machine, or Streamable HTTP with OAuth 2.1 (Keycloak) for a shared endpoint on the 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."Contents
Related MCP server: TextQL MCP Server
Quickstart
Requirements: Node.js 20 or newer, and a BaseLinker API token from the BaseLinker panel under Account & other → My account → 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_TOKENThe token can also come straight from the environment, which takes precedence over .env.
.env is read from the package root, so the server starts correctly no matter which
directory your MCP client launches it from.
Connecting a client
Claude Code
claude mcp add baselinker -e BASELINKER_API_TOKEN=your-token -- node /path/to/baselinker-mcp/dist/index.jsClaude Desktop, Cursor, or any mcpServers config
{
"mcpServers": {
"baselinker": {
"command": "node",
"args": ["/path/to/baselinker-mcp/dist/index.js"],
"env": { "BASELINKER_API_TOKEN": "your-token" }
}
}
}For a shared endpoint reachable from claude.ai, see Remote deployment.
Tools
179 separate tools would swamp a model's context and its ability to choose between them, so
methods are grouped the way BaseLinker itself groups them: ten tools, one per API
category. Each takes a method name and a parameters object, and each tool's
description lists the methods it accepts along with their parameters and pagination hints.
Counts below are read + write; write methods only appear when
BASELINKER_ALLOW_WRITES=true.
Tool | Scope | Methods |
| Orders, statuses, payments, journal, PickPack carts | 15 + 22 |
| Invoices, invoice files, numbering series, receipts | 6 + 6 |
| Order returns, statuses, reasons, payments, journal | 8 + 13 |
| Couriers, packages, labels, protocols, documents | 11 + 4 |
| CRM clients and statuses | 5 + 6 |
| Catalogs, warehouses, locations, categories, manufacturers, suppliers, payers, tags | 18 + 24 |
| Product lists, data, stock, prices, logs | 5 + 5 |
| Warehouse documents, purchase orders, fulfillment deliveries | 10 + 9 |
| Base Connect integrations and contractor credit | 3 + 2 |
| External storages (shops, wholesalers) | 6 + 1 |
87 + 92 |
Parameters are validated against a Zod schema per method before anything is sent, so a malformed call comes back as a readable error instead of a BaseLinker error code. Unknown keys are forwarded untouched — BaseLinker adds parameters without warning, and the server does not break when it does.
Write methods
Disabled by default. To enable:
BASELINKER_ALLOW_WRITES=trueWhile disabled, write methods are neither listed in any tool's method enum nor callable.
Enabling turns on all 92 at once — creating, updating and deleting orders, products,
stock, prices, invoices, shipments, returns and warehouse documents. Some of them delete
records; some dispatch real courier shipments that cost real money. There is no per-method
gating, so enable writes only for a client you trust, and consider running a second
read-only instance for everything else.
Behaviour worth knowing
Rate limiting. BaseLinker allows 100 requests per minute. A client-side sliding-window limiter enforces it — excess calls wait their turn rather than failing.
Pagination. List responses are capped (typically 100 items for orders, invoices and
returns; 1000 for catalog products). Each method's description carries the specific hint,
for example getOrders wants date_confirmed_from set to the last returned order's
date_confirmed plus one second, while getInventoryProductsList takes a 1-based page.
File downloads. getLabel, getProtocol, getCourierDocument, getInvoiceFile,
getInventoryDocumentFile and getInventoryFulfillmentDeliveryLabels return the file as an
MCP embedded resource with a real MIME type. Pass the extra save_to_path parameter —
handled locally, never sent to BaseLinker — to decode it to disk instead and get back
{ saved_to, extension, bytes }. This only makes sense over stdio, where the server runs on
your own machine; over HTTP it is rejected with an explanatory error.
Remote deployment (HTTP + OAuth)
With --transport http the server speaks Streamable HTTP and acts as an OAuth 2.0
Resource Server (RFC 9728): it publishes
protected resource metadata, answers unauthenticated calls with 401 plus a
WWW-Authenticate challenge, and verifies every access token as an RS256 JWT against a
Keycloak realm's JWKS. Clients discover the realm from that metadata and register
themselves through Dynamic Client Registration, so no client ID or secret is configured
on either side.
node dist/index.js --transport http --host 0.0.0.0 --port 8000 --path /mcpPath | Auth | Purpose |
| Bearer | MCP Streamable HTTP, stateless — a fresh server per request |
| Bearer |
|
| public | RFC 9728 resource metadata |
| public | Liveness probe |
HTTP transport refuses to start without an auth realm unless you opt out explicitly
with BASELINKER_MCP_AUTH_DISABLED=true. That is deliberate: with writes enabled, an
unauthenticated endpoint hands the internet your BaseLinker account.
deploy/ has the full guide — Keycloak realm setup, a hardened Compose service
with Traefik labels, reverse-proxy snippets for Caddy and nginx, verification commands and
a threat model. The short version:
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.0Then point a client at it:
claude mcp add --transport http baselinker https://mcp.example.com/mcpIn claude.ai it is Settings → Connectors → Add custom connector, URL
https://mcp.example.com/mcp, with Client ID and Client Secret left empty.
One thing to be clear about before you expose it: the BaseLinker token is shared. Everyone who can log into the realm operates on the same BaseLinker account. See SECURITY.md for the rest of the boundaries.
Configuration reference
Everything is an environment variable; .env in the package root is loaded automatically.
Always
Variable | Default | Purpose |
| — | Required. BaseLinker API token |
|
|
|
Transport
CLI flags win over these.
Variable | Flag | Default | Purpose |
|
|
|
|
|
|
| Bind address, HTTP only |
|
|
| Bind port, HTTP only |
|
|
| Endpoint path, HTTP only |
OAuth — required when transport is http
Variable | Default | Purpose |
| — | Keycloak realm issuing tokens, e.g. |
| — | Public URL of this server; with the path it forms the OAuth resource identifier |
| unset | Audience(s) a token must carry. Needs an audience mapper in Keycloak; unset skips the check |
|
| Scopes every token must carry. |
|
|
|
| unset | DNS-rebinding protection: accepted |
| unset | DNS-rebinding protection: accepted |
Lists accept commas or spaces.
Troubleshooting
Symptom | Cause |
| No token in the environment or in |
| Token rejected by BaseLinker — regenerate it in the panel |
A write method is "unknown" |
|
Calls get slower under load | The rate limiter is pacing you to 100 requests/minute. Working as intended |
| Set the realm and base URL, or opt out with |
| Token was not signed by the configured realm |
| Token lacks |
More OAuth-specific cases are in deploy/README.md.
Development
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 serverCONTRIBUTING.md covers how the tool registry is put together and what to watch out for when adding a method.
License
MIT. Not affiliated with or endorsed by BaseLinker.
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
- FlicenseNot gradedqualityDmaintenanceEnables interaction with the Hostinger Ecommerce API to retrieve product information and update product descriptions through the Model Context Protocol.
- AlicenseNot gradedqualityCmaintenanceTranslates natural language to SQL/GraphQL queries and executes them, enabling AI agents to interact with databases through the Model Context Protocol.1Apache 2.0
- AlicenseBqualityDmaintenanceEnables natural language control of Teamleader Focus CRM, invoicing, and project management through the Model Context Protocol.4253MIT
- AlicenseAqualityDmaintenanceEnables interaction with FastSpring e-commerce platform for managing orders, subscriptions, and accounts through natural language using the Model Context Protocol.119MIT
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.
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/PiotrRaszkowski/baselinker-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server