Apideck

com.apideck由 apideck.com 發布v0.1.13更新於 Nov 2, 2026

Apideck Unified API MCP — 330 tools across 200+ SaaS connectors (accounting, CRM, HRIS, ATS).

已驗證Streamable HTTP可網頁執行效率與工作流金融商業與電商

概覽

AI 產生的概覽

Apideck 的 MCP 伺服器開放 Apideck Unified API,讓助理透過 200 多個連接器讀寫會計、CRM、HRIS、ATS、檔案儲存等 SaaS 資料。

可以做什麼
  • 探索與檢視工具:依領域或搜尋詞列出工具、讀取工具的 JSON-Schema 輸入契約、列出允許的 scope
  • 執行任意 Apideck 端點工具,參數在派送前會依目標 schema 驗證
  • 操作會計、CRM、HRIS、ATS、問題追蹤、電商、檔案儲存、Vault、連接器、Webhook 與代理等資源
  • 執行依意圖編排的工作流程,例如月結檢查、支付帳單、收取客戶付款、員工到職
  • 可選程式碼模式:用搜尋工具尋找端點,再用執行工具在沙箱中執行 JavaScript 呼叫這些端點
適用情境
當助理需要透過單一整合處理多個業務 SaaS 資料時使用,例如彙整發票與 CRM 紀錄、檢視月結報表,或建立付款與員工紀錄。適合能接受較大工具目錄、或使用預設動態探索模式的代理。
執行需求
可使用託管端點 mcp.apideck.dev,或以 npx 執行本機 npm 套件(需 Node.js)。需要 Apideck API 金鑰、應用程式 ID,以及可選的消費者 ID,透過 x-apideck-api-key、x-apideck-app-id、x-apideck-consumer-id 標頭或 APIDECK_API_KEY、APIDECK_APP_ID、APIDECK_CONSUMER_ID 環境變數提供。所連接的 SaaS 帳號需已在 Apideck Vault 中授權。
安裝前請注意
API 金鑰屬機密,可存取所連接客戶的 SaaS 資料,伺服器會將其轉送至 Apideck 託管端點。寫入與刪除工具會在會計、CRM、HRIS 等系統建立、修改或刪除紀錄,支付帳單、收取付款等工作流程會操作真實財務資料。重試機制並不保證寫入重試安全。scope 過濾與身分鎖定皆為選用,若不希望代理切換消費者或刪除資料,應限制 scope 並鎖定身分。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Apideck,將其新增到工作區。
  2. 連接 Custom headers 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/com.apideck%2Fmcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "apideck": {
      "type": "http",
      "url": "https://mcp.apideck.dev/mcp",
      "headers": {
        "x-apideck-api-key": "<VALUE>",
        "x-apideck-app-id": "<VALUE>",
        "x-apideck-consumer-id": "<VALUE>"
      }
    }
  }
}

README

Apideck MCP Server

[npm version] [MCP Registry] [Glama score] [voke MTQS] [License: MIT]

Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent to 200+ connectors — accounting systems, HRIS platforms, CRM, file storage, and more — through one integration.

Quick Connect

[Install in Cursor] [Install in VS Code]

Claude Desktop (.mcpb bundle)

Recommended — prebuilt bundle:

Drag and drop the prebuilt mcp-server.mcpb onto Claude Desktop. Claude reads manifest.json to prompt for credentials and spawn the server — no manual config needed.

[!NOTE] Learn more about Desktop Extensions.

Local stdio (npx) alternative:

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

json
{  "mcpServers": {    "apideck": {      "command": "npx",      "args": ["-y", "@apideck/mcp", "start"],      "env": {        "APIDECK_API_KEY": "YOUR_API_KEY",        "APIDECK_CONSUMER_ID": "YOUR_CONSUMER_ID",        "APIDECK_APP_ID": "YOUR_APP_ID"      }    }  }}

Restart Claude Desktop after saving. Pin a specific version by replacing @apideck/mcp with @apideck/[email protected].

Claude Code CLI

Set credentials in your shell:

bash
export APIDECK_API_KEY="..."export APIDECK_CONSUMER_ID="..."export APIDECK_APP_ID="..."

Hosted (recommended):

bash
claude mcp add --transport http apideck https://mcp.apideck.dev/mcp \  --header "Authorization: Bearer $APIDECK_API_KEY" \  --header "x-apideck-consumer-id: $APIDECK_CONSUMER_ID" \  --header "x-apideck-app-id: $APIDECK_APP_ID"

Local stdio (npx):

bash
claude mcp add apideck \  -e APIDECK_API_KEY="$APIDECK_API_KEY" \  -e APIDECK_CONSUMER_ID="$APIDECK_CONSUMER_ID" \  -e APIDECK_APP_ID="$APIDECK_APP_ID" \  -- npx -y @apideck/mcp start

The start command reads credentials from environment variables only — it does not accept --api-key / --consumer-id / --app-id flags.

Windsurf

Settings → Cascade → Manage MCPs → View raw config, then paste:

json
{  "mcpServers": {    "apideck": {      "url": "https://mcp.apideck.dev/mcp",      "headers": {        "x-apideck-api-key": "YOUR_API_KEY",        "x-apideck-consumer-id": "YOUR_CONSUMER_ID",        "x-apideck-app-id": "YOUR_APP_ID"      }    }  }}
Any MCP client (manual JSON)
json
{  "mcpServers": {    "apideck": {      "url": "https://mcp.apideck.dev/mcp",      "headers": {        "x-apideck-api-key": "YOUR_API_KEY",        "x-apideck-consumer-id": "YOUR_CONSUMER_ID",        "x-apideck-app-id": "YOUR_APP_ID"      }    }  }}

Claude Desktop (.mcpb plugin bundle)

Apideck ships a Claude plugin bundle (.mcpb — Anthropic's Model Context Protocol Bundle format). Drop it into Claude Desktop and you get the full server (380+ tools: every endpoint tool plus 4 workflow tools) with API key / consumer ID / app ID prompted via the standard plugin UI.

bash
pnpm mcpb:build       # → dist/mcp-server.mcpb (~590 KB)

Each release attaches mcp-server.mcpb to the latest release. To build it yourself: pnpm mcpb:build → dist/mcp-server.mcpb. Open the .mcpb with Claude Desktop's plugin installer; Claude Desktop reads manifest.json to wire credentials and spawn the server.


Tools

380+ tools across 10 unified APIs (run list_tools({}) for live per-domain counts):

APICoverage
AccountingInvoices, bills, payments, suppliers, customers, journal entries, ledger accounts, purchase orders, tax rates, P&L, balance sheet, and more
CRMCompanies, contacts, leads, opportunities, pipelines, notes, activities, users
File StorageFiles, folders, drives, shared links, upload sessions
HRISEmployees, companies, departments, payrolls, time-off requests
VaultConnections, consumers, sessions, custom mappings, logs
ATSApplicants, applications, jobs
Issue TrackingCollections, tickets, users, tags, comments
ConnectorAPIs, connectors, resources, coverage metadata
EcommerceCustomers, orders, products, stores
WebhookWebhook subscriptions, logs
ProxyGET, POST, PUT, PATCH, DELETE

Workflow tools

Intent-grouped workflows orchestrate multiple calls behind a single MCP tool — saving agents the round-trips and field-plumbing they routinely get wrong.

ToolWhat it doesCalls
apideck-month-end-close-checkFans out aged-creditors, aged-debtors, balance-sheet, and P&L in parallel. Returns a partial result when some reports aren't supported by the connector.4
apideck-pay-billLooks up a vendor bill and creates a bill payment allocated against it, so the accounting system marks the bill (partially) paid.2
apideck-receive-customer-paymentLooks up an invoice and creates a customer payment allocated against it, so the accounting system marks the invoice (partially) paid.2
apideck-onboard-employeeConverts a hired ATS applicant into an HRIS employee, and optionally moves the applicant to a "hired" stage.2–3

Hosted

The server is live at:

https://mcp.apideck.dev/mcp

Pass credentials via headers:

HeaderDescription
x-apideck-api-keyYour Apideck API key
x-apideck-consumer-idThe end-user / customer ID in your app (optional — see below)
x-apideck-app-idYour Apideck application ID
x-apideck-auth-typeOptional. Set to JWT to authenticate with a Vault session token instead of an API key
Query parameters (single-credential clients)

Some clients can send only one credential, such as a bearer token. Put the API key in Authorization and the ids in the URL:

https://mcp.apideck.dev/mcp?app_id=<your app ID>&consumer_id=<consumer ID>Authorization: Bearer <your API key>

service_id works the same way. Precedence: header > query param > env var. Empty values are ignored. The API key is never accepted in the URL, because URLs end up in logs.

Vault session tokens (JWT)

To let an end user's browser or agent call tools without your API key, create a Vault session on your backend and pass its session_token instead:

Authorization: Bearer <session_token>x-apideck-auth-type: JWTx-apideck-app-id: <your app ID>x-apideck-consumer-id: <the session's consumer ID>

The server forwards x-apideck-auth-type: JWT on every Apideck API call, the same way the API Explorer authenticates sessions. Any other value keeps API-key auth. A few limits:

  • The header only takes effect alongside a bearer token in the request. The server's own APIDECK_API_KEY is never sent as a JWT.
  • A session token can't create a new Vault session. If a connection needs re-authorizing, the tool returns the plain error message instead of a re-auth link.
  • JWT auth works over HTTP only. The stdio CLI always uses an API key.

Consumer scoping (optional)

The consumer ID is optional at connect time. Leave APIDECK_CONSUMER_ID / x-apideck-consumer-id unset to start the server unscoped, then supply or override the consumer per call by passing a consumer_id argument to any tool:

execute_tool({ name: "crm-contacts-all", input: { consumer_id: "acme-inc" } })

Precedence: per-call consumer_id argument > x-apideck-consumer-id header > ?consumer_id= query param > APIDECK_CONSUMER_ID env var.

  • Unscoped calls work for application-scoped endpoints that don't need a consumer — e.g. webhook logs (webhook-event-logs-all) and vault-connections-all.
  • Consumer-scoped endpoints called without a consumer return Apideck's "consumer required" error, so set consumer_id (or the env/header) for those.
Locking identity (opt-in)

To pin identity to the boot header/query/env and stop agents from switching consumer or connection per call, start with --lock-identity (CLI) or append ?lock_identity=true (hosted). Locked calls ignore per-call consumer_id / service_id arguments. Off by default. Vault consumer tools that take consumer_id as a path parameter (e.g. vault-consumers-one) only accept the locked consumer; any other value, or no locked consumer, is refused. service_id path parameters (e.g. vault-connections-one) are unaffected.


Three Modes

ModeTools exposedInitial tokensBest for
dynamic (default)4 meta-tools~1,300General-purpose agents, token-sensitive contexts
staticAll endpoint tools + workflows~35–55KFocused agents doing a specific API
codeapideck_search + apideck_run~600Agents that call endpoints programmatically via JS

Dynamic mode

Agents discover tools progressively — ~85% fewer tokens than loading all 380+ schemas upfront:

list_tools({})  → { total: <n>, domains: [{ name: "accounting", count: <n> }, ...],      hint: "Call list_tools(domain=X) or list_tools(search_terms=[...])" }
list_tools({"search_terms": ["invoices"]})  → accounting-invoices-all, accounting-invoices-add, accounting-invoices-one, ...
describe_tool_input({"name": "accounting-invoices-all"})  → Full JSON Schema with all parameters
execute_tool({"name": "accounting-invoices-all", "input": {"limit": 10}})  → Invoice data from the connected accounting system

Put operation fields directly in input, using the contract returned by describe_tool_input. Dynamic execution validates the arguments before dispatch; malformed wrappers and schema violations return isError: true with code: "invalid_tool_input", a field path or issue paths, and no downstream call. Write tools also reject unknown top-level fields, so nothing undeclared reaches the API. Validation errors do not echo submitted values. Per-call consumer_id and service_id overrides remain supported; identity-lock rules still apply. When a service_id is set, list_tools only lists tools the connector supports, and calls to an unsupported resource return code: "unsupported_resource", which means the connector can't serve it, not that the result is empty. Request schemas omit read-only response fields, while retaining writable linked IDs and required path IDs. This does not add idempotency or make write retries safe.

You can combine dynamic mode with a scope filter:

json
{  "mcpServers": {    "apideck": {      "command": "node",      "args": ["dist/bin/mcp.js", "--mode", "dynamic", "--scope", "read"],      "env": { "APIDECK_API_KEY": "...", "APIDECK_CONSUMER_ID": "...", "APIDECK_APP_ID": "..." }    }  }}

Code mode

Code mode exposes two tools instead of 380+. Designed for agents that prefer calling endpoints as methods rather than tool calls:

  1. apideck_search — find endpoints by substring, returns camelCase method names
  2. apideck_run — execute a JS script with apideck.<methodName> bound to live endpoint dispatchers, sandboxed in node:vm
apideck_search("invoices")  → {      count: 4,      endpoints: [        { name: "accounting-invoices-list",   method: "accountingInvoicesList" },        { name: "accounting-invoices-create",  method: "accountingInvoicesCreate" },        { name: "accounting-invoices-get",     method: "accountingInvoicesGet" },        { name: "accounting-invoices-delete",  method: "accountingInvoicesDelete" }      ]    }
apideck_run({  script: "return await apideck.accountingInvoicesList({ request: { limit: 5 } })"})  → Invoice data from the connected accounting system

If an endpoint call fails with an HTTP error, apideck_run returns the status and the Apideck error body next to the message, matching execute_tool:

json
{"error":"HTTP 401: Unauthorized Request - Application: invalid-test-app not found.","status":401,"body":{"type_name":"UnauthorizedError","detail":"Application: invalid-test-app not found.","...":"..."},"logs":[]}

Scripts can handle it themselves: catch (e) exposes e.message, e.status and e.body.

The sandbox strips process, require, fs, child_process, and other Node globals — scripts only have access to the apideck object.


Scopes

Filter tools by HTTP method class:

ScopeHTTP methodsFlag
readGET, HEAD--scope read
writePOST, PUT, PATCH--scope write
destructiveDELETE--scope destructive

Repeat the flag to combine scopes (--scope read --scope write). On the hosted endpoint use a comma-separated query param: ?scopes=read,write. Invalid or empty values are rejected (CLI parse error / HTTP 400). Scopes apply in every mode, including code. When the scopes leave out destructive, execute_tool is also marked non-destructive (destructiveHint: false).


Connect from Any Agent Framework

Remote (hosted — no local install)

python
# OpenAI Agents SDKfrom agents import Agentfrom agents.mcp import MCPServerHTTP
agent = Agent(    name="Apideck Agent",    mcp_servers=[MCPServerHTTP(        url="https://mcp.apideck.dev/mcp",        headers={            "x-apideck-api-key": "...",            "x-apideck-consumer-id": "...",            "x-apideck-app-id": "..."        }    )])
python
# Pydantic AIfrom pydantic_ai import Agentfrom pydantic_ai.mcp import MCPServerHTTP
agent = Agent("anthropic:claude-sonnet-4-5", mcp_servers=[    MCPServerHTTP(        url="https://mcp.apideck.dev/mcp",        headers={            "x-apideck-api-key": "...",            "x-apideck-consumer-id": "...",            "x-apideck-app-id": "..."        }    )])
python
# LangChain / LangGraphfrom langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient({    "apideck": {        "url": "https://mcp.apideck.dev/mcp",        "transport": "streamable_http",        "headers": {            "x-apideck-api-key": "...",            "x-apideck-consumer-id": "...",            "x-apideck-app-id": "..."        }    }})tools = await client.get_tools()

Local stdio (for development)

bash
pnpm installpnpm build
# Dynamic mode (default)APIDECK_API_KEY=... APIDECK_CONSUMER_ID=... APIDECK_APP_ID=... node dist/bin/mcp.js start
# Static mode (all endpoint tools + workflows)APIDECK_API_KEY=... node dist/bin/mcp.js start --mode static
# Code modeAPIDECK_API_KEY=... node dist/bin/mcp.js start --mode code
# Read-onlyAPIDECK_API_KEY=... node dist/bin/mcp.js start --scope read
python
# OpenAI Agents SDK (local stdio)from agents import Agentfrom agents.mcp import MCPServerStdio
mcp = MCPServerStdio(name="apideck", params={    "command": "node",    "args": ["dist/bin/mcp.js", "start", "--mode", "dynamic"],    "env": {        "APIDECK_API_KEY": "...",        "APIDECK_CONSUMER_ID": "...",        "APIDECK_APP_ID": "..."    }})agent = Agent(name="Apideck Agent", mcp_servers=[mcp])

Reliability

The runtime automatically retries failed requests so transient errors don't surface to your agent:

  • Retried status codes: 408, 500, 502, 503, 504
  • Retried network errors: ECONNRESET, ECONNREFUSED, ETIMEDOUT, and similar
  • Strategy: exponential backoff, up to 4 attempts, capped at 30 s
  • Idempotency: retries only fire on GET, HEAD, PUT, DELETE, OPTIONS, TRACE — POST/PATCH are not retried automatically

Binary Content

File Storage endpoints that return images or audio send them as native MCP content blocks rather than base64 strings in JSON:

json
{ "type": "image", "data": "<base64>", "mimeType": "image/png" }{ "type": "audio", "data": "<base64>", "mimeType": "audio/mpeg" }

Agents that support multi-modal MCP content (Claude, GPT-4o) receive the raw bytes — no extra decoding step needed.


License

MIT

來源:README.md,提交 26d2f4a

工具

4

list_tools

Discover Apideck tools. Call with no args for domain index; filter with domain/search_terms/scope.

輸入參數scopedomainsearch_terms

describe_tool_input

Return the JSON-Schema input contract for a tool by name.

輸入參數name必填

execute_tool

Invoke a tool by name. `input` is validated against the target schema before dispatch.

輸入參數name必填input

list_scopes

Return the list of allowed MCP scopes.

無需輸入參數。

版本歷史

1
  1. v0.1.13最新Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分