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 分