Geek新闻 每日AI热点新闻
12 March 2026
需求
- 新增微信公众号RSS,微信防爬虫力度非常强,需要做适配。只展示标题、链接即可;
- 其他RSS支持标题、链接、内容简介(基于AI总结);
- 基于MCP搭建,每天定时更新AI最新动态。
方案
flowchart TB
%% Web端
subgraph Web端
A[拉取JSON数据] --> B[页面渲染]
end
%% 应用层
subgraph 应用层
GenNews[定时拉取新闻数据] --> D[保存新闻JSON]
D --> E[刷新缓存]
end
%% MCP服务核心层
subgraph MCP服务
TechNews[并发获取新闻] --> H[时间排序&截取模块]
H --> J[LLM总结精简内容]
end
%% 数据源
subgraph 数据存储
DS1[新闻数据RSS]
DS2[当天新闻JSON文件]
end
LLM[LLM]
%% 链路连接
A --> DS2
GenNews -->|title/img/desc|TechNews
TechNews --> DS1
D --> DS2
J --> LLM
A ~~~ GenNews
E ~~~ DS2
E ~~~ TechNews
MCP 实现
传输方式对比
| 对比维度 | stdio(标准输入输出) | Streamable HTTP(新版官方推荐) | HTTP with SSE(旧版已弃用) |
|---|---|---|---|
| 核心通信机制 | 客户端启动服务器子进程,通过 stdin/stdout 双向传输换行分隔的 JSON-RPC 消息,stderr 用于日志Model Context Protocol | 单一 HTTP 端点同时支持 POST/GET;客户端 POST 发请求,支持同步 JSON 响应或 SSE 流式推送,内置会话管理与断点续传 | 双端点架构:SSE GET 端点建立长连接收服务端消息,HTTP POST 端点发客户端消息,服务端通过 SSE 单向推送结果 |
| 部署模式 | 本地父子进程,仅限同一台机器 | 独立服务进程,支持本地 / 局域网 / 云端跨网络跨机器部署 | 独立服务进程,支持跨网络跨机器部署 |
| 生命周期 | 与客户端进程强绑定,客户端退出则服务器子进程终止 | 服务端独立运行,与客户端完全解耦,支持会话生命周期管理 | 服务端独立运行,与客户端解耦 |
| 多客户端能力 | 不支持,1 个客户端对应 1 个独立服务器进程 | 原生支持多客户端并发连接,可负载均衡 | 支持多客户端连接 |
| 连接恢复能力 | 进程退出即连接终止,无恢复能力 | 原生支持 SSE 流断点续传,通过 Last-Event-ID 重放丢失消息Model Context Protocol | 断连后需重建 SSE 连接,无官方续传机制 |
| 性能表现 | 本地进程间通信,延迟极低(通常 < 1ms),无网络栈开销,资源占用最小 | 受网络带宽 / 延迟影响,长连接模式下延迟可控,支持流式传输优化 | 受网络影响,长连接占用固定资源,断连开销大 |
| 安全性 | 天然安全,不暴露网络端口,无远程攻击面,依赖操作系统进程隔离 | 需自行配置 HTTPS 加密、Origin 校验、身份认证、防火墙策略,有网络暴露风险Model Context Protocol | 同左,需额外的安全加固 |
MCP 切换官方Go SDK
// 服务端
server1 := mcp.NewServer(&mcp.Implementation{Name: "greeter1"}, nil)
mcp.AddTool(server1, &mcp.Tool{Name: "greet1", Description: "say hi"}, SayHi)
handler := mcp.NewStreamableHTTPHandler(func(request *http.Request) *mcp.Server {
return server1
}, nil)
app.Handle("/mcp", http.HandlerFunc(handler.ServeHTTP))
l, err := net.Listen("tcp", ":1031")
if err != nil {
logger.Errorf("Listen: %v", err)
return
}
app.Serve(l)
// 客户端
client := mcp.NewClient(&mcp.Implementation{Name: "mcp-client", Version: "v1.0.0"}, nil)
ctx := context.Background()
transport := &mcp.StreamableClientTransport{Endpoint: "http://localhost:1031/mcp"}
session, err := client.Connect(ctx, transport, nil)
if err != nil {
log.Fatal(err)
}
defer session.Close()
params := &mcp.CallToolParams{
Name: "greet1",
Arguments: map[string]any{"name": "you"},
}
res, err := session.CallTool(ctx, params)
if err != nil {
log.Fatalf("CallTool failed: %v", err)
}
for _, a := range res.Content {
buf, _ := a.MarshalJSON()
fmt.Println(string(buf))
}
原文链接: Geek新闻 每日AI热点新闻 ,转载请注明来源!
– EOF –