astroicers/security-weekly-mcp

GitHub: astroicers/security-weekly-mcp

一个基于 MCP Server 架构的繁体中文资安周报自动化生成系统,整合 32 个国际与台湾安全来源并借助 Claude AI 产出结构化报告。

Stars: 0 | Forks: 1

# Security Weekly MCP MCP Server 架构的资安周报与术语库管理系统,专为台湾资安社群设计。 ## 功能特色 - **32 个资安来源** - 自动收集国际与台湾资安新闻(并行抓取优化) - **两阶段周报架构** - GitHub Actions 保存原始资料,Claude 分析产生高品质报告 - **WebSearch/WebFetch 整合** - 透过 Claude Code 补充 RSS 无法取得的资讯 - **历史周报支援** - 可产生任意时间范围的历史报告 - **术语库整合** - 自动提取并标注资安术语 (437+ 个术语) - **术语审核工具** - 批准/拒绝待审术语的完整工作流程 - **HTML 周报** - 透过 GitHub Pages 发布的线上周报 - **安全审计** - CI 整合 pip-audit 自动检测依赖漏洞 - **健康检查** - 每月自动验证 RSS 来源可用性 ## 快速开始 ### 1. 安装依赖 ``` git clone --recursive https://github.com/your-repo/security-weekly-mcp.git cd security-weekly-mcp uv sync ``` ### 2. 设定 Claude Code MCP 在 `~/.claude/settings.json` 加入: ``` { "mcpServers": { "security-weekly-tw": { "command": "/home/ubuntu/.local/bin/uv", "args": [ "run", "--directory", "/path/to/security-weekly-mcp", "--package", "security-weekly-mcp-server", "python", "-m", "security_weekly_mcp.server" ] } } } ``` ### 3. 产生周报 在 Claude Code 中输入: ``` 產生本週資安週報 ``` ## 周报产生架构 本系统采用**两阶段架构**,解决 RSS 资料挥发性问题: ``` ┌──────────────────────────────────────────────────────────────────────┐ │ 階段 1:自動資料收集 │ │ (GitHub Actions 每週一自動執行) │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ weekly-collect.yml (週一 09:00 UTC+8) │ │ │ │ │ ▼ │ │ collect_weekly_data.py │ │ │ │ │ ├─ fetch_security_news → 32 個 RSS 來源 (並行抓取) │ │ ├─ fetch_vulnerabilities → NVD + CISA KEV │ │ └─ suggest_searches → 搜尋查詢建議 │ │ │ │ │ ▼ │ │ output/raw/YYYY-WNN.json ← Git 自動提交保存 │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────┐ │ 階段 2:智慧報告產生 │ │ (使用者說「產生週報」時執行) │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ load_weekly_data → 載入已保存的原始資料 │ │ │ │ │ ▼ │ │ Claude 分析 + WebSearch 補充 │ │ │ │ │ ├─ 分析新聞趨勢 │ │ ├─ 執行建議搜尋查詢 │ │ ├─ extract_terms → 提取術語 │ │ └─ validate_terminology → 驗證用詞 │ │ │ │ │ ▼ │ │ generate_report_draft → JSON 結構化資料 │ │ │ │ │ ▼ │ │ output/reports/SEC-WEEKLY-YYYY-WW.json │ │ deploy-rss.yml → HTML 頁面發布至 GitHub Pages │ │ │ └──────────────────────────────────────────────────────────────────────┘ ``` ### 方式一:透过 Claude Code (推荐) ``` # 使用已保存的資料產生週報 產生本週資安週報 # 查看可用的週報資料 列出已收集的週報資料 # 產生歷史週報 產生 2026-W05 的週報 ``` ### 方式二:手动资料收集 + 报告产生 ``` # 1. 手動收集資料 (如果 GitHub Actions 未執行) uv run python scripts/collect_weekly_data.py --days 7 # 2. 之後在 Claude Code 中說「產生週報」 ``` ### 历史周报 对于已过期的 RSS 资料,系统会: 1. 使用 `suggest_searches` 产生带时间过滤的搜寻查询 2. 透过 WebSearch 搜寻历史资料 3. 整合结果并产生报告 ## 专案结构 ``` security-weekly-mcp/ ├── packages/ │ ├── glossary/ # 術語庫 (Git Submodule) │ │ ├── src/security_glossary_tw/ │ │ ├── terms/ # 術語 YAML 檔案 (7 個分類) │ │ ├── meta/ # 元資料 (categories, style_guide) │ │ └── pending/ # 待審術語 │ │ │ └── mcp-server/ # MCP Server 套件 │ └── src/security_weekly_mcp/ │ ├── server.py # MCP Server 主程式 │ └── tools/ # MCP 工具模組 │ ├── glossary.py # 術語庫工具 (8 個) │ ├── news.py # 新聞收集工具 (6 個) │ └── report.py # 週報工具 (3 個) │ ├── skill/ # Claude Code Skill │ └── SKILL.md # 自然語言介面定義 │ ├── config/ │ ├── sources.yaml # 32 個資料來源設定 │ ├── search_templates.yaml # WebSearch 查詢模板 │ └── writing_style.yaml # 寫作風格指南 │ ├── scripts/ │ ├── collect_weekly_data.py # 資料收集腳本 (階段 1) │ └── generate_weekly_report.py # 直接產生週報 (傳統模式) │ ├── output/ │ ├── raw/ # 原始資料 (GitHub Actions 自動提交) │ │ └── YYYY-WNN.json # 週報原始資料 │ └── reports/ # 產生的週報 │ └── SEC-WEEKLY-YYYY-WW.md # Markdown 週報 │ └── .github/workflows/ ├── ci.yml # CI 測試 + 安全審計 ├── weekly-collect.yml # 每週一自動收集資料 ├── weekly-reminder.yml # 每週五提醒 Issue └── monthly-health.yml # 每月 RSS 健康檢查 ``` ## MCP 工具清单 (16 个) ### 术语库工具 (8 个) | 工具 | 功能 | 用途 | |------|------|------| | `search_term` | 模糊搜寻术语库 | 查询英/中文化术语 | | `get_term_definition` | 取得完整术语定义 | 深入了解术语 | | `validate_terminology` | 验证用词规范 | 检查禁止用词 | | `add_term_links` | 为文本加术语连结 | Markdown/HTML 输出 | | `list_pending_terms` | 列出待审术语 | 术语审核流程 | | `extract_terms` | 从文本自动提取术语 | 周报产生自动填充 | | `approve_pending_term` | 批准待审术语 | 移至正式术语库 | | `reject_pending_term` | 拒绝待审术语 | 删除待审档案 | ### 新闻收集工具 (6 个) | 工具 | 功能 | 资料来源 | |------|------|----------| | `fetch_security_news` | 收集资安新闻 (并行) | RSS (32 个来源) | | `fetch_vulnerabilities` | 收集漏洞资讯 | NVD + CISA KEV | | `list_news_sources` | 列出新闻来源 | sources.yaml | | `suggest_searches` | 产生搜寻建议 | search_templates.yaml | | `list_weekly_data` | 列出已保存周报资料 | output/raw/ | | `load_weekly_data` | 载入指定周的资料 | output/raw/YYYY-WNN.json | ### 周报工具 (3 个) | 工具 | 功能 | 输出格式 | |--------------------------|--------------------| -------- | | `generate_report_draft` | 产生周报结构化资料 | JSON | | `compile_report_pdf` | 使用 Typst 编译 PDF | PDF | | `list_reports` | 列出已产生的周报 | 清单 | ## 资料来源 (32 个) ### 国际资安新闻 (8 个) | 来源 | 优先级 | 说明 | |------|--------|------| | The Hacker News | high | 最受欢迎的资安新闻 | | Krebs on Security | high | Brian Krebs 调查报导 | | SecurityWeek | medium | 企业资安新闻 | | Dark Reading | medium | 深度资安分析 | | Schneier on Security | high | Bruce Schneier 部落格 | | Infosecurity Magazine | high | 获奖资安媒体 | | CyberScoop | high | 政策与资安新闻 | | BleepingComputer | disabled | Cloudflare 防护 | ### 台湾来源 (5 个) | 来源 | 优先级 | 说明 | |------|--------|------| | iThome 资安 | high | 台湾 IT 媒体 (RSS) | | TWCERT/CC 资安新闻 | critical | 台湾 CERT 资安新闻 (RSS) | | TWCERT/CC 漏洞公告 | critical | 台湾 CERT TVN 漏洞公告 (RSS) | | TechNews 资安 | high | 科技新报资安专区 (RSS) | | 资安人 | medium | 台湾资安媒体 (WebFetch) | ### 官方公告 (4 个) | 来源 | 优先级 | 说明 | |------|--------|------| | CISA Alerts | critical | 美国 CISA 公告 | | CISA KEV | critical | 已知被利用漏洞 | | CERT/CC Vulnerability Notes | high | 卡内基美隆大学 CERT | | CIS MS-ISAC Advisories | high | 网际网路安全中心 | ### 漏洞资料库 (2 个) | 来源 | 优先级 | 说明 | |------|--------|------| | NVD | high | NIST 漏洞资料库 | | GitHub Security Advisories | medium | 开源漏洞 | ### 威胁情报 (12 个) | 来源 | 优先级 | 说明 | |------|--------|------| | Mandiant Blog | high | Google 威胁情报 | | Microsoft Security Blog | high | 微软安全部落格 | | Unit 42 | high | Palo Alto 威胁研究 | | Recorded Future | high | 威胁情报领导者 | | Check Point Research | high | Check Point 研究 | | CrowdStrike Blog | high | CrowdStrike 威胁情报 | | SentinelOne Blog | high | SentinelLabs 研究 | | Securelist (Kaspersky) | high | 卡巴斯基 GReAT | | Sophos Blog | medium | Sophos 威胁研究 | | Google Security Blog | medium | Google 安全部落格 | | WeLiveSecurity (ESET) | medium | ESET 威胁研究 | | Elastic Security Labs | medium | Elastic 安全研究 | ### 厂商公告 (1 个) | 来源 | 优先级 | 说明 | |------|--------|------| | Microsoft MSRC | high | 微软安全回应中心 | ## 开发指令 ``` # 安裝依賴 uv sync # 執行測試 uv run pytest # 執行測試 (跳過慢速網路測試) uv run pytest -m "not slow" # 測試 MCP Server uv run --package security-weekly-mcp-server python -c \ "from security_weekly_mcp.server import app; print(f'MCP Server: {app.name}')" # 啟動 MCP Server (stdio 模式) uv run --package security-weekly-mcp-server python -m security_weekly_mcp.server # 開發模式 (MCP Inspector) uv run --package security-weekly-mcp-server mcp dev \ packages/mcp-server/src/security_weekly_mcp/server.py # 更新術語庫 (Git Submodule) git submodule update --remote packages/glossary # 列出新聞來源 uv run python -c " import asyncio from security_weekly_mcp.tools import news result = asyncio.run(news.call_tool('list_news_sources', {})) print(result[0].text) " ``` ## 术语库同步 `packages/glossary/` 是 Git Submodule,指向 [astroicers/security-glossary-tw](https://github.com/astroicers/security-glossary-tw)。 ``` # 初始化 (clone 後) git submodule update --init --recursive # 更新術語庫 git submodule update --remote packages/glossary ``` CI/CD 已设定 `submodules: recursive`,自动处理。 ## GitHub Actions ### CI 测试 (ci.yml) - Python 3.11 / 3.12 矩阵测试 - Ruff 程式码检查 - MCP Server 载入测试 - **pip-audit 安全审计** - 检测依赖套件漏洞 ### 周报资料收集 (weekly-collect.yml) - **每周一 09:00 (台湾时间)** 执行 - 收集 RSS 新闻、NVD/KEV 漏洞 - 保存原始 JSON 至 `output/raw/` - Git 自动提交并推送 - 支援手动触发 (workflow_dispatch) ### 周报提醒 (weekly-reminder.yml) - **每周五 09:00 (台湾时间)** 执行 - 建立 GitHub Issue 提醒产生周报 - 列出本周收集的资料统计 ### RSS 健康检查 (monthly-health.yml) - **每月 1 日** 执行 - 验证所有 RSS 来源可用性 - 产生健康报告至 GitHub Summary ## LINE Notify 整合 当周报部署到 GitHub Pages 时,自动发送 LINE 通知给订阅者。 ### 设定步骤 1. **建立 LINE Notify 服务** - 前往 [LINE Notify](https://notify-bot.line.me/my/) - 点击“产生权杖” - 选择要接收通知的聊天室(个人或群组) - 复制产生的 Access Token 2. **设定 GitHub Secret** - 前往专案的 Settings > Secrets and variables > Actions - 点击“New repository secret” - Name: `LINE_NOTIFY_TOKEN` - Value: 贴上步骤 1 取得的 Access Token 3. **完成!** 之后每次周报发布时,LINE 会自动收到通知: ``` 📰 台灣資安週報 2026-W08 已發布 本週摘要: • 3 起資安事件 • 5 個高風險漏洞 • 威脅等級:中 閱讀完整報告: https://glossary.astroicers.link/weekly/reports/SEC-WEEKLY-2026-W08.html ``` ### 手动发送测试 ``` # 設定環境變數 export LINE_NOTIFY_TOKEN="your-token-here" # 預覽訊息(不實際發送) uv run python scripts/notify_line.py --latest --dry-run # 發送通知 uv run python scripts/notify_line.py --latest ``` ## 相关专案 | 专案 | 说明 | |------|------| | [security-glossary-tw](https://github.com/astroicers/security-glossary-tw) | 术语库独立仓库 | | [Claude Code Skill](skill/) | 自然语言介面(位于 `skill/` 目录) | ### Claude Code Skill 设定 Skill 已包含在本专案的 `skill/` 目录中,使用 symlink 连结: ``` # 建立 symlink(如果尚未存在) ln -s /path/to/security-weekly-mcp/skill ~/.claude/skills/security-weekly-tw ``` ## 授权 MIT License
标签:AI 內容生成, GitHub Actions, MCP Server, Python, RSS 爬蟲, 无后门, 自动笔记, 自動化報告, 資安週報, 逆向工具