MCP Server

فینچ می‌تواند به عنوان یک سرور Model Context Protocol (MCP) عمل کند، که به ابزارهای هوش مصنوعی مانند Claude و Copilot اجازه می‌دهد با برنامه شما تعامل داشته باشند.

راه‌اندازی

۱. یک 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,
        },
      );
  }
}

۲. Route را ثبت کنید

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

متدهای McpBuilder

متد توضیح
.tool(name, description, inputSchema, handler) یک tool قابل فراخوانی تعریف کنید
.resource(uri, name, description, handler) یک resource قابل خواندن تعریف کنید
.prompt(name, description, handler) یک template prompt تعریف کنید

متدهای داخلی JSON-RPC

متد توضیح
initialize handshake اولیه با MCP client
tools/list لیست تمام tool های موجود
tools/call فراخوانی یک tool با پارامترها
resources/list لیست تمام resource های موجود
resources/read خواندن یک resource
prompts/list لیست تمام prompt ها
prompts/get دریافت یک prompt

احراز هویت

برای محافظت از endpoint MCP، از AuthMiddleware استفاده کنید:

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();
  }
}