内容
# siftingio-mcp
[](https://glama.ai/mcp/servers/SiftingIO/siftingio-mcp)
这是一个 [模型上下文协议](https://modelcontextprotocol.io) (MCP)服务器,通过 [SiftingIO 市场数据 SDK](https://github.com/SiftingIO/sdk-typescript) (`@siftingio/sdk`)使您的 AI 助手能够访问各种工具。启动后,模型可以拉取实时价格,深入挖掘 SEC/EDGAR 财务数据,获取 OHLCV 条形数据,查找 13F 持仓数据,检查市场状态,并扫描宏观经济日历 — 所有这些都作为工具。
## 设置
```bash
npm install
npm run build
```
您需要一个 API 密钥,可以在 <https://sifting.io> 获取:
```bash
export SIFTING_API_KEY=sft_...
```
如果您需要指向不同的后端,可以使用 `SIFTING_BASE_URL` 和 `SIFTING_WS_URL` 来覆盖默认值。
在本地工作?复制 `.env.example` 到 `.env` — `npm run dev` 和 `npm start` 会自动加载(Node 通过 `--env-file-if-exists` 加载)。但是,当您将此连接到实际的 MCP 客户端时,请通过服务器的 `env` 块传递密钥,而不是文件(下面有一个示例)。
## 运行
以下是工具箱:
- `npm run build` — 将 TypeScript 编译到 `dist/`。
- `npm start` — 在 **stdio** 上运行编译后的服务器(`node dist/index.js`)。
- `npm run start:http` — 在 **Streamable HTTP** 上运行(`node dist/http.js`)。
- `npm run dev` / `npm run dev:http` — 直接从源代码运行,使用 `tsx`,无需构建步骤。
- `npm test` — 运行 [vitest](https://vitest.dev) 套件(添加 `npm run test:watch` 以保持运行)。
- `npm run lint` / `npm run format` — ESLint(typescript-eslint)和 Prettier。
- `npm run typecheck` — `tsc --noEmit`。
每次推送和 PR,CI(`.github/workflows/ci.yml`)都会经历相同的考验:格式检查 → lint → typecheck → build → test。
有一件事值得注意:服务器通过 **stdio** 进行 JSON-RPC,因此 stdout 完全属于协议。任何诊断信息都通过 stderr 输出,以免干扰。
### 交互式检查
想手动测试?MCP 检查器是最简单的方法:
```bash
SIFTING_API_KEY=sft_... npx @modelcontextprotocol/inspector node dist/index.js
```
### HTTP(Streamable HTTP)传输
如果您在远程或托管环境中运行此服务器,请使用 MCP 的 Streamable HTTP 传输代替 stdio:
```bash
SIFTING_API_KEY=sft_... PORT=3000 npm run start:http
# → MCP 端点在 http://127.0.0.1:3000/mcp (POST 消息,GET SSE,DELETE 会话)
```
它是 **有状态的**:每个客户端都有自己的会话(由 `mcp-session-id` 头部跟踪)和自己的 `McpServer`,而上游 SiftingIO 连接在整个进程中共享。作为安全措施,它仅绑定到 **环回** 并拒绝非本地浏览器 `Origin` — 这是 DNS 重新绑定保护。可以使用 `PORT`(或 `MCP_HTTP_PORT`)设置端口;它默认为 `3000`。
如果您需要身份验证,请设置 **`MCP_AUTH_TOKEN`**,服务器将要求每个请求都有 `Authorization: Bearer <token>`(缺少或错误的 token 将返回 401)。将此与处理 TLS 和令牌的反向代理结合使用,您可以安全地将服务器暴露在 localhost 之外:
```bash
MCP_AUTH_TOKEN=s3cret SIFTING_API_KEY=sft_... npm run start:http
```
然后只需将任何支持 HTTP 的 MCP 客户端指向 `http://127.0.0.1:3000/mcp`:
```bash
claude mcp add --transport http siftingio http://127.0.0.1:3000/mcp
```
## 与 MCP 客户端一起使用
将此内容添加到您的客户端配置中 — 例如 Claude Desktop 的 `claude_desktop_config.json`,或在 Claude Code 上使用 `claude mcp add`:
```json
{
"mcpServers": {
"siftingio": {
"command": "node",
"args": ["/absolute/path/to/siftingio-mcp/dist/index.js"],
"env": { "SIFTING_API_KEY": "sft_..." }
}
}
}
```
## 工具(36)
| 命名空间 | 工具 |
| --- | --- |
| 即时(快照) | `last_trade`, `last_quote`, `last_tvl` |
| 股票 | `stocks_search`, `stocks_profile`, `stocks_filings`, `stocks_filing`, `stocks_sections`, `stocks_section`, `stocks_risk_factors_diff`, `stocks_ratios`, `stocks_earnings`, `stocks_financials`, `stocks_financial_concept`, `stocks_insiders`, `stocks_ownership`, `stocks_events`, `stocks_compensation`, `stocks_screener`, `stocks_bars` |
| 加密货币 / 外汇 | `crypto_bars`, `forex_bars` |
| DEX | `dex_wallet` |
| 市场 | `markets_list`, `markets_status_all`, `markets_status`, `markets_hours`, `markets_calendar` |
| 提交者 | `filers_holdings` |
| 宏观 | `economic_calendar_list` |
| 即时(流) | `ws_subscribe`, `ws_unsubscribe`, `ws_poll`, `ws_collect`, `ws_status`, `ws_disconnect` |
有几个模式值得注意:
分页工具接受 `cursor`/`limit` 并返回 `meta.next_cursor` 以获取下一页。`stocks_*` 列表工具 — `stocks_filings`, `stocks_earnings`, `stocks_insiders`, `stocks_ownership`, `stocks_events`, `stocks_compensation` — 还理解 **`max_items`**:设置它,它们将自动分页,收集最多这么多项目跨页。
高流量工具(`last_trade`, `last_quote`, `last_tvl`, `stocks_profile`, `stocks_search`)带有 **输出模式** 并返回 `structuredContent` 以及人类可读的文本,以便客户端也可以机器端读取。
每个工具还携带 MCP **注释**。数据工具为 `readOnlyHint: true`(和 `openWorldHint: true`,因为它们会访问外部 API),而更改连接状态的 WebSocket 工具为 `readOnlyHint: false`, `destructiveHint: false`.
结果在大约 60k 个字符处 **大小上限** (参见 `src/util.ts` 中的 `MAX_RESULT_CHARS`)。当一个重端点 — 完整的 XBRL 财务数据,筛选器,OHLCV 条形 — 返回超过该限制的内容时,服务器会修剪其最大数组并添加 `_truncated` 注释,解释如何缩小查询。
### 实时 WebSocket 流媒体
流媒体是一个棘手的情况:它不符合单个请求/响应的格式。因此,服务器保持 **一个持久的 WebSocket** 打开,缓冲到达的帧,工具只需从该缓冲区读取。通道(`product` 字段)为 `cex`(加密货币),`dex`(DEX 交易),`fx`(外汇),`us`(美国股票)和 `tvl`(DEX 池 TVL)。
有两种方法可以使用它:
- **订阅 + 轮询**,适用于持续流媒体:调用 `ws_subscribe` 一次,然后继续调用 `ws_poll`。第一个轮询会给你一个最近的尾部;将返回的 `next_seq` 作为 `after_seq` 喂回,你将只获得从那时起的新帧。`ws_status` 显示连接和订阅内容,`ws_disconnect` 则会关闭整个连接。
- **收集**,适用于快速一次性操作:`ws_collect` 订阅,等待最多 `duration_ms`(或直到它看到 `max` 个帧),返回它捕获的内容,然后清理它创建的任何订阅。适用于“给我一段 BTCUSD 的数据”。
连接会在自身断开时重新连接,并在断开时重新播放您的订阅。缓冲区是一个滚动窗口,因此最旧的帧最终会被丢弃 — 当它们被丢弃时,您将通过 `dropped`/`gap` 了解到这一点。
## 提示
这些是引导式、多工具工作流,您的客户端可以将其作为斜杠命令显示:
- **`company_snapshot`** `(ticker)` — 将 `stocks_profile`, `stocks_ratios`, 最新 `stocks_filings` 和 `last_trade` 一起拉取到一个简介中。
- **`compare_companies`** `(tickers)` — 将多个 ticker 并排对齐,显示关键比率。
- **`market_now`** — 当前哪些市场开放和关闭,以及即将到来的高影响宏观事件。
## 日志记录和关闭
服务器宣传 MCP **日志记录** 功能,并在连接(WebSocket 打开/关闭/重新连接/错误)或关闭时发生任何情况时,将结构化的 `notifications/message` 推给客户端 — 它还会将所有这些镜像到 stderr。
当它捕获到 **SIGINT 或 SIGTERM** 时,它会关闭实时的 WebSocket 并在退出前干净地关闭服务器。