股票分析工具

一个基于Node.js的股票分析工具,利用AI评估时间序列和情感数据,支持n8n集成和JSON I/O。

  • by bluebossa63
  • JavaScript
  • 本地部署
  • 更新于
在 GitHub 查看 bluebossa63/mcp-stock-analyzer

使用说明

MCP库存分析器-ts(STDIO)

一 MCP服务器 (Node 20+)展示股票分析工具。

设计目标:

  • 仅AI评估 – 大语言模型(LLM)评估合并结果 时间序列 + 情感(分析) (无本地SMA数学)。
  • N8N友好型 – 单变量环境水合,清理JSON输入输出。
  • 可执行代码演示 – 可选工具以 POST(邮政服务/发布/帖子) 将结果发送到 n8n 的 webhook。

交通: STDIO(注:通常指的是“Standard Input/Output”,即标准输入/输出) (适用于n8n的MCP客户端节点)。运行时:Node.js版本≥20,TypeScript,纯ESM(NodeNext)。

快速入门

npm ci
npm run build
npx -y @bluebossa63/mcp-stock-analyzer-ts-stdio

环境设置(适合单变量用户)

使用且仅使用一个:

  • MCP_ENV=OPENAI_BASE_URL=https://api.openai.com,OPENAI_API_KEY=sk-...,OPENAI_MODEL=gpt-4o-mini
  • MCP_ENV_JSON={"OPENAI_BASE_URL":"https://api.openai.com","OPENAI_API_KEY":"sk-...","OPENAI_MODEL":"gpt-4o-mini"}
  • MCP_ENV_B64 = 的 base64 编码:
    OPENAI_BASE_URL=https://api.openai.com
    OPENAI_API_KEY=sk-...
    OPENAI_MODEL=gpt-4o-mini
    

可选:

  • N8N_WEBHOOK_URL 和 N8N_AUTH_HEADER (例如。, x-api-key: abc123)。

工具目录

所有输出均为文本JSON格式 result.content[0].text。

获取图表

输入 { "symbol":"AAPL", "range":"1mo", "interval":"1d" }
输出 { "symbol":"AAPL","currency":"USD","points":[{"t":..., "o":...,"h":...,"l":...,"c":...,"v":...}] }

获取多日内的(多次)实时数据

输入 { "symbol":"NVDA" }
输出

{
  "symbol":"NVDA",
  "intraday": {
    "1m":  { "points":[...] },   // 1d/1m
    "15m": { "points":[...] },   // 5d/15m
    "60m": { "points":[...] }    // 1mo/60m
  }
}

获取新闻标题

输入 { "symbol":"NVDA", "max": 10 } → { "symbol":"NVDA", "titles":[...] }

定义情感(或情绪)

输入

{ "articles": ["Beats expectations", "Analyst warns of volatility"] }

输出

{ "sentiment":"positive","confidence":0.78,"reasoning":"..." }

使用AI进行评估 / 使用AI评估分数

输入

{
  "symbol":"NVDA",
  "intraday": {
    "1m":  { "points":[{"t":1710000000000,"c":100},{"t":1710000600000,"c":101}] },
    "15m": { "points":[/* ... */] },
    "60m": { "points":[/* ... */] }
  },
  "sentiment": { "sentiment":"positive","confidence": 0.7, "reasoning":"..." },
  "aggregate": false,
  "perTimeframeMaxPoints": 200,
  "extraNotes": "Be conservative."
}

输出

{ "perTimeframe": { "1m": {"decision":"hold","reasoning":"..."}, "15m": {"decision":"buy","reasoning":"..."}, "60m": {"decision":"hold","reasoning":"..."} } }

从新闻中获取情感分析

输入 { "symbol":"NVDA", "max": 10 } → { "symbol":"NVDA", "titles":[...], "sentiment": {...} }

管道评估人工智能(或“用于管道评估的人工智能”)

输入 { "symbol":"NVDA", "maxNews":10, "aggregate":false, "perTimeframeMaxPoints":200 } → 与……的输出相同 evaluateWithAI。

发送到N8N(可执行文件)

输入 { "payload": {...}, "webhookUrl":"https://your/webhook", "authHeader":"x-api-key: abc123" }
输出 { "ok": true, "status": 200, "statusText": "OK", "body": "..." }
(环境回退: N8N_WEBHOOK_URL, N8N_AUTH_HEADER)

评估并发布(可执行程序)

运行 evaluateScoreWithAI 然后发布结果。
输入 = evaluateScoreWithAI 参数 + 可选 webhookUrl.

本地烟雾测试

情感:

OPENAI_BASE_URL=https://api.openai.com OPENAI_API_KEY=sk-... OPENAI_MODEL=gpt-4o-mini node --input-type=module -e "import('./dist/ai.js').then(async m => { const r = await m.defineSentimentFromTexts(['Strong demand','Macro risks']); console.log(r) })"

评估:

OPENAI_BASE_URL=https://api.openai.com OPENAI_API_KEY=sk-... OPENAI_MODEL=gpt-4o-mini node --input-type=module -e "import('./dist/ai.js').then(async m => {
  const res = await m.evaluateWithAI({
    symbol:'NVDA',
    intraday: { '60m': { points: [ {t:1710000000000,c:100},{t:1710003600000,c:102},{t:1710007200000,c:101} ] } },
    sentiment: { sentiment:'neutral', confidence:0.55 },
    aggregate:false, perTimeframeMaxPoints:120
  });
  console.log(JSON.stringify(res,null,2));
})"

n8n布线模式

模块化 → 获取新闻标题 → 定义情感倾向 → 获取多时段日内数据 → 使用AI评估得分 → (可选) 发送到N8N
用于构建的辅助函数 toolParameters:

function parseMcp(item){const raw=item?.json?.result?.content?.[0]?.text;return raw?JSON.parse(raw):null;}
const intradayObj = parseMcp(itemsFromNode('MCP: fetchMultiIntraday')[0]).intraday;
const sentimentObj = parseMcp(itemsFromNode('MCP: defineSentiment')[0]);
const symbol = parseMcp(itemsFromNode('MCP: fetchMultiIntraday')[0]).symbol || "NVDA";
return [{ json: { toolParameters: JSON.stringify({ symbol, intraday: intradayObj, sentiment: sentimentObj, aggregate:false, perTimeframeMaxPoints:200 }) } }];

一次性(行动/尝试) → 管道评估AI → (可选) 发送到N8N
一体化(或“全合一”) → 评估并发布

有效的Yahoo范围/区间

  • 1d → 1m
  • 5d → 15m (使用15米,而非10米)
  • 1mo → 60m
  • 3mo+ → 1d / 1wk / 1mo

故障排除

  • fetch failed → 选择性添加:
    • NODE_OPTIONS=--dns-result-order=ipv4first
    • 公司代理(或代表): HTTPS_PROXY, HTTP_PROXY, NO_PROXY
    • 公司CA: NODE_EXTRA_CA_CERTS=/path/to/ca.pem
  • 401 (OpenAI) → 缺失/乱码密钥;请与……核对 debug-echo-openai.
  • 环境变量解析 → 优先使用 MCP_ENV_JSON 或者 MCP_ENV_B64 如果你的主机处理了空格。

版本发布与持续集成(CI)发布

  • 服务器版本可以从(某处)同步 package.json 通过JSON导入: import pkgJson from "../package.json" with { type: "json" }.
  • 看 .github/workflows/publish.yml 用于基于标签的npm发布。