MCP-server

Finch kan fungeren als een Model Context Protocol (MCP)-server, waardoor AI-tools zoals Claude en Copilot met je applicatie kunnen communiceren.

Installatie

1. Maak een McpServerController aan

import 'package:finch/mcp.dart';

class AppMcpController extends McpServerController {
  @override
  McpBuilder build(McpBuilder mcp) {
    return mcp
      .tool(
        name: 'get_user',
        description: 'Gebruikersinformatie ophalen via ID',
        inputSchema: {
          'type': 'object',
          'properties': {
            'id': {'type': 'integer', 'description': 'Gebruikers-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: 'App-configuratie',
        description: 'Huidige applicatieconfiguratie',
        handler: () async => {
          'version': '1.0.0',
          'env': FinchApp.config.env,
        },
      );
  }
}

2. Route registreren

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

McpBuilder-methoden

Methode Beschrijving
.tool(name, description, inputSchema, handler) Een aanroepbaar hulpmiddel definiëren
.resource(uri, name, description, handler) Een leesbare resource definiëren
.prompt(name, description, handler) Een promptsjabloon definiëren

Ingebouwde JSON-RPC-methoden

Methode Beschrijving
initialize Eerste handshake met MCP-client
tools/list Alle beschikbare tools weergeven
tools/call Een tool aanroepen met parameters
resources/list Alle beschikbare resources weergeven
resources/read Een resource lezen
prompts/list Alle prompts weergeven
prompts/get Een prompt ophalen

Authenticatie

Gebruik AuthMiddleware om het MCP-eindpunt te beveiligen:

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