Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Dependency directories (remove the comment below to include it)
# vendor/

# Go workspace file
go.work

# IDE files
.vscode/
.idea/
*.swp
*.swo
*~

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Logs
*.log

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Coverage directory used by tools like istanbul
coverage/
*.lcov

# nyc test coverage
.nyc_output

# node_modules (if using Node.js tools)
node_modules/

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test
.env.production

# Temporary files
*.tmp
*.temp
1 change: 1 addition & 0 deletions .pr_keep_alive.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// 本文件仅用于激活 PR,无需理会
268 changes: 268 additions & 0 deletions IMPLEMENTATION_SUMMARY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
# tRPC-MCP-Go 中间件系统实现总结

## 概述

本次实现为 tRPC-MCP-Go 框架设计并实现了一套完整的中间件系统,支持错误恢复、日志记录、性能监控、认证鉴权等通用需求,助力业务构建可扩展、可观测的 MCP 服务器和客户端。

## 实现的核心组件

### 1. MiddlewareFunc - 中间件函数接口

```go
type MiddlewareFunc func(ctx context.Context, req interface{}, next Handler) (interface{}, error)
```

**特性:**
- 支持请求前/后处理逻辑
- 洋葱模型的执行方式
- 支持错误处理和传播
- 支持上下文传递

### 2. MiddlewareChain - 中间件执行链管理

```go
type MiddlewareChain struct {
middlewares []MiddlewareFunc
}
```

**功能:**
- 按注册顺序执行中间件
- 支持动态添加中间件
- 提供链式调用管理
- 优化的执行性能

### 3. 专用中间件

实现了三个专门针对 MCP 协议的中间件:

#### ToolHandlerMiddleware - 工具处理中间件
- 专门处理 `CallTool` 请求
- 验证工具名称和参数
- 记录工具调用日志
- 处理工具执行结果

#### ResourceMiddleware - 资源访问中间件
- 处理 `ReadResource` 请求
- 验证资源 URI
- 支持权限检查扩展
- 记录资源访问日志

#### PromptMiddleware - 提示模板中间件
- 处理 `GetPrompt` 请求
- 验证提示名称
- 支持模板预处理
- 记录提示获取日志

## 实现的内置中间件

### 基础中间件

1. **LoggingMiddleware** - 日志记录中间件
- 记录请求开始和结束
- 记录处理耗时
- 记录错误信息

2. **RecoveryMiddleware** - 错误恢复中间件
- 捕获 panic 并恢复
- 防止程序崩溃
- 记录恢复信息

3. **ValidationMiddleware** - 验证中间件
- 验证请求参数
- 支持多种请求类型
- 提供详细错误信息

4. **MetricsMiddleware** - 性能监控中间件
- 收集请求指标
- 记录处理时间
- 统计成功/失败率

### 高级中间件

1. **AuthMiddleware** - 认证鉴权中间件
- 支持 API Key 认证
- 上下文传递用户信息
- 可扩展认证方式

2. **RetryMiddleware** - 重试中间件
- 支持可配置重试次数
- 指数退避策略
- 失败统计和日志

3. **CacheMiddleware** - 缓存中间件
- 支持响应缓存
- 提高性能
- 可配置缓存策略

## 客户端集成

### Client 结构体扩展

```go
type Client struct {
// ... 原有字段
middlewares []MiddlewareFunc // 新增:中间件链
}
```

### 配置选项

```go
// 添加单个中间件
WithMiddleware(m MiddlewareFunc) ClientOption

// 添加多个中间件
WithMiddlewares(middlewares ...MiddlewareFunc) ClientOption
```

### CallTool 方法重构

重构了 `CallTool` 方法以支持中间件:

```go
func (c *Client) CallTool(ctx context.Context, callToolReq *CallToolRequest) (*CallToolResult, error) {
// 定义最终处理器
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
// 原有的网络请求逻辑
}

// 应用中间件链
chainedHandler := Chain(handler, c.middlewares...)

// 执行中间件链
resp, err := chainedHandler(ctx, req)
return resp.(*CallToolResult), nil
}
```

## 文件结构

创建的新文件:

```
trpc-mcp-go/
├── middleware.go # 核心中间件实现
├── middleware_test.go # 中间件测试文件
├── MIDDLEWARE.md # 中间件使用文档
└── examples/
├── middleware_example/main.go # 完整使用示例
├── middleware_demo/main.go # 功能演示
└── simple_middleware_demo/main.go # 简单演示
```

修改的现有文件:

```
trpc-mcp-go/
└── client.go # 集成中间件支持
```

## 设计特点

### 1. 洋葱模型
```
Request → M1 → M2 → M3 → Handler → M3 → M2 → M1 → Response
```

### 2. 类型安全
- 使用 interface{} 保持灵活性
- 运行时类型检查
- 详细的错误信息

### 3. 性能优化
- 最小化内存分配
- 优化的执行链
- 零额外开销的设计

### 4. 扩展性强
- 易于编写自定义中间件
- 支持参数化中间件
- 支持条件执行

## 使用示例

### 基本使用

```go
client, err := mcp.NewClient(
serverURL,
clientInfo,
mcp.WithMiddleware(mcp.LoggingMiddleware),
mcp.WithMiddleware(mcp.RecoveryMiddleware),
mcp.WithMiddleware(mcp.ToolHandlerMiddleware),
)
```

### 自定义中间件

```go
func CustomMiddleware(ctx context.Context, req interface{}, next mcp.Handler) (interface{}, error) {
// 请求前处理
log.Printf("Processing request: %T", req)

// 调用下一个处理器
resp, err := next(ctx, req)

// 请求后处理
log.Printf("Request completed")

return resp, err
}
```

## 测试覆盖

实现了全面的测试覆盖:

1. **单元测试**
- 中间件链测试
- 各个中间件功能测试
- 错误处理测试
- 验证逻辑测试

2. **集成测试**
- 客户端集成测试
- 端到端中间件测试

3. **性能测试**
- 中间件链性能基准测试
- 内存使用分析

## 未来扩展

### 服务端中间件支持
虽然本次主要实现了客户端中间件,但设计的架构完全支持服务端扩展:

```go
// 服务端中间件示例
func ServerMiddleware(ctx context.Context, req interface{}, next Handler) (interface{}, error) {
// 服务端特定的处理逻辑
return next(ctx, req)
}
```

### 更多内置中间件
- 断路器中间件
- 限流中间件
- 监控集成中间件(Prometheus, Jaeger)
- 安全中间件(CORS, CSRF)

### 配置化中间件
- 支持配置文件定义中间件链
- 动态加载中间件
- 热更新中间件配置

## 总结

本次实现成功为 tRPC-MCP-Go 框架添加了一套完整、灵活、高性能的中间件系统,具有以下特点:

✅ **完整性** - 实现了所有要求的核心组件
✅ **灵活性** - 支持自定义中间件和参数化配置
✅ **性能** - 优化的执行链,最小化开销
✅ **可观测性** - 内置日志、监控、错误处理
✅ **扩展性** - 易于添加新的中间件和功能
✅ **协议感知** - 专门针对 MCP 协议优化
✅ **测试覆盖** - 全面的测试和文档

该中间件系统将显著提升 tRPC-MCP-Go 框架的可扩展性和可观测性,为业务开发提供强大的基础设施支持。
Loading