MCP 服务器

Finch 可以作为 Model Context Protocol (MCP) 服务器,允许 Claude、Copilot 等 AI 工具与你的应用程序交互。

设置

1. 创建 McpServerController

import 'package:finch/mcp.dart';

class AppMcpController extends McpServerController {
  @override
  McpBuilder build(McpBuilder mcp) {
    return mcp
      .tool(
        name: 'get_user',
        description: '通过 ID 获取用户信息',
        inputSchema: {
          'type': 'object',
          'properties': {
            'id': {'type': 'integer', 'description': '用户 ID'},
          },
          'required': ['id'],
        },
        handler: (params) async {
          var id = params['id'] as int;
          var user = await UserModel().findById(id);
          return {'user': user?.toJson()};
        },
      )
      .resource(
        uri: 'app://config',
        name: '应用配置',
        description: '当前应用配置',
        handler: () async => {
          'version': '1.0.0',
          'env': FinchApp.config.env,
        },
      );
  }
}

2. 注册路由

router.mcp('/mcp', AppMcpController());

McpBuilder 方法

方法 描述
.tool(name, description, inputSchema, handler) 定义可调用的工具
.resource(uri, name, description, handler) 定义可读取的资源
.prompt(name, description, handler) 定义提示模板

内置 JSON-RPC 方法

方法 描述
initialize 与 MCP 客户端的初始握手
tools/list 列出所有可用工具
tools/call 使用参数调用工具
resources/list 列出所有可用资源
resources/read 读取资源
prompts/list 列出所有提示
prompts/get 获取提示

认证

使用 AuthMiddleware 保护 MCP 端点:

router
    .mcp('/mcp', AppMcpController())
    .middleware(ApiKeyMiddleware());
class ApiKeyMiddleware extends Middleware {
  @override
  Future<MiddlewareResult> handle(FinchRequest rq) async {
    var key = rq.headers['x-api-key']?.first ?? '';
    if (key != FinchApp.config.env['MCP_API_KEY']) {
      return MiddlewareResult.stop(
        rq.renderData(data: {'error': 'Unauthorized'}, statusCode: 401),
      );
    }
    return MiddlewareResult.next();
  }
}