金融数据服务

MCP Yahoo Finance Server是一个生产就绪的模型上下文协议(MCP)服务器,通过18种专用工具提供对Yahoo Finance数据的全面访问,具有智能缓存、多市场支持和完整类型安全。

  • by ozp
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 ozp/yfinance-mcp

使用说明

MCP雅虎金融服务器

一个生产就绪的模型上下文协议(MCP)服务器,通过18个专用工具提供对雅虎财经数据的全面访问。具有智能缓存、多市场支持和完全类型安全。

🌟 特性

  • 18个综合工具 -全面报道定价、财务、期权、持有人和新闻
  • 智能SQLite缓存 -通过基于TTL的缓存管理将延迟减少90%
  • 多市场支持 -在全球范围内使用可配置的市场规范化(美国、英国、德国、法国、日本、印度、香港、澳大利亚、加利福尼亚州等)
  • 类型安全 -完整的Pydantic模型,其中包含完整的类型提示
  • 生产准备就绪 -使用自定义异常层次结构进行稳健的错误处理
  • 零配置 -通过以下方式立即部署 uvx 无需设置
  • 异步/等待 -针对并发操作进行了优化

🚀 快速开始

通过uvx安装(推荐)

添加到您的Claude Desktop配置(claude_desktop_config.json):

{
  "mcpServers": {
    "yfinance": {
      "command": "uvx",
      "args": ["mcp-yfinance"],
      "env": {
        "YFINANCE_DEFAULT_MARKET": "US"
      }
    }
  }
}

手动安装

# Install with pip
pip install mcp-yfinance

# Or install from source
git clone https://github.com/yourusername/mcp-yfinance.git
cd mcp-yfinance
pip install -e .

🛠️ 配置

市场选择

通过环境变量设置默认市场:

# US stocks (default)
export YFINANCE_DEFAULT_MARKET=US

# Brazilian stocks (auto-adds .SA suffix)
export YFINANCE_DEFAULT_MARKET=BR

# UK stocks (auto-adds .L suffix)
export YFINANCE_DEFAULT_MARKET=UK

# Indian stocks - NSE (auto-adds .NS suffix)
export YFINANCE_DEFAULT_MARKET=IN_NSE

# Indian stocks - BSE (auto-adds .BO suffix)
export YFINANCE_DEFAULT_MARKET=IN_BSE

支持的市场:

  • US -美国(无后缀)
  • BR -巴西(.SA)
  • UK -英国(.L)
  • DE -德国(.DE)
  • FR -法国(.PA)
  • JP -日本(.T)
  • IN_NSE -印度NSE(.NS)
  • IN_BSE -印度BSE(.BO)
  • HK -香港(.HK)
  • AU -澳大利亚(.AX)
  • CA -加拿大(.TO)

缓存配置

缓存在以下位置自动创建 ~/.mcp-yfinance/cache.db 具有以下TTL:

数据类型 TTL 用例
当前报价 5分钟 实时价格跟踪
期权链 5分钟 期权交易
新闻 30分钟 最近的新闻更新
库存信息 1小时 公司信息
历史数据 24小时 价格历史
财务报表 24小时 季度/年度报告
持有人 24小时 所有权数据
建议 24小时 分析师评级

📚 可用工具

定价和历史数据(6个工具)

1. get_current_stock_price

获取当前股票价格和日变化信息。

输入:

{
  "symbol": "AAPL"
}

输出:

{
  "symbol": "AAPL",
  "price": 234.56,
  "change": 2.34,
  "change_percent": 1.01,
  "volume": 52487900,
  "currency": "USD",
  "timestamp": "2025-01-15T16:00:00"
}

2. get_stock_price_by_date

获取特定日期的收盘价。

输入:

{
  "symbol": "MSFT",
  "date": "2025-01-10"
}

3. get_stock_price_date_range

获取日期范围的价格系列。

输入:

{
  "symbol": "GOOGL",
  "start_date": "2025-01-01",
  "end_date": "2025-01-15"
}

4. get_historical_stock_prices

获取完整的OHLCV(开盘、高、低、收盘、成交量)历史数据。

输入:

{
  "symbol": "TSLA",
  "period": "1mo",
  "interval": "1d"
}

支持的时段: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max

支持的时间间隔: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo

5. get_dividends

获取完整的股息支付历史记录。

6. get_stock_actions

获取所有股票操作(股息+分割)。


公司信息(1个工具)

7. get_stock_info

获取全面的公司信息(约100个字段)。

输出包括:

  • 公司名称、部门、行业
  • 市值、企业价值
  • 市盈率、股息收益率
  • 52周高点/低点
  • 贝塔,尾随每股收益
  • 还有更多。..

财务报表(3个工具)

8. get_income_statement

收入表(DRE)

输入:

{
  "symbol": "AAPL",
  "freq": "yearly"
}

频率: yearly, quarterly, trailing

9. get_balance_sheet

获取资产负债表(Balanço Patrimonial)。

10. get_cashflow

获取现金流量表。


持有人和所有权(1个工具)

11. get_holder_info

获取6种不同类型的持有人信息。

输入:

{
  "symbol": "NVDA",
  "holder_type": "institutional_holders"
}

支架类型:

  • major_holders -主要所有权百分比
  • institutional_holders -机构投资者
  • mutualfund_holders -共同基金持股
  • insider_transactions -近期内幕交易
  • insider_purchases -内幕交易
  • insider_roster_holders -当前内部人员名单

选项(2个工具)

12. get_option_expiration_dates

获取所有可用选项的到期日期。

输出:

["2025-01-17", "2025-01-24", "2025-02-21", ...]

13. get_option_chain

获取特定到期日期的期权链。

输入:

{
  "symbol": "SPY",
  "expiration_date": "2025-01-17",
  "option_type": "both"
}

选项类型: calls, puts, both

输出包括:

  • 合同符号
  • 执行价格
  • 最后价格、出价、要价
  • 交易量和未平仓合约
  • 隐含波动率

新闻与分析(5个工具)

14. get_news

获取最近的新闻文章。

输出:

[
  {
    "title": "Apple announces new iPhone",
    "summary": "...",
    "url": "https://...",
    "provider": "Reuters",
    "publishedAt": "2025-01-15T10:30:00Z"
  }
]

15. get_recommendations

获取分析师建议和升级/降级。

输入:

{
  "symbol": "TSLA",
  "recommendation_type": "upgrades_downgrades",
  "months_back": 12
}

推荐类型: recommendations, upgrades_downgrades

16. get_earning_dates

获取收益公告日期(过去和未来)。

输入:

{
  "symbol": "META",
  "limit": 12
}

17. get_stock_splits

获取历史股票分割数据。

输入:

{
  "symbol": "AAPL"
}

输出:

[
  {
    "date": "2020-08-31",
    "ratio": 4.0
  },
  {
    "date": "2014-06-09",
    "ratio": 7.0
  }
]

18. get_analyst_price_targets

获取分析师的价格目标和估计。

输入:

{
  "symbol": "NVDA"
}

输出包括:

  • 当前价格
  • 目标均值、中位数、高、低
  • 分析师人数
  • 推荐(买入/持有/卖出)

💡 使用示例

使用克劳德桌面

User: What's the current price of Apple stock?
Claude: [Uses get_current_stock_price tool]
        Apple (AAPL) is currently trading at $234.56, up $2.34 (1.01%) today.

User: Show me Microsoft's quarterly revenue for the last year
Claude: [Uses get_income_statement with freq="quarterly"]
        Here's Microsoft's quarterly revenue...

User: Get Tesla call options expiring next month
Claude: [Uses get_option_expiration_dates, then get_option_chain]
        Here are Tesla's call options for 2025-02-21...

巴西市场示例

{
  "mcpServers": {
    "yfinance-br": {
      "command": "uvx",
      "args": ["mcp-yfinance"],
      "env": {
        "YFINANCE_DEFAULT_MARKET": "BR"
      }
    }
  }
}
User: Qual o preço atual de PETR4?
Claude: [Automatically normalizes to PETR4.SA]
        Petrobras PN (PETR4.SA) está cotada a R$ 38.45...

🏗️ 建筑

┌──────────────────────────────────┐
│   Claude Desktop / API Client    │
│   (User makes stock queries)     │
└────────────┬─────────────────────┘
             │ stdio
┌────────────▼─────────────────────┐
│   server.py (MCP Protocol)       │ ◄─── Tool registration
│   - @server.list_tools()         │      Input validation
│   - @server.call_tool()          │      Response formatting
└────────────┬─────────────────────┘
             │
┌────────────▼─────────────────────┐
│   cache.py (Cache Layer)         │ ◄─── TTL-based caching
│   - Check cache by key           │      5min: quotes
│   - Return if valid              │      1h: stock info
│   - Pass through if miss         │      24h: historical
└────────────┬─────────────────────┘
             │ (cache miss)
┌────────────▼─────────────────────┐
│   service.py (Business Logic)    │ ◄─── YahooFinanceService
│   - Normalize ticker             │      Input validation
│   - Call yfinance                │      Data transformation
│   - Map to Pydantic models       │      Error handling
│   - Save to cache                │      Market normalization
└────────────┬─────────────────────┘
             │
┌────────────▼─────────────────────┐
│   yfinance library               │
│   (Yahoo Finance API)            │
└──────────────────────────────────┘

项目结构

mcp-yfinance/
├── src/
│   └── mcp_yfinance/
│       ├── __init__.py       # Version, exports, main()
│       ├── __main__.py       # CLI entry point
│       ├── server.py         # MCP server orchestration
│       ├── service.py        # Business logic (18 methods)
│       ├── models.py         # Pydantic schemas + Enums
│       ├── cache.py          # SQLite cache manager
│       ├── exceptions.py     # Custom exception hierarchy
│       ├── utils.py          # Helper functions
│       ├── config.py         # Configuration management
│       └── py.typed          # Type checking marker
├── tests/                    # Test suite
├── pyproject.toml           # Package configuration
└── README.md                # This file

🧪 发展

设置开发环境

# Clone repository
git clone https://github.com/yourusername/mcp-yfinance.git
cd mcp-yfinance

# Install with dev dependencies
pip install -e ".[dev]"

# Or with uv (recommended)
uv pip install -e ".[dev]"

运行测试

# Run all tests
pytest

# Run with coverage
pytest --cov=mcp_yfinance --cov-report=html

# Run specific test file
pytest tests/test_service.py

类型检查

# Run mypy
mypy src/mcp_yfinance

# Run ruff (linter + formatter)
ruff check src/mcp_yfinance
ruff format src/mcp_yfinance

测试服务器

# Run server directly
python -m mcp_yfinance

# Test with MCP Inspector
npx @modelcontextprotocol/inspector uv run mcp-yfinance

# Test with environment variable
YFINANCE_DEFAULT_MARKET=BR python -m mcp_yfinance

🔧 故障排除

常见问题

问题:“找不到票”

  • 确保股票代码正确
  • 检查您是否使用了正确的市场(美国vs BR vs英国等)
  • 雅虎财经可能无法提供某些股票代码

问题:“缓存权限被拒绝”

  • 确保 ~/.mcp-yfinance/ 目录可写
  • 检查磁盘空间

问题:“找不到模块”

  • 重新安装软件包: pip install --force-reinstall mcp-yfinance
  • 检查Python版本(要求≥3.10)

问题:“SSL证书验证失败”

  • 集 verify=False 服务中初始化(不建议用于生产)
  • 更新CA证书: pip install --upgrade certifi

🤝 贡献

欢迎投稿!请遵循以下指南:

  1. 分叉存储库
  2. 创建要素分支 (git checkout -b feature/amazing-feature)
  3. 编写测试 对于新功能
  4. 确保所有测试通过 (pytest)
  5. 运行类型检查 (mypy src/mcp_yfinance)
  6. 格式代码 (ruff format)
  7. 提交更改 (git commit -m 'Add amazing feature')
  8. 推送到分支 (git push origin feature/amazing-feature)
  9. 打开拉取请求

代码规范

  • 所有代码均为英文(注释、文档字符串、变量名)
  • 所有函数的完整类型提示
  • 谷歌风格的文档字符串
  • 测试覆盖率≥80%
  • 通过mypy严格模式

📄 许可证

此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。


🙏 致谢


📞 支持


🗺️ 路线图

v0.2.0(计划中)

  • []具有指数回退的高级重试逻辑
  • []速率限制保护
  • []WebSocket支持实时报价
  • []其他市场(中国、韩国、台湾等)

v0.3.0(未来)

  • []多个数据源(Alpha Vantage、IEX Cloud)
  • []回测工具
  • []技术指标(RSI、MACD、布林带)
  • []投资组合跟踪

📊 演出

基准测试 (平均硬件):

操作 无缓存 有缓存 改进
获取股票价格 450ms 15ms 速度提高96%
获取历史数据 1200ms 20ms 速度提高98%
获取选项链 800ms 18ms 速度提高97%
获取财务报表 950毫秒 25毫秒 速度提高97%

缓存命中率: 使用1小时后约85%


由以下材料制成❤️ 对于MCP社区