MCP安全事件
这个应用程序爬取安全公告,将其规范化后存储到Supabase中,并使用Next.js生成事件摘要。
先决条件
- Node 18+(Next.js 应用路由器)
- 包含表的Supabase项目:
raw_items,incidents,incident_sources,summaries - 用于应用程序设置的Supabase键值表:
- 默认: settings 带有列 key text primary key, value jsonb - 通过(某种方式)覆盖表名 APP_SETTINGS_TABLE 如需
- Firecrawl 实例(云端或自托管)
数据库迁移
添加/调整以下列,以确保摘要历史记录按预期工作:
-- summaries history (multiple rows per incident)
alter table public.summaries
add column if not exists id uuid primary key default gen_random_uuid(),
add column if not exists provider text,
add column if not exists model text,
add column if not exists fallback_from text,
add column if not exists ran_at timestamptz default now(),
add column if not exists triggered_by text,
add column if not exists created_at timestamptz default now();
alter table public.summaries
drop constraint if exists summaries_incident_id_key;
create index if not exists summaries_incident_ran_at_idx
on public.summaries (incident_id, ran_at desc);
-- incidents cache of last summary metadata
alter table public.incidents
add column if not exists last_summarized_at timestamptz,
add column if not exists last_summary_provider text,
add column if not exists last_summary_model text;可选地回填现有数据:
update public.summaries
set ran_at = coalesce(ran_at, created_at, now())
where ran_at is null;
with latest as (
select distinct on (incident_id)
incident_id,
provider,
model,
ran_at
from public.summaries
order by incident_id, ran_at desc
)
update public.incidents i
set
last_summarized_at = l.ran_at,
last_summary_provider = l.provider,
last_summary_model = l.model
from latest l
where l.incident_id = i.id;环境变量
创建 .env.local 至少包含:
NEXT_PUBLIC_SUPABASE_URL=...
NEXT_PUBLIC_SUPABASE_ANON_KEY=...
SUPABASE_SERVICE_ROLE_KEY=...
NEXT_PUBLIC_BASE_URL=http://localhost:3000
PIPELINE_TOKEN=super-secret-token
FIRECRAWL_API_URL=https://api.firecrawl.dev
FIRECRAWL_API_KEY=fc_xxxx
FIRECRAWL_MCP_COMMAND=npx
FIRECRAWL_MCP_ARGS=["-y","firecrawl-mcp"]
# optional extra env for the MCP process
# FIRECRAWL_MCP_ENV={"NODE_EXTRA_CA_CERTS":"/path/to/cert.pem"}
# optional
FIRECRAWL_TIMEOUT_MS=15000
FIRECRAWL_RETRIES=3
OPENAI_API_KEY=sk-...
OPENAI_SUMMARY_MODEL=gpt-4o-mini # optional override
HUGGINGFACE_API_KEY=hf_xxxx
HUGGINGFACE_MODEL=facebook/bart-large-cnn # optional override
GEMINI_API_KEY=...
GEMINI_SUMMARY_MODEL=gemini-1.5-flash-latest # optional override
REVALIDATE_TOKEN=...
APP_SETTINGS_TABLE=settings # optional override for summarizer preference storage本地运行
npm install
npm run dev管理控制台
- 访问
/admin同时,开发服务器正在运行以触发爬取/总结管道。 - 服务器必须具备
PIPELINE_TOKEN已配置;管理页面使用该令牌调用现有的API路由。 - 可选覆盖:
INTERNAL_BASE_URL如果应用程序部署在代理服务器之后。
安全地触发爬取管道:
curl -XPOST http://localhost:3000/api/pipeline/crawl \
-H "Authorization: Bearer $PIPELINE_TOKEN"Firecrawl 集成
- 现在,爬虫与(服务器/系统)进行交流
firecrawl-mcp通过MCP stdio服务器(npx -y firecrawl-mcp(默认情况下) - 通过以下方式配置MCP二进制文件
FIRECRAWL_MCP_COMMAND,FIRECRAWL_MCP_ARGS,以及FIRECRAWL_MCP_ENV - API凭据/URL从当前环境转发到MCP进程
- 确保您的Firecrawl项目已为以下种子(或初始数据)进行了配置:
app/api/pipeline/crawl/route.ts
摘要
- 这个
/admin控制台现在提供了一个“默认摘要器”卡片,其中包含四个选项:
1. 基于规则的(默认模板) 1. Hugging Face(通过推理API提供的免费层级) 1. OpenAI API 1. Gemini(Google生成式语言API)
- 流水线运行使用所选的提供者;如果API密钥失败或缺失,则自动回退到基于规则的模板。
- 在服务器环境中按照上面所示配置API密钥。没有密钥的情况下,只有基于规则的选项会生成输出。
- 所选的提供商存储在Supabase设置表中(
key = "summarizer_provider")。 - 每个事件都保留完整的总结历史记录。主页会显示事件是否已被总结,以及是由哪位提供者完成的。
/admin现在包含了一个“事件摘要”部分:
- 针对每个事件选择一个提供商并立即运行总结, - 检查过去的运行记录(提供者、模型、时间戳、TL;DR), - 如有必要,请删除单个历史记录条目。
