概述
内容详情
替代品
什么是Financial Modeling Prep MCP Server?
这是一个基于Model Context Protocol(MCP)的金融数据服务,为AI助手提供访问和分析金融数据的标准化接口。它集成了Financial Modeling Prep的API,涵盖股票、公司基本面、市场数据和经济指标等广泛金融信息。如何使用Financial Modeling Prep MCP Server?
您可以通过HTTP请求访问服务,支持三种使用模式:动态模式(按需加载工具)、静态模式(预加载指定工具集)和传统模式(加载全部工具)。需要先获取FMP访问令牌才能使用。适用场景
适用于金融分析、投资研究、市场监控、财务建模、经济分析等场景,特别适合需要实时金融数据的AI助手和自动化工具。主要功能
如何使用
使用案例
常见问题
相关资源
安装
🚀 金融建模准备MCP(模型上下文协议)服务器
金融建模准备MCP(模型上下文协议)服务器为AI助手提供了访问和分析金融数据、股票信息、公司基本面和市场洞察的能力,使人工智能能够更好地服务于金融领域。
🚀 快速开始
生产环境部署
对于生产环境,你可以通过Smithery注册表使用该MCP服务器,它提供了托管和管理的MCP服务器: 🚀 在Smithery上查看
Smithery是一个帮助开发者查找和交付旨在与AI代理通信的AI原生服务的平台。所有服务都遵循模型上下文协议(MCP)规范,并提供:
- MCP服务器的集中发现
- MCP服务器的托管和分发
- 工具集成的标准化接口
使用Smithery进行会话配置
使用Smithery时,你可以通过在MCP客户端中传递配置来配置各个会话。Smithery平台会处理HTTP请求格式和会话管理。
Smithery的示例配置:
// 动态模式会话
{
"DYNAMIC_TOOL_DISCOVERY": "true"
}
// 静态模式会话
{
"FMP_TOOL_SETS": "search,company,quotes"
}
// 传统模式(所有工具)
{}
有关详细的集成说明,请遵循Smithery文档,以将MCP客户端连接到托管服务器。
本地开发
服务器作为一个HTTP服务器运行,公开了一个模型上下文协议端点。每个请求都可以通过查询参数包含特定于会话的配置。
基本服务器设置
本地开发:
# 克隆并设置
git clone https://github.com/imbenrabi/Financial-Modeling-Prep-MCP-Server
cd Financial-Modeling-Prep-MCP-Server
npm install
npm run build
# 在开发环境中运行
FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev
# 或者使用CLI参数
npm run dev -- --fmp-token=YOUR_TOKEN
npm run dev -- --port=4000 --fmp-token=YOUR_TOKEN
服务器级模式配置
🔐 服务器级动态模式(所有会话使用动态模式):
# CLI参数(优先级最高)
npm run dev -- --fmp-token=YOUR_TOKEN --dynamic-tool-discovery
# 环境变量
DYNAMIC_TOOL_DISCOVERY=true FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev
🔧 服务器级静态模式(所有会话使用指定的工具集):
# CLI参数(优先级最高)
npm run dev -- --fmp-token=YOUR_TOKEN --fmp-tool-sets=search,company,quotes
# 环境变量
FMP_TOOL_SETS=search,company,quotes FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev
📚 服务器级传统模式(所有会话获取所有工具):
# 默认行为 - 无需特定配置
npm run dev -- --fmp-token=YOUR_TOKEN
FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev
自定义端口配置
# 通过环境变量更改服务器端口
PORT=4000 npm run dev -- --fmp-token=YOUR_TOKEN
# 通过CLI参数更改服务器端口
npm run dev -- --port=4000 --fmp-token=YOUR_TOKEN
Docker使用
Docker部署支持所有配置方法,并能正确处理环境变量。
使用环境变量运行Docker
# 基本部署
docker run -p 8080:8080 -e FMP_ACCESS_TOKEN=YOUR_TOKEN your-image-name
# 使用服务器级动态模式
docker run -p 8080:8080 \
-e FMP_ACCESS_TOKEN=YOUR_TOKEN \
-e DYNAMIC_TOOL_DISCOVERY=true \
your-image-name
# 使用服务器级静态模式
docker run -p 8080:8080 \
-e FMP_ACCESS_TOKEN=YOUR_TOKEN \
-e FMP_TOOL_SETS=search,company,quotes \
your-image-name
使用Docker Compose
创建一个docker-compose.yml文件:
version: "3.8"
services:
fmp-mcp:
image: your-image-name
ports:
- "8080:8080"
environment:
- FMP_ACCESS_TOKEN=YOUR_FMP_ACCESS_TOKEN
- PORT=8080
# 可选:服务器级模式强制
- DYNAMIC_TOOL_DISCOVERY=true # 所有会话使用动态模式
# 或者
- FMP_TOOL_SETS=search,company,quotes # 所有会话使用这些工具集
# 或者两者都不设置以使用传统模式(所有工具)
然后运行:
docker-compose up
使用.env文件与Docker Compose
创建一个.env文件:
FMP_ACCESS_TOKEN=YOUR_FMP_ACCESS_TOKEN
PORT=8080
# 可选:选择一种服务器级模式
DYNAMIC_TOOL_DISCOVERY=true
# 或者
# FMP_TOOL_SETS=search,company,quotes
# 或者两者都注释掉以使用传统模式
并在你的docker-compose.yml中引用它:
version: "3.8"
services:
fmp-mcp:
image: your-image-name
ports:
- "8080:8080"
env_file:
- .env
✨ 主要特性
- 全面覆盖:可访问24个类别下的253+个金融工具。
- 工具集过滤:仅加载所需工具,降低复杂性并提高性能。
- 实时数据:提供实时股票报价、市场数据和财务信息。
- 财务报表:包含损益表、资产负债表、现金流量表和财务比率。
- 市场分析:提供技术指标、分析师预测和市场表现指标。
- 经济数据:涵盖国债利率、经济指标和宏观经济信息。
- 另类数据:包括ESG评分、内幕交易、国会交易和社会情绪。
📦 安装指南
本地开发安装
# 克隆并设置
git clone https://github.com/imbenrabi/Financial-Modeling-Prep-MCP-Server
cd Financial-Modeling-Prep-MCP-Server
npm install
npm run build
Docker部署
使用环境变量运行Docker
# 基本部署
docker run -p 8080:8080 -e FMP_ACCESS_TOKEN=YOUR_TOKEN your-image-name
使用Docker Compose
创建docker-compose.yml文件并运行docker-compose up。
💻 使用示例
基础用法
初始化动态模式会话
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"clientInfo": {
"name": "my-client",
"version": "1.0.0"
},
"capabilities": {}
}
}'
高级用法
启用工具集(动态模式)
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "enable_toolset",
"arguments": {
"toolset": "search"
}
}
}'
📚 详细文档
服务器架构
此MCP服务器采用由Smithery SDK支持的基于状态会话的架构,用于管理请求/会话生命周期。资源重用通过以clientId(从访问令牌派生)为键的客户端级缓存处理。
关键特性
- 客户端级缓存:每个
clientId维护一个McpServer/DynamicToolsetManager。无令牌请求使用每个请求的匿名ID(无重用)。 - 会话隔离:会话由SDK管理,但缓存不使用
sessionId。 - 状态管理:会话在多个请求中保持其状态。
- 模式强制:服务器级配置可以覆盖会话级设置。
- 基于HTTP的协议:通过HTTP与JSON-RPC格式的消息进行通信。
- 动态工具管理:工具可以在每个会话的运行时加载/卸载。
请求流程
- 客户端请求 → HTTP POST到
/mcp端点 - 会话管理 → 服务器根据配置创建或检索会话(缓存和重用以
clientId为键) - 模式解析 → 服务器确定操作模式(动态/静态/传统)
- 工具注册 → 根据解析的模式加载特定于会话的工具
- 请求处理 → 使用可用工具处理MCP请求
- 响应 → JSON-RPC响应发送回客户端
配置与模式强制
服务器支持多种配置方法,具有明确的优先级层次结构,以确保可预测的行为。
服务器模式
服务器以三种模式之一运行:
- 🔀 动态模式 (
DYNAMIC_TOOL_DISCOVERY=true)- 仅从3个元工具开始:
enable_toolset、disable_toolset、get_toolset_status - 通过元工具调用按需加载工具
- 最适合:工具需求变化的灵活、特定任务的工作流
- 仅从3个元工具开始:
- 🔧 静态模式 (
FMP_TOOL_SETS=search,company,quotes)- 在会话创建时预加载特定工具集
- 所有指定工具立即可用
- 最适合:具有可预测使用模式的已知、一致的工具需求
- 📚 传统模式(默认,无特定配置)
- 在会话创建时加载所有253+个工具
- 与所有功能的最大兼容性
- 最适合:无需配置复杂性的全功能访问
配置优先级
服务器在确定操作模式时遵循严格的优先级层次结构:
🥇 CLI参数(优先级最高)
↓
🥈 环境变量
↓
🥉 会话配置(优先级最低)
⚠️ 重要提示
当设置了服务器级配置(CLI参数或环境变量)时,它们将覆盖所有会话级配置。这确保了服务器实例上所有会话的一致行为。
示例覆盖场景:
# 使用CLI参数启动服务器
npm run dev -- --dynamic-tool-discovery
# 所有会话请求将使用动态模式,无论会话配置如何
# 像{"FMP_TOOL_SETS": "search,company"}这样的会话配置将被忽略
配置方法
- CLI参数(服务器级 - 覆盖一切)
npm run dev -- --fmp-token=TOKEN --dynamic-tool-discovery
npm run dev -- --fmp-token=TOKEN --fmp-tool-sets=search,company,quotes
npm run dev -- --port=4000 --fmp-token=TOKEN
- 环境变量(服务器级 - 覆盖会话配置)
DYNAMIC_TOOL_DISCOVERY=true npm run dev
FMP_TOOL_SETS=search,company,quotes npm run dev
- 会话配置(会话级 - 通过HTTP查询参数)
# 查询参数中的Base64编码JSON配置
curl -X POST "http://localhost:8080/mcp?config=eyJEWU5BTUlDX1RPT0xfRElTQ09WRVJZIjoidHJ1ZSJ9"
⚠️ 配置警告
- 服务器级模式是全局的:它们会影响服务器实例上的所有会话。
- 会话配置被忽略:当服务器级模式激活时,会话配置将被忽略。
- 不允许混合:当服务器级强制激活时,不同会话不能有不同的模式。
- 需要重启:更改服务器级配置需要重启服务器。
选择性工具加载
虽然MCP客户端可以自动过滤工具,但大型工具集可能会影响性能。为了优化体验,你可以指定要加载的工具类别,而不是一次加载所有253个工具:
可用工具集
| 工具集 | 描述 | 示例工具 |
|---|---|---|
search |
搜索与目录 | 搜索股票、公司查找、符号目录 |
company |
公司简介与信息 | 公司简介、高管信息、员工数量 |
quotes |
实时报价 | 实时股票价格、市场数据、价格变化 |
statements |
财务报表 | 损益表、资产负债表、现金流量、比率 |
calendar |
财务日历 | 收益日历、股息、首次公开募股、股票拆分 |
charts |
价格图表与历史 | 历史价格、技术图表、市场走势 |
news |
财经新闻 | 市场新闻、新闻稿、财经文章 |
analyst |
分析师覆盖 | 价格目标、评级、分析师预测 |
market-performance |
市场表现 | 行业表现、涨幅榜、跌幅榜、最活跃 |
insider-trades |
内幕交易 | 公司内幕活动、所有权变更 |
institutional |
机构持股 | 13F文件、基金持股、机构所有权 |
indexes |
市场指数 | 标准普尔500指数、纳斯达克指数、道琼斯指数、指数成分股 |
economics |
经济数据 | 国债利率、GDP、通货膨胀、经济指标 |
crypto |
加密货币 | 加密货币价格、市场数据、数字资产 |
forex |
外汇 | 货币对、汇率、外汇数据 |
commodities |
商品 | 黄金、石油、农产品、期货 |
etf-funds |
ETF与共同基金 | 基金持股、业绩、基金信息 |
esg |
ESG与可持续性 | 环境、社会、治理评级 |
technical-indicators |
技术指标 | RSI、SMA、EMA、MACD、布林带 |
senate |
政府交易 | 国会和参议院交易披露 |
sec-filings |
SEC文件 | 10-K、10-Q、8-K文件、监管文件 |
earnings |
收益与财报 | 收益报告、财报电话记录 |
dcf |
DCF估值 | 贴现现金流模型、估值 |
bulk |
批量数据 | 大规模数据下载用于分析 |
动态工具集管理(BETA)
🚧 此功能目前处于BETA阶段。API和行为可能会在未来版本中更改。
动态工具集管理功能允许你在运行时启用和禁用工具类别,而不是在启动时预先配置它们。这提供了更大的灵活性,并可以通过仅在需要时加载所需工具来帮助优化性能。
工作原理
当启用动态工具集管理时,每个会话仅从3个元工具开始:
enable_toolset- 在运行时启用特定工具集disable_toolset- 禁用先前启用的工具集get_toolset_status- 检查当前哪些工具集处于活动状态
AI助手可以使用这些元工具在其会话中根据不同任务动态加载和卸载特定工具类别。
配置选项
服务器级配置(影响所有会话)
命令行参数:
# 为所有会话启用动态工具集管理
npm run dev -- --fmp-token=YOUR_TOKEN --dynamic-tool-discovery
# 生产部署
node dist/index.js --fmp-token=YOUR_TOKEN --dynamic-tool-discovery
环境变量:
# 设置环境变量
export DYNAMIC_TOOL_DISCOVERY=true
export FMP_ACCESS_TOKEN=YOUR_TOKEN
npm run dev
# 或者内联
DYNAMIC_TOOL_DISCOVERY=true FMP_ACCESS_TOKEN=YOUR_TOKEN npm start
Docker:
# docker-compose.yml
version: "3.8"
services:
fmp-mcp:
image: your-image-name
ports:
- "8080:8080"
environment:
- FMP_ACCESS_TOKEN=YOUR_FMP_ACCESS_TOKEN
- DYNAMIC_TOOL_DISCOVERY=true # 为所有会话启用
会话级配置(无服务器覆盖时)
当未设置服务器级动态模式时,各个会话可以请求动态模式:
# Base64编码: {"DYNAMIC_TOOL_DISCOVERY":"true"}
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize",...}'
示例工作流
- 以动态模式启动服务器:
DYNAMIC_TOOL_DISCOVERY=true npm start
- AI助手初始化会话并获取元工具:
// 响应仅包含3个元工具:
{
"tools": [
{ "name": "enable_toolset", "description": "启用特定工具集" },
{ "name": "disable_toolset", "description": "禁用工具集" },
{ "name": "get_toolset_status", "description": "检查活动工具集" }
]
}
- AI助手启用所需工具集:
// 启用搜索工具集
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"enable_toolset","arguments":{"toolset":"search"}}}
// 启用报价工具集
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"enable_toolset","arguments":{"toolset":"quotes"}}}
- AI助手使用启用的工具:
// 现在可以使用搜索和报价工具
{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"searchSymbol","arguments":{"query":"AAPL"}}}
{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"getQuote","arguments":{"symbol":"AAPL"}}}
- AI助手可以禁用未使用的工具集:
{
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "disable_toolset",
"arguments": { "toolset": "search" }
}
}
好处
- 性能提升:每个会话最初加载较少的工具,启动更快。
- 灵活性:仅加载当前任务所需的工具。
- 资源高效:通过在每个会话中禁用未使用的工具集,减少内存使用。
- 任务导向:非常适合处理特定财务分析任务的AI助手。
- 会话隔离:每个会话可以有不同的活动工具集。
发起HTTP请求
服务器在/mcp端点公开了一个模型上下文协议端点,接受JSON-RPC格式的请求。每个请求可以通过查询参数包含可选的会话配置。
端点格式
POST http://localhost:8080/mcp[?config=BASE64_ENCODED_CONFIG]
必需的请求头
Content-Type: application/json
Accept: application/json, text/event-stream
会话配置
会话配置以Base64编码的JSON形式作为config查询参数传递。当没有服务器级模式强制时,这允许每个会话有不同的工具配置。
配置示例
- 动态模式会话:
# 配置: {"DYNAMIC_TOOL_DISCOVERY":"true"}
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64)
# 结果: eyJEWU5BTUlDX1RPT0xfRElTQ09WRVJZIjoidHJ1ZSJ9
- 静态模式会话:
# 配置: {"FMP_TOOL_SETS":"search,company,quotes"}
CONFIG_BASE64=$(echo -n '{"FMP_TOOL_SETS":"search,company,quotes"}' | base64)
# 结果: eyJGTVBfVE9PTF9TRVRTIjoic2VhcmNoLGNvbXBhbnkscXVvdGVzIn0=
- 传统模式会话:
# 配置: {} (空对象)
CONFIG_BASE64=$(echo -n '{}' | base64)
# 结果: e30=
请求示例
1. 初始化动态模式会话
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"clientInfo": {
"name": "my-client",
"version": "1.0.0"
},
"capabilities": {}
}
}'
预期响应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": {
"listChanged": true
}
},
"serverInfo": {
"name": "fmp-mcp-server",
"version": "1.0.0"
}
}
}
2. 列出可用工具
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}'
预期响应(动态模式):
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": [
{
"name": "enable_toolset",
"description": "在运行时启用特定工具集",
"inputSchema": {
"type": "object",
"properties": {
"toolset": {
"type": "string",
"description": "要启用的工具集名称"
}
},
"required": ["toolset"]
}
},
{
"name": "disable_toolset",
"description": "禁用先前启用的工具集"
},
{
"name": "get_toolset_status",
"description": "检查当前哪些工具集处于活动状态"
}
]
}
}
3. 启用工具集(动态模式)
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "enable_toolset",
"arguments": {
"toolset": "search"
}
}
}'
4. 调用金融工具
CONFIG_BASE64=$(echo -n '{"FMP_TOOL_SETS":"search,quotes"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "searchSymbol",
"arguments": {
"query": "Apple"
}
}
}'
5. 获取股票报价
CONFIG_BASE64=$(echo -n '{"FMP_TOOL_SETS":"quotes"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "getQuote",
"arguments": {
"symbol": "AAPL"
}
}
}'
会话和客户端行为
- 会话持久性:每个唯一的
config参数创建一个单独的会话(由SDK管理)。 - 工具状态:在动态模式下,启用/禁用的工具集可能会在相同的
clientId的请求中重用。 - 隔离性:会话不会相互干扰工具配置;缓存以
clientId为键。 - 缓存:客户端存储(LRU + TTL)为每个
clientId维护一个McpServer/DynamicToolsetManager。
错误处理
常见错误响应:
// 无效配置
{
"jsonrpc": "2.0",
"error": {
"code": -32000,
"message": "错误请求: 无效配置"
},
"id": null
}
// 工具不可用
{
"jsonrpc": "2.0",
"error": {
"code": -32601,
"message": "未找到工具: toolName"
},
"id": 1
}
// 缺少必需参数
{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "缺少必需参数: symbol"
},
"id": 2
}
可用工具
⚠️ 重要提示
服务器级配置覆盖会话配置:
- 当使用CLI参数(
--dynamic-tool-discovery,--fmp-tool-sets)时,它们适用于所有会话。- 当设置环境变量(
DYNAMIC_TOOL_DISCOVERY,FMP_TOOL_SETS)时,它们适用于所有会话。- 通过查询参数的会话级配置在服务器级模式激活时将被忽略。
- 这确保了服务器实例上所有会话的一致行为。
配置优先级:CLI参数 > 环境变量 > 会话配置
示例:如果服务器以
--dynamic-tool-discovery启动,所有会话将使用动态模式,即使它们在会话配置中请求{"FMP_TOOL_SETS":"search,company"}。
此MCP为AI助手提供了以下工具来访问金融数据:
搜索工具
- searchSymbol:按名称或代码搜索股票代码
- searchName:按名称搜索公司
- searchCIK:按CIK编号搜索公司
- searchCUSIP:按CUSIP编号搜索证券
- searchISIN:按ISIN编号搜索证券
- stockScreener:根据各种标准筛选股票
- searchExchangeVariants:搜索不同交易所的符号变体
- searchCompaniesByName:按名称搜索公司
- searchCompaniesBySymbol:按符号搜索公司
- searchCompaniesByCIK:按CIK编号搜索公司
目录和符号列表
- getCompanySymbols:获取所有公司符号列表
- getFinancialStatementSymbols:获取有可用财务报表的公司列表
- getCIKList:获取SEC注册实体的CIK编号列表
- getSymbolChanges:获取股票符号变更列表
- getETFList:获取ETF列表
- getActivelyTradingList:获取活跃交易公司列表
- getEarningsTranscriptList:获取有收益财报的公司列表
- getAvailableExchanges:获取可用交易所列表
- getAvailableSectors:获取可用行业列表
- getAvailableIndustries:获取可用产业列表
- getAvailableCountries:获取可用国家列表
- getAvailableTranscriptSymbols:获取有可用财报的符号列表
- getAllIndustryClassification:获取所有行业分类
- getIndustryClassificationList:获取行业分类列表
公司信息
- getCompanyProfile:获取详细的公司简介信息
- getCompanyExecutives:获取公司高管信息
- getCompanyDescription:获取公司描述
- getCompanyOutlook:获取公司前景信息
- getCompanyRating:获取公司评级信息
- getHistoricalRating:获取公司历史评级
- getCompanyUpgradesDowngrades:获取公司升级和降级信息
- getCompanyGrade:获取公司评分信息
- getCompanyPeers:获取与给定公司类似的公司
- getMarketCap:获取公司市值
- getHistoricalMarketCap:获取历史市值
- getSharesFloat:获取公司流通股信息
- getHistoricalSharesFloat:获取历史流通股信息
- getEarningsSurprises:获取历史收益惊喜
- getEarningCallTranscript:获取特定的收益财报
- getEarningCallTranscriptsBySymbol:获取某个符号的所有收益财报
- getCompanyNotes:获取公司备注
- getCompanyProfileByCIK:按CIK获取公司简介
- getCompanySECProfile:获取公司SEC简介
- getDelistedCompanies:获取退市公司列表
- getEmployeeCount:获取公司员工数量
- getHistoricalEmployeeCount:获取历史员工数量
- getBatchMarketCap:批量获取市值数据
- getAllShareFloat:获取所有流通股数据
- getLatestMergersAcquisitions:获取最新的并购信息
- searchMergersAcquisitions:搜索并购信息
- getExecutiveCompensation:获取高管薪酬数据
- getExecutiveCompensationBenchmark:获取高管薪酬基准数据
- getAcquisitionOwnership:获取收购所有权数据
财务报表
- getIncomeStatement:获取公司损益表
- getBalanceSheet:获取公司资产负债表
- getBalanceSheetStatement:获取公司资产负债表
- getCashFlowStatement:获取公司现金流量表
- getIncomeStatementAsReported:获取报告的损益表
- getBalanceSheetAsReported:获取报告的资产负债表
- getBalanceSheetStatementAsReported:获取报告的资产负债表
- getCashFlowStatementAsReported:获取报告的现金流量表
- getFullFinancialStatementAsReported:获取报告的完整财务报表
- getFinancialStatementFullAsReported:获取报告的完整财务报表
- getFinancialReportDates:获取可用财务报告的日期
- getFinancialReportsDates:获取可用财务报告的日期
- getLatestFinancialStatements:获取最新财务报表
- getIncomeStatementTTM:获取过去十二个月的损益表
- getBalanceSheetStatementTTM:获取过去十二个月的资产负债表
- getCashFlowStatementTTM:获取过去十二个月的现金流量表
- getIncomeStatementGrowth:获取损益表增长
- getBalanceSheetStatementGrowth:获取资产负债表增长
- getCashFlowStatementGrowth:获取现金流量表增长
- getFinancialStatementGrowth:获取财务报表增长
- getFinancialReportJSON:以JSON格式获取财务报告
- getFinancialReportXLSX:以XLSX格式获取财务报告
- getRevenueProductSegmentation:获取收入产品细分
- getRevenueGeographicSegmentation:获取收入地理细分
财务指标和分析
- getKeyMetrics:获取公司关键财务指标
- getKeyMetricsTTM:获取过去十二个月的关键指标
- getRatios:获取公司财务比率
- getFinancialRatios:获取公司财务比率
- getFinancialRatiosTTM:获取过去十二个月的财务比率
- getFinancialGrowth:获取财务增长指标
- getIncomeStatementGrowth:获取损益表增长指标
- getBalanceSheetGrowth:获取资产负债表增长指标
- getCashFlowStatementGrowth:获取现金流量表增长指标
- getDCFValuation:获取股票的DCF(贴现现金流)估值
- getLeveredDCFValuation:获取股票的杠杆DCF估值
- calculateCustomDCF:使用用户定义的参数计算自定义DCF估值
- calculateCustomLeveredDCF:使用用户定义的参数计算自定义杠杆DCF估值
- getEnterpriseValue:获取公司企业价值
- getFinancialScore:获取公司财务评分
- getFinancialScores:获取公司财务评分
- getOwnerEarnings:获取公司所有者收益
技术指标
- getSMA:获取简单移动平均线(SMA)指标
- getEMA:获取指数移动平均线(EMA)指标
- getWMA:获取加权移动平均线(WMA)指标
- getDEMA:获取双指数移动平均线(DEMA)指标
- getTEMA:获取三指数移动平均线(TEMA)指标
- getWilliams:获取威廉姆斯%R指标
- getADX:获取平均方向指数(ADX)指标
- getStandardDeviation:获取标准差指标
- getRSI:获取相对强弱指数(RSI)指标
报价和价格数据
- getQuote:获取当前股票报价信息
- getBatchQuotes:获取多个符号的报价
- getQuoteShort:获取缩写的股票报价信息
- getBatchQuotesShort:获取多个符号的缩写报价
- getHistoricalPrice:获取历史价格数据
- getHistoricalPriceChart:获取历史价格图表数据
- getHistoricalDailyPrice:获取历史每日价格数据
- getHistoricalStockSplits:获取历史股票拆分信息
- getHistoricalDividends:获取历史股息信息
- getTechnicalIndicator:获取股票的技术指标
- getLightChart:获取价格图表的轻量级版本
- getFullChart:获取价格图表的完整版本
- getUnadjustedChart:获取未调整的价格图表
- getDividendAdjustedChart:获取股息调整后的价格图表
- getIntradayChart:获取日内价格图表
- getAftermarketQuote:获取盘后报价
- getAftermarketTrade:获取盘后交易数据
- getBatchAftermarketQuote:批量获取盘后报价
- getBatchAftermarketTrade:批量获取盘后交易数据
- getStockPriceChange:获取股票价格变化信息
市场指数和表现
- getIndexList:获取所有市场指数列表
- getIndexQuotes:获取市场指数报价
- getIndexQuote:获取特定指数的报价
- getIndexShortQuote:获取指数的缩写报价
- getAllIndexQuotes:获取所有市场指数的报价
- getSP500Constituents:获取标准普尔500指数成分股
- getHistoricalSP500Changes:获取标准普尔500指数的历史变化
- getNasdaqConstituents:获取纳斯达克指数成分股
- getDowJonesConstituents:获取道琼斯指数成分股
- getHistoricalNasdaqChanges:获取纳斯达克指数的历史变化
- getHistoricalDowJonesChanges:获取道琼斯指数的历史变化
- getSectorPerformance:获取行业表现数据
- getHistoricalSectorPerformance:获取历史行业表现
- getBiggestGainers:获取涨幅最大的股票
- getBiggestLosers:获取跌幅最大的股票
- getMostActiveStocks:获取最活跃的股票
- getHistoricalIndexFullChart:获取历史指数完整图表
- getHistoricalIndexLightChart:获取历史指数轻量级图表
- getIndex1MinuteData:获取指数的1分钟数据
- getIndex5MinuteData:获取指数的5分钟数据
- getIndex1HourData:获取指数的1小时数据
- getSectorPerformanceSnapshot:获取行业表现快照
- getSectorPESnapshot:获取行业市盈率快照
- getIndustryPerformanceSnapshot:获取产业表现快照
- getIndustryPerformanceSummary:获取产业表现总结
- getIndustryPESnapshot:获取产业市盈率快照
- getHistoricalIndustryPerformance:获取历史产业表现
- getHistoricalIndustryPE:获取历史产业市盈率
- getHistoricalSectorPE:获取历史行业市盈率
市场数据
- getMarketHours:获取特定交易所的市场交易时间
- getExchangeMarketHours:获取特定交易所的市场交易时间
- getHolidaysByExchange:获取特定交易所的假期信息,可选择日期范围过滤
- getAllExchangeMarketHours:获取所有交易所的市场交易时间
- getEarningsCalendar:获取收益公告日历
- getIPOCalendar:获取首次公开募股日历
- getStockSplitCalendar:获取股票拆分日历
- getDividendCalendar:获取股息日历
- getEconomicCalendar:获取经济事件日历
- getIPODisclosures:获取首次公开募股披露信息
- getIPOProspectuses:获取首次公开募股招股说明书
新闻和新闻稿
- getFMPArticles:获取FMP的财经新闻文章
- getGeneralNews:获取一般财经新闻
- getStockNews:获取特定股票的新闻
- getStockNewsSentiment:获取带有情绪分析的新闻
- getPressReleases:获取公司新闻稿
- searchStockNews:搜索股票新闻
- searchPressReleases:搜索新闻稿
- getCryptoNews:获取加密货币新闻
- searchCryptoNews:搜索加密货币新闻
- getForexNews:获取外汇新闻
- searchForexNews:搜索外汇新闻
SEC文件
- getLatestFinancialFilings:获取最新的财务文件
- getFilingsBySymbol:按符号获取文件
- getFilingsByCIK:按CIK编号获取文件
- getFilingsByFormType:按表格类型获取文件
- getLatest8KFilings:获取最新的8-K文件
- getSecFilingExtract:获取SEC文件摘录
- getFilingExtractAnalyticsByHolder:按持有人获取文件摘录分析
内幕和机构交易
- getInsiderTrading:获取内幕交易数据
- getInsiderRoster:获取公司内幕人员名单
- getInsiderRosterStatistics:获取内幕人员名单统计信息
- getInsiderTransactionTypes:获取内幕交易类型
- getInsiderOwnership:获取内幕人员所有权信息
- getInstitutionalOwnership:获取机构所有权数据
- getInstitutionalHolders:获取公司的机构持有人
- getInstitutionalHoldersList:获取机构持有人列表
- getInstitutionalHolderPortfolioDates:获取机构持有人的投资组合日期
- get13FFilings:获取13F文件
- get13FDates:获取13F文件的日期
- getForm13FFilingDates:获取13F文件的提交日期
- getLatestInsiderTrading:获取最新的内幕交易数据
- searchInsiderTrades:搜索内幕交易
- searchInsiderTradesByName:按报告人姓名搜索内幕交易
- getInsiderTradeStatistics:获取内幕交易统计信息
- getLatestInstitutionalFilings:获取最新的机构文件
- getHolderPerformanceSummary:获取持有人表现,总结
- getHolderIndustryBreakdown:获取持有人行业细分
- getPositionsSummary:获取持仓总结
ETF和基金
- getETFHolder:获取ETF持有人信息
- getETFSectorWeighting:获取ETF行业权重
- getETFCountryWeighting:获取ETF国家权重
- getETFExposure:获取ETF对股票的敞口
- getFundInfo:获取基金信息
- getFundHolder:获取基金持有人信息
- getFundSectorWeighting:获取基金行业权重
- getFundHoldings:获取基金持仓
- getFundCountryAllocation:获取基金国家分配
- getFundAssetExposure:获取基金资产敞口
- getDisclosure:获取最新的基金披露持有人信息
- getFundDisclosure:按年/季度获取全面的基金披露数据
- searchFundDisclosures:按持有人姓名搜索基金披露
- getFundDisclosureDates:获取基金披露日期(可选CIK)
- getETFHoldersBulk:批量获取ETF持有人信息
- getETFQuotes:获取ETF报价
- getMutualFundQuotes:获取共同基金报价
政府交易
- getGovernmentTradingList:获取政府交易列表
- getSenateTrading:获取参议院交易数据
- getHouseTrading:获取众议院交易数据
- getSenateTrades:获取参议院交易信息
- getSenateTradesByName:按姓名获取参议院交易信息
- getHouseTrades:获取众议院交易信息
- getHouseTradesByName:按姓名获取众议院交易信息
- getLatestSenateDisclosures:获取最新的参议院披露信息
- getLatestHouseDisclosures:获取最新的众议院披露信息
加密货币和外汇
- getCryptocurrencyList:获取加密货币列表
- getCryptocurrencyQuote:获取加密货币报价
- getCryptocurrencyShortQuote:获取缩写的加密货币报价
- getCryptocurrencyBatchQuotes:获取多个加密货币的报价
- getCryptocurrencyHistoricalLightChart:获取加密货币的轻量级历史图表
- getCryptocurrencyHistoricalFullChart:获取加密货币的完整历史图表
- getCryptocurrency1MinuteData:获取加密货币的1分钟数据
- getCryptocurrency5MinuteData:获取加密货币的5分钟数据
- getCryptocurrency1HourData:获取加密货币的1小时数据
- getForexList:获取外汇对列表
- getForexQuote:获取外汇对报价
- getForexShortQuote:获取缩写的外汇报价
- getForexBatchQuotes:获取多个外汇对的报价,可选择缩写格式
- getForexHistoricalLightChart:获取外汇的轻量级历史图表,可选择日期范围
- getForexHistoricalFullChart:获取外汇的完整历史图表,可选择日期范围
- getForex1MinuteData:获取外汇的1分钟数据,可选择日期范围
- getForex5MinuteData:获取外汇的5分钟数据,可选择日期范围
- getForex1HourData:获取外汇的1小时数据,可选择日期范围
收益
- getEarningsReports:获取收益报告
- getEarningsTranscript:获取收益财报
- getEarningsTranscriptDates:获取收益财报日期
- getLatestEarningsTranscripts:获取最新的收益财报
- getEarningsSurprisesBulk:批量获取收益惊喜
特殊数据集
- getCOTList:获取交易员持仓报告(COT)列表
- getCOTReports:获取特定符号的COT报告,可选择日期范围过滤
- getCOTAnalysis:获取特定符号的COT分析,可选择日期范围过滤
- getGovernmentTradingList:获取政府交易列表
- getSenateTrading:获取参议院交易数据
- getHouseTrading:获取众议院交易数据
- getESGDisclosures:获取特定符号的ESG披露信息
- getESGRatings:获取特定符号的ESG评级
- getESGBenchmarks:获取ESG基准数据,可选择年份过滤
商品
- listCommodities:获取所有可用商品的列表,包括其符号、名称、交易所、交易月份和货币
经济
- getTreasuryRates:获取国债利率,可选择日期范围过滤
- getEconomicIndicators:按名称获取经济指标,可选择日期范围过滤
- getEconomicCalendar:获取经济事件日历,可选择日期范围过滤
- getMarketRiskPremium:获取市场风险溢价数据
筹资
- getLatestCrowdfundingCampaigns:获取最新的众筹活动
- searchCrowdfundingCampaigns:搜索众筹活动
- getCrowdfundingCampaignsByCIK:按CIK获取众筹活动
- getLatestEquityOfferings:获取最新的股权发行
- searchEquityOfferings:搜索股权发行
- getEquityOfferingsByCIK:按CIK获取股权发行
批量数据工具
重要说明:所有批量端点以CSV格式返回原始字符串数据,而不是解析后的JSON对象。此端点以CSV文件形式返回响应。提供的示例响应代表单个记录。这种设计保留了原始FMP API格式,并为大型数据集提供了更好的性能。
- getCompanyProfilesBulk:批量获取公司简介(CSV格式)
- getStockRatingsBulk:批量获取股票评级(CSV格式)
- getDCFValuationsBulk:批量获取DCF估值(CSV格式)
- getFinancialScoresBulk:批量获取财务评分(CSV格式)
- getPriceTargetSummariesBulk:批量获取价格目标总结(CSV格式)
- getUpgradesDowngradesConsensusBulk:批量获取升级/降级共识(CSV格式)
- getKeyMetricsTTMBulk:批量获取关键指标TTM(CSV格式)
- getRatiosTTMBulk:批量获取比率TTM(CSV格式)
- getStockPeersBulk:批量获取股票同行(CSV格式)
- getEODDataBulk:批量获取每日收盘价格数据(CSV格式)
- getIncomeStatementsBulk:批量获取损益表(CSV格式)
- getIncomeStatementGrowthBulk:批量获取损益表增长数据(CSV格式)
- getBalanceSheetStatementsBulk:批量获取资产负债表(CSV格式)
- getBalanceSheetGrowthBulk:批量获取资产负债表增长数据(CSV格式)
- getCashFlowStatementsBulk:批量获取现金流量表(CSV格式)
- getCashFlowGrowthBulk:批量获取现金流量增长数据(CSV格式)
- getFinancialRatiosBulk:批量获取财务比率(CSV格式)
- getKeyMetricsBulk:批量获取关键指标(CSV格式)
- getFinancialGrowthBulk:批量获取财务增长数据(CSV格式)
获取金融建模准备访问令牌
要获取金融建模准备访问令牌:
- 访问金融建模准备网站
- 点击“注册”创建账户
- 验证你的电子邮件地址
- 登录后,导航到你的仪表盘以找到你的API密钥
- 如需更多数据访问权限,考虑升级到付费计划(入门级、高级版、终极版或企业版)
金融建模准备提供不同的定价层级,具有不同的数据访问级别和API调用限制。有关更多信息,请访问FMP定价页面。
贡献代码
欢迎贡献代码!以下是贡献的步骤:
- 分叉仓库
- 创建你的功能分支 (
git checkout -b feature/amazing-feature) - 提交你的更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 打开拉取请求
每个拉取请求都会触发一个GitHub Actions工作流,用于验证构建过程。
开发设置
# 克隆仓库
git clone https://github.com/imbenrabi/Financial-Modeling-Prep-MCP-Server
cd Financial-Modeling-Prep-MCP-Server
# 安装依赖
npm install
# 构建项目
npm run build
# 使用你的API密钥在开发模式下运行
FMP_ACCESS_TOKEN=your_api_key npm run dev
# 或者通过CLI参数直接指定API密钥
npm run dev -- --fmp-token=your_api_key
开发服务器默认在端口8080上启动。你可以使用PORT环境变量配置端口:
PORT=4000 FMP_ACCESS_TOKEN=your_api_key npm run dev
带有服务器级模式强制的开发
服务器级静态模式(所有会话使用特定工具集):
# 环境变量方法
FMP_TOOL_SETS=search,company,quotes FMP_ACCESS_TOKEN=your_api_key npm run dev
# CLI参数方法(优先级更高)
npm run dev -- --fmp-token=your_api_key --fmp-tool-sets=search,company,quotes
服务器级动态模式(所有会话从元工具开始):
# 环境变量方法
DYNAMIC_TOOL_DISCOVERY=true FMP_ACCESS_TOKEN=your_api_key npm run dev
# CLI参数方法(优先级更高)
npm run dev -- --fmp-token=your_api_key --dynamic-tool-discovery
会话级配置(默认 - 无服务器强制):
# 启动服务器而不进行模式强制
npm run dev -- --fmp-token=your_api_key
# 各个会话可以通过HTTP请求指定自己的配置
测试不同配置
开发时,你可以测试不同的配置场景:
- 测试会话级配置:
# 启动服务器而不进行强制
npm run dev -- --fmp-token=your_api_key
# 测试动态模式会话
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" -d '...'
# 测试静态模式会话
CONFIG_BASE64=$(echo -n '{"FMP_TOOL_SETS":"search,quotes"}' | base64)
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" -d '...'
- 测试服务器级强制:
# 以服务器级动态模式,启动
npm run dev -- --fmp-token=your_api_key --dynamic-tool-discovery
# 所有会话将使用动态模式,无论会话配置如何
curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" -d '...'
运行测试
项目使用Vitest进行测试。你可以通过以下几种方式运行测试:
# 在监视模式下运行测试(用于开发)
npm test
# 运行一次测试
npm run test:run
# 运行测试并生成覆盖率报告
npm run test:coverage
覆盖率报告将在coverage/目录中生成,并在终端中显示。你可以在浏览器中打开coverage/index.html查看详细的HTML覆盖率报告。
问题和错误报告
如果你遇到任何错误、有功能请求或需要项目帮助,请在GitHub上打开一个问题: 📝 打开问题
报告问题时,请包括:
- 问题或功能请求的清晰描述
- 重现问题的步骤(如果适用)
- 你的环境详细信息(Node.js版本、操作系统)
- 任何相关的错误消息或日志
- 预期行为与实际行为
这有助于我们更快地理解和解决问题。
🔧 技术细节
服务器架构技术细节
此MCP服务器采用基于状态会话的架构,由Smithery SDK提供支持,用于管理请求和会话的生命周期。资源重用通过客户端级缓存实现,该缓存以clientId(从访问令牌派生)为键。
客户端级缓存
每个clientId对应一个McpServer和DynamicToolsetManager实例。对于无令牌的请求,使用每个请求的匿名ID,且不会进行资源重用。
会话隔离
会话由SDK管理,但缓存机制不依赖于sessionId。这确保了会话之间的独立性,避免了会话数据的相互干扰。
状态管理
会话在多个请求之间保持其状态,使得服务器能够处理复杂的业务逻辑。例如,在进行一系列的金融数据查询时,会话可以记住之前的查询条件和上下文信息。
模式强制
服务器级配置可以覆盖会话级设置,确保所有会话遵循统一的规则。例如,当服务器设置为动态模式时,所有会话都将使用动态模式,无论其会话级配置如何。
基于HTTP的协议
服务器通过HTTP协议与客户端进行通信,使用JSON-RPC格式的消息。这种标准化的协议使得服务器与客户端之间的通信更加稳定和可靠。
动态工具管理
工具可以在运行时根据会话的需求进行加载和卸载。这为服务器提供了更高的灵活性,能够根据不同的业务场景动态调整工具集。
请求流程
- 客户端请求:客户端通过HTTP POST请求将请求发送到
/mcp端点。 - 会话管理:服务器根据配置创建或检索会话,缓存和重用机制以
clientId为键。 - 模式解析:服务器根据配置确定操作模式,如动态模式、静态模式或传统模式。
- 工具注册:根据解析的模式,加载特定于会话的工具。
- 请求处理:使用可用的工具处理MCP请求。
- 响应:服务器将处理结果以JSON-RPC格式的响应发送回客户端。
配置与模式强制技术细节
服务器支持多种配置方法,包括CLI参数、环境变量和会话配置。这些配置方法具有明确的优先级层次结构,以确保服务器的行为可预测。
服务器模式
服务器可以在三种模式下运行:动态模式、静态模式和传统模式。
动态模式
当DYNAMIC_TOOL_DISCOVERY设置为true时,服务器进入动态模式。在这种模式下,服务器仅初始化3个元工具:enable_toolset、disable_toolset和get_toolset_status。工具可以在运行时根据需要通过元工具调用进行加载和卸载。这种模式适用于工具需求变化频繁的场景,提供了最大的灵活性。
静态模式
通过设置FMP_TOOL_SETS参数,服务器可以进入静态模式。在静态模式下,服务器在会话创建时预加载指定的工具集。所有指定的工具在会话开始时立即可用,适用于工具需求固定的场景。
传统模式
如果没有设置特定的配置,服务器将默认进入传统模式。在传统模式下,服务器在会话创建时加载所有253+个工具,提供了最大的功能覆盖,但可能会影响性能。
配置优先级
服务器在确定操作模式时,遵循严格的优先级层次结构:CLI参数 > 环境变量 > 会话配置。这确保了服务器级配置能够覆盖会话级配置,保证了所有会话的一致性。
配置警告
- 服务器级模式具有全局性,会影响服务器上的所有会话。
- 当服务器级模式激活时,会话级配置将被忽略。
- 不允许在不同会话中混合使用不同的模式。
- 更改服务器级配置需要重启服务器。
选择性工具加载技术细节
为了优化性能,服务器支持选择性工具加载。用户可以指定要加载的工具类别,而不是一次性加载所有253个工具。
可用工具集
服务器提供了多个工具集,包括搜索工具、公司信息工具、报价工具等。每个工具集包含一组相关的工具,用于满足不同的业务需求。
工具集过滤
MCP客户端可以自动过滤工具,但对于大型工具集,这可能会影响性能。通过选择性工具加载,用户可以根据实际需求选择加载的工具集,减少不必要的资源消耗。
动态工具集管理技术细节
动态工具集管理是服务器的一个重要特性,允许在运行时动态加载和卸载工具。
工作原理
当启用动态工具集管理时,每个会话从3个元工具开始:enable_toolset、disable_toolset和get_toolset_status。AI助手可以使用这些元工具在会话中根据不同的任务动态加载和卸载特定的工具类别。
配置选项
动态工具集管理可以通过服务器级配置或会话级配置启用。
服务器级配置
可以通过命令行参数、环境变量或Docker配置来启用服务器级动态工具集管理。这将影响服务器上的所有会话。
会话级配置
当没有设置服务器级动态模式时,各个会话可以通过HTTP请求的查询参数请求动态模式。
示例工作流
以下是一个动态工具集管理的示例工作流:
- 以动态模式启动服务器。
- AI助手初始化会话并获取元工具。
- AI助手根据任务需求启用所需的工具集。
- AI助手使用启用的工具完成任务。
- AI助手可以根据需要禁用未使用的工具集,以释放资源。
好处
动态工具集管理提供了更高的性能、灵活性和资源效率。每个会话可以根据实际需求动态调整工具集,减少了初始加载时间和内存使用。
发起HTTP请求技术细节
服务器通过/mcp端点接受JSON-RPC格式的HTTP请求。每个请求可以包含可选的会话配置,通过查询参数传递。
端点格式
请求的端点格式为POST http://localhost:8080/mcp[?config=BASE64_ENCODED_CONFIG]。其中,config参数是Base64编码的JSON配置。
必需的请求头
请求必须包含Content-Type: application/json和Accept: application/json, text/event-stream头,以确保请求和响应的格式正确。
会话配置
会话配置以Base64编码的JSON形式作为config查询参数传递。这允许每个会话有不同的工具配置,当没有服务器级模式强制时,提供了更大的灵活性。
会话和客户端行为
- 会话持久性:每个唯一的
config参数创建一个单独的会话,由SDK管理。 - 工具状态:在动态模式下,启用/禁用的工具集可能会在相同的
clientId的请求中重用。 - 隔离性:会话之间不会相互干扰工具配置,缓存以
clientId为键。 - 缓存:客户端存储使用LRU + TTL策略,为每个
clientId维护一个McpServer和DynamicToolsetManager实例。
错误处理
服务器提供了详细的错误处理机制,当请求出现问题时,会返回相应的错误信息。常见的错误包括无效配置、工具不可用和缺少必需参数等。
📄 许可证
本项目采用Apache License Version 2.0许可协议。
替代品












