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_ID - REDDIT_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。
- 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 由 \ 提供
- 保存.env文件并重启服务器。
注释:
- 服务器通过PRAW使用只读访问权限;无需用户名/密码或刷新令牌。
- 根据每个Reddit API的规则,使用一个独特且描述性的用户代理。
- API的使用受到速率限制;如果遇到错误,请放慢速度稍后再试。
路线图
- 持久化历史数据并启用
get_historical_comparison - 增加更多自由职业者资源(如Fiverr)并提供更丰富的费率分析
- 在适当的情况下,为GitHub/StackExchange提供OAuth/API集成
- 使用时间序列模型进行预测改进
- 添加测试和持续集成;提供Docker打包
许可证
根据您的项目需求,选择Apache-2.0或类似的许可证。
