Setup · Private
Connect a client, step by step.
This page is for Apeiron staff connecting Cursor or Claude. It walks through connecting to ApeironData MCP. The connector is read-only. It reads dated shelves: Parquet files, the dated table snapshots on the lake, unless a Business Central tool is called with live=true. For Inc. (apeiron-bioenergy) bank ledger/balance, the default is the Supabase near-live replica with lake as backup. This page is not indexed, and it does not contain a real key.
Step 1
What this MCP is for
ApeironData MCP serves two books, and they stay separate. Business Central cash lives on the bc-cash shelf. China Chanjet T+ lives on the cn-tplus shelf.
Each shelf is a dated Parquet snapshot. That is the default. A browser visit to this site is not a query.
Step 2
Lake vs live
Default for agents: lake snapshot (dated Parquet). Use live Business Central OData only when the ask is “right now / today / current ERP,” or the lake as_of is too old for the decision.
- Lake is the dated shelf: read-only Parquet, reproducible, and preferred for Mark packs and normal agent reads (cust/vendor/G/L/shipments, and bank for non-Inc. companies). Omit live. The response field live_bc is false, and as_of is the shelf date.
- Inc. bank exception: for company
apeiron-bioenergy,get_bank_ledgerandget_bank_balancedefault to the Supabase near-live replica (source/read_pathsupabase). Lake bc-cash stays the backup fallback. Other BC companies stay on the lake. China cn-tplus is unchanged. - Live is Business Central OData for that company. The tool names stay the same. Pass the explicit flag live=true (live_bc=true is the same flag). That is current ERP truth, and it is Business Central only. The response field live_bc is true. On a live read, as_of is the calendar date in Asia/Singapore. A live call reads that one company. It does not merge companies, and it does not refresh China.
- China cn-tplus stays lake-only until OpenAPI exists. Passing live or live_bc on a China tool is refused.
Step 3
Address and key
The production endpoint is this host plus the MCP path.
https://apeiron-data-mcp.vercel.app/api/mcp
Every MCP call needs this header. Replace the placeholder with a personal key. Do not paste a real secret into this page, into chat, or into git.
Authorization: Bearer <API_KEY>
- Open /keys (https://apeiron-data-mcp.vercel.app/keys).
- Sign in with your Apeiron Microsoft account.
- Create a personal key. The full secret is shown once. After that the page keeps the prefix, the label, and the time it was created.
- Store the secret in an environment variable or a secure store on the machine that calls MCP.
Cursor and Claude keep sending that bearer header. They do not sign in with Microsoft on each call. Prefer a personal key. A shared legacy key is only a temporary bridge if the server still has one.
Step 4
Put the endpoint in the client
Use the placeholders below. <API_KEY> stands in for the personal key from /keys. A local developer machine uses the same /api/mcp path on its own origin, with a local placeholder key, not a production secret in git.
Cursor
Open Cursor Settings, then MCP, and add a custom remote connector. Set the URL to the production endpoint. Set the header name to Authorization and the header value to Bearer <API_KEY>.
Or save this in ~/.cursor/mcp.json. Keep that file off git when it holds a real key. If your Cursor build names the header field differently, the server still needs that address and that bearer header.
{
"mcpServers": {
"apeiron-data": {
"url": "https://apeiron-data-mcp.vercel.app/api/mcp",
"headers": {
"Authorization": "Bearer <API_KEY>"
}
}
}
}Claude.ai
In Claude.ai, add a custom connector and paste the production URL. Choose No Sign-In. If the form says Sign in now, or Detected, ignore that. This connector does not sign you in with Microsoft. Microsoft is only for creating a personal key at /keys. Claude may still show a letter tile for this vercel.app address. A custom domain later would help.
Set the header name to Authorization. Set the header value to Bearer <API_KEY>. Include the word Bearer, then a space, then the personal key.
https://apeiron-data-mcp.vercel.app/api/mcp
Authorization: Bearer <API_KEY>
Claude Code
Add a remote HTTP server. The header is the same bearer value.
claude mcp add --transport http apeiron-data https://apeiron-data-mcp.vercel.app/api/mcp \ --header "Authorization: Bearer <API_KEY>"
A project .mcp.json can point at an environment variable. Put the personal key in APEIRON_MCP_API_KEY. Do not commit the secret. Claude Code expands the variable.
{
"mcpServers": {
"apeiron-data": {
"type": "http",
"url": "https://apeiron-data-mcp.vercel.app/api/mcp",
"headers": {
"Authorization": "Bearer ${APEIRON_MCP_API_KEY}"
}
}
}
}Claude Desktop
If the desktop app asks for a custom remote connector, paste the production endpoint and the same Authorization header. If it only accepts a local command, use the helper below. On macOS the file is ~/Library/Application Support/Claude/claude_desktop_config.json. On Windows it is %APPDATA%\Claude\claude_desktop_config.json.
{
"mcpServers": {
"apeiron-data": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://apeiron-data-mcp.vercel.app/api/mcp",
"--header",
"Authorization: Bearer <API_KEY>"
]
}
}
}Any Streamable HTTP client
POST JSON-RPC to the endpoint. Send the bearer header, Content-Type: application/json, and Accept: application/json, text/event-stream. Start with initialize.
POST https://apeiron-data-mcp.vercel.app/api/mcp
Authorization: Bearer <API_KEY>
Content-Type: application/json
Accept: application/json, text/event-stream
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "client", "version": "0" }
}
}Step 5
Tools, in two groups
Ask for one company at a time. Pick a Business Central slug from the first list. Pick a China slug from the second list. Do not pass a Business Central slug to a China tool. Omit live to read the lake. live=true on a Business Central tool reads current ERP for that one company. live_bc in the response is true only then. A live call does not merge companies and does not refresh China. For shipped volume on Business Central, call shipment_volume or get_bc_sales_shipment_lines and keep the unit of measure on the quantity. Do not invent metric tons from the shipment header. China volume stays on get_cn_sales_outbound. cash_snapshot is one company. search_lake returns cards, not amounts.
Business Central · bc-cash (cash and shipments)
- List companieslist_companiesCompany names on the Business Central cash shelf. Call this before any cash tool.
- G/Lget_gl_movementsGeneral ledger lines for one company.
- Bank ledgerget_bank_ledgerBank account lines for one company.
- Search bank (semantic)search_bank_semanticPlain-language search over Inc. bank lines. Follow up with get_bank_ledger. Other companies refused for this pack.
- Open ARget_open_arOpen customer items for one company.
- Open APget_open_apOpen vendor items for one company.
- Bank balanceget_bank_balanceBalance by bank account for one company.
- Cash due summaryget_cash_due_summaryOpen receivables and payables for that same company. Not a group total.
- Sales shipmentsget_bc_sales_shipmentsGoods already shipped to customers for one Business Central company (posted sales shipments).
- Sales shipment linesget_bc_sales_shipment_linesItem and quantity lines for posted sales shipments of one Business Central company. Sum these lines for shipped volume, and keep the unit of measure explicit, such as MT or KG. Do not invent metric tons from the shipment header.
China Chanjet T+ · cn-tplus
- List China companieslist_cn_tplus_companiesCompany names on the Chanjet T+ shelf. This list is not the Business Central list.
- Purchase dueget_cn_purchase_dueUnpaid purchase invoices for one China company.
- Sales dueget_cn_sales_dueUnpaid sales invoices for one China company.
- Stock on handget_cn_stock_on_handStock rows for one China company.
- China cash due summaryget_cn_cash_due_summaryPurchase due and sales due, kept apart. They are not added together.
- Sales outboundget_cn_sales_outboundGoods already shipped out for one China company (销售出库单). The row includes item_name, uom, and quantity when the shelf has them.
- Pending outboundget_cn_sales_pending_outboundSales orders waiting to leave the warehouse for one China company (待出库).
Recall tools · one door at a time
- Cash snapshotcash_snapshotOne company cash brief. Business Central returns bank balances and open AR/AP buckets. China returns purchase due, sales due, and stock. The two doors are never added.
- Search lakesearch_lakeEntity cards (company, entity, next tool). Default mode=keyword. Pass mode=hybrid or semantic for plain language; China stays door=cn-tplus. Not ledger amounts.
- Shipment volumeshipment_volumeBusiness Central shipment count and quantity for one company. The unit of measure stays explicit. China slugs are refused.
Step 6
Faster lake reads (Phase A)
The default is still the lake, not live. Omit as_of, or pass as_of=latest, to read the warm current shelf. Each entity has a pointer file named LATEST. That file names one dated folder. The server does not delete historical as_of folders. Pass a real date when you want an older shelf.
Prefer cash_snapshot for a quick one-company cash brief. On Business Central it returns bank balances and open AR and AP buckets. On China it returns purchase due, sales due, and stock for that company. It does not add the two doors, and it does not convert currencies. Use the detail tools when you need the rows.
Use search_lake with a keyword to find the right company and entity. It searches short entity cards and returns ids and hints, not amounts. Pass mode=hybrid (or semantic) for plain-language card search; if embeddings fail, keyword is used with a fallback note. The answer lists Business Central hits and China hits in two groups. China stays on cn-tplus tools. Business Central stays on bc tools. For Inc. bank lines in everyday language, call search_bank_semantic, then get_bank_ledger with the hit ids.
live=true stays rare. It skips the warm shelf and calls Business Central for one company. China tools still refuse live. Keys still come from /keys. The employee rulebook is unchanged. A short note for this change is docs/employee-speed-note.md.
Step 7
First checks
Run these in order. A wrong or missing key stops at the first check.
- Call the endpoint with no key. Expect HTTP 401. No tool runs.
- Call it with your personal key. Send initialize, then tools/list. Expect HTTP 200 and the tool names on this page. The body may be JSON or a server-sent event.
- Call list_companies. Expect a non-empty company list.
- Call list_cn_tplus_companies. Expect a non-empty company list, and expect separate_from_bc_cash to be true. That flag means China numbers are not mixed into Business Central cash. One example China slug is peirong-jinhai-sichuan. That slug is not a Business Central company.
- Call get_cn_purchase_due with company peirong-jinhai-sichuan. Expect a row_count greater than zero when that shelf has rows, an as_of date, and separate_from_bc_cash set to true. This page does not publish amounts.
- On one Business Central company, call get_gl_movements twice. The first call omits live. The second passes live=true. Compare as_of. The lake date is the shelf. The live date is today in Asia/Singapore. Do not publish amounts from either call.
No key. Expect 401.
curl -sS -D - -o /dev/null -X POST "https://apeiron-data-mcp.vercel.app/api/mcp" \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'With a key stored as API_KEY in the environment. Expect initialize to succeed. Then call tools/list the same way.
curl -sS -X POST "https://apeiron-data-mcp.vercel.app/api/mcp" \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-H "authorization: Bearer ${API_KEY}" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"check","version":"0"}}}'One China purchase-due call for the example company.
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_cn_purchase_due",
"arguments": { "company": "peirong-jinhai-sichuan" }
}
}The shape to look for. The row count is a placeholder, not a published total.
{
"company": "peirong-jinhai-sichuan",
"as_of": "YYYY-MM-DD",
"row_count": "<number greater than zero>",
"separate_from_bc_cash": true
}Same Business Central company, lake first. Replace <bc-slug> with one slug from list_companies. Omit live.
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "get_gl_movements",
"arguments": { "company": "<bc-slug>" }
}
}Lake shape. 2026-09-21 is the shelf date, not a balance. live_bc is false.
{
"company": "<bc-slug>",
"source": "parquet_shelf",
"live_bc": false,
"as_of": "2026-09-21"
}Same company, same tool, with live=true. That is the only change.
{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "get_gl_movements",
"arguments": { "company": "<bc-slug>", "live": true }
}
}Live shape. as_of is the calendar date in Asia/Singapore, not the shelf date above. live_bc is true. No amounts.
{
"company": "<bc-slug>",
"source": "business_central_odata",
"live_bc": true,
"as_of": "<YYYY-MM-DD today in Asia/Singapore>"
}Step 8
Hard rules
- Never merge cn-tplus into bc-cash. China numbers stay in the China book.
- Prefer the lake. Call live only when the user asks for current, today, or right now, or when the shelf date is stale for the ask.
- No writes. These tools cannot post, apply, delete, or run SQL.
- Every number tool takes one company. Do not pass all, a star, or a list of slugs. search_lake may omit company so it can list cards, and it still does not return a combined cash total.
- A blank currency code is unknown. It is not CNY, and it is not converted.
- Secrets stay in an environment variable, a secure store, or /keys. Do not put them in a prompt or in a committed file.