使用说明
IT趋势 MCP服务器
概述
此仓库提供了一个模型上下文协议(MCP)服务器,用于收集和分析有关IT服务、技术和趋势受欢迎程度的信号。它通过MCP暴露工具,以获取Reddit讨论、聚合指标并生成报告(HTML/PDF/Excel)。该设计具有可扩展性,可添加自由职业者市场爬虫和趋势搜索器(如Google Trends、GitHub Trending、Stack Overflow)。
建筑学
server.py使用FastMCP构建的MCP服务器,用于注册工具、资源和提示。tools/reddit_analyzer.py使用PRAW获取并分析Reddit帖子;提取技术提及内容和朴素情感分析结果。report_generator.py生成HTML/PDF/Excel格式的报告;使用matplotlib渲染图表。freelance_analyzer.py抓取并解析公开的自由职业市场(如Upwork/Freelancer),并汇总技能需求,同时进行基本费率分析。trends_searcher.py从Google Trends、GitHub趋势和Stack Overflow标签中搜索公开信号;对结果进行标准化并汇总。
utils/cache_manager.py带有TTL(生存时间)的文件/Redis缓存,以及get_or_fetch辅助函数。data_processor.py归一化、增长率、异常检测以及多源聚合辅助工具。api_clients.py外部API客户端(目前为Reddit)的工厂。
templates/report_template.html用于HTML报告的Jinja2模板。
config.yaml服务器、数据源、分析、缓存、数据库和报告的配置。
MCP组件
工具
-
analyze_trends(别名:analyze,trends_analyze)- 输入:
days: int = 7,sources: {"reddit": bool, "freelance": bool, "trends": bool},include_charts: bool,language: str - 输出:
{ "date": "YYYY-MM-DD", "top_trends": list[str], "growth_leaders": list[str], "sources": {..}, "summary": str } - 注:聚合公共信号(Google趋势、GitHub热门趋势、Stack Overflow)并进行每日缓存。
- 输入:
-
search_trends- 输入:
keywords: list[str],timeframe: str = "now 7-d",region: str = "US" - 输出:
{ "date": "YYYY-MM-DD", "inputs": {..}, "sources": { "google_trends": {...}, "github_trending": {...}, "stackoverflow": {...} }, "top_technologies": [{"technology": str, "mentions": float}] }
- 输入:
-
analyze_reddit- 输入:
subreddits: list[str],lookback_days: int,keywords: list[str] - 输出:包含以下内容的JSON
top_technologies(技术,提及次数)、每项技术的情感倾向以及统计数据 - 实现:使用PRAW客户端,从指定的子版块获取最近帖子,提取关键词提及内容,进行简单情感分析,并按提及次数排序
- 输入:
-
analyze_freelance- 输入:
platforms: list[str](以下一项或多项:Upwork、Freelancer、全部),categories: list[str](可选) - 输出:
{ "date": "YYYY-MM-DD", "source": "freelance_markets", "platforms": [...], "top_technologies": [...], "avg_hourly_rate": number, "stats": {...}, "status": "ok|partial|not_available" }
- 输入:
-
generate_report(别名:report_generate,create_report)- 输入:
data: dict,format: str(pdf/电子表格/html),include_charts: bool - 输出:
{ "file_path": "...", "path": "..." }生成的报告文件的路径 - 实现:使用Jinja2模板生成HTML,通过matplotlib生成图表,通过reportlab生成PDF,通过openpyxl处理Excel
- 输入:
-
get_historical_comparison(存根)- 输入:
technology: str,days_back: int - 输出:
{ status: "not_implemented", message: "..." }
- 输入:
资源
cache://trends/{date}– 如果存在,则按日期返回缓存的趋势数据。history://technology/{name}– 如果存在,返回该技术的历史数据(缓存或./data文件)。
提示
analysis_prompt– 系统提示进行分析。forecast_prompt– 预测系统提示。
安装
- 克隆并准备环境
- Python 3.10及以上版本
- 创建并激活虚拟环境
python -m venv .venv - 安装依赖项
pip install -r requirements.txt - 配置环境
- 创建一个
.env在项目根目录中创建文件并设置所需的变量。 - 至少提供Reddit的登录凭据:
REDDIT_CLIENT_IDREDDIT_CLIENT_SECRET
- 可选:
GITHUB_TOKEN,STACKOVERFLOW_KEY,REDIS_URL
- 创建一个
- 评论
config.yaml- 调整子版块、缓存后端、报告输出目录等。
运行MCP服务器
默认情况下, server.py 运行Streamable HTTP传输(通过配置 config.yaml,默认地址为 http://localhost:8080/)。
你也可以使用辅助脚本:
- Windows(操作系统):
run_server.bat - macOS/Linux:
./run_server.sh
直接运行:
python server.py
可用工具(MCP)
-
analyze_trends(别名:analyze,trends_analyze)- 示例调用
result = await mcp_client.call_tool("analyze_trends", { "days": 7, "sources": {"reddit": true, "freelance": true, "trends": true}, "include_charts": true, "language": "en" })
- 示例调用
-
analyze_reddit- 示例调用
result = await mcp_client.call_tool("analyze_reddit", { "subreddits": ["programming", "webdev"], "lookback_days": 7, "keywords": ["python", "javascript", "react"] })
- 示例调用
-
generate_report(别名:report_generate,create_report)- 示例调用
report = await mcp_client.call_tool("generate_report", { "data": result, "format": "html", # or "pdf" / "excel" "include_charts": true }) # Note: Response includes both keys: {"file_path": "...", "path": "..."}
- 示例调用
数据模式
分析趋势结果
{
"date": "YYYY-MM-DD",
"top_trends": ["python", "rust", "kotlin"],
"growth_leaders": ["langchain", "webgpu", "bun"],
"sources": {"reddit": true, "freelance": true, "trends": true},
"summary": "Aggregated technology signals from public sources for the last N days."
}
分析Reddit结果
{
"date": "YYYY-MM-DD",
"subreddits": ["programming", "webdev"],
"lookback_days": 7,
"top_technologies": [
{"technology": "python", "mentions": 123},
{"technology": "javascript", "mentions": 98}
],
"sentiment": {
"python": {"avg_sentiment": 0.42, "mentions": 25},
"javascript": {"avg_sentiment": 0.12, "mentions": 30}
},
"stats": {"posts_analyzed": 300, "unique_tech_count": 20}
}
生成报告结果
{ "file_path": "./reports/report_20250101_120000.html", "path": "./reports/report_20250101_120000.html" }
故障排除
- 缺少Reddit凭据
- 如果Reddit客户端未配置,服务器将优雅地返回空结果。请提供
REDDIT_CLIENT_ID并且REDDIT_CLIENT_SECRET在你的.env。
- 如果Reddit客户端未配置,服务器将优雅地返回空结果。请提供
- SSL/网络错误
- Reddit抓取器具有简单的指数退避重试机制。请检查连接状态或稍后再试。
- 图表不可见
- 确保
matplotlib已安装且可使用非无头后端。报告仍将生成,但不包含图表。
- 确保
- PDF/Excel生成问题
- 如果
reportlab或者openpyxl如果缺失,服务器将回退到HTML生成。
- 如果
- Redis 缓存无法工作
- 验证
REDIS_URL并且确保一个 Redis 服务器正在运行,或者切换cache.storage翻译为:“存档”在config.yaml。
- 验证
获取Reddit API凭证
按照以下步骤创建一个Reddit应用,并获取该项目所需的凭据:
- 使用您的账户登录Reddit。
- 访问 https://www.reddit.com/prefs/apps(或 https://old.reddit.com/prefs/apps)。
- 点击“创建应用”(或“创建另一个应用”)。
- 填写表格:
- 名称:例如,IT趋势MCP
- 应用类型:脚本
- 描述:可选
- 重定向URI:http://localhost:8080(Reddit要求;本项目未使用)
- 应用创建后,复制:
- 客户端ID:应用程序名称下方显示的短字符串(位于“个人使用脚本”旁边)。
- 客户端密钥:标记为“secret”的值。
- 将它们放入你的 .env 文件中:
- REDDIT_CLIENT_ID=你的客户端ID
- REDDIT_CLIENT_SECRET=你的客户端密钥
- REDDIT_USER_AGENT=ITTrendsAnalyzer/1.0 由 <你的Reddit用户名> 提供
- 保存.env文件并重启服务器。
注释:
- 服务器通过PRAW使用只读访问权限;无需用户名/密码或刷新令牌。
- 根据每个Reddit API的规则,使用一个独特且描述性的用户代理。
- API的使用受到速率限制;如果遇到错误,请放慢速度稍后再试。
路线图
- 持久化历史数据并启用
get_historical_comparison - 增加更多自由职业者资源(如Fiverr)并提供更丰富的费率分析
- 在适当的情况下,为GitHub/StackExchange提供OAuth/API集成
- 使用时间序列模型进行预测改进
- 添加测试和持续集成;提供Docker打包
许可证
根据您的项目需求,选择Apache-2.0或类似的许可证。