如何用 Dart 写个自己的MCP服务

纸上学来终觉浅,绝知此事要躬行

了解事物最好的方式,就是自己去做些什么。作为一名 Flutter 开发工程师,当我们谈论 MCP(Model Context Protocol)时,不妨从一个简单的时间服务开始,看看这个协议如何在实际开发中发挥作用。

在 AI 快速发展的今天,我们见证了无数工具的诞生,但它们之间的协作往往充满摩擦。每个工具都有自己的接口规范,AI 需要为每个工具学习不同的"语言"。这种碎片化的现状,正是 MCP 要解决的核心问题。


1.直观体验 MCP 是作用

MCP(Model Context Protocol)本质上是一种标准化的通信协议 ,它定义了 AI 模型与外部工具之间的交互方式。就像 HTTP 协议规范了浏览器与服务器的通信一样,MCP 规范了 AI 与各种服务的对话规则。这里就不说多说那些废话的大道理,直接从实际场景,介绍 MCP 的价值。

比如说,如果没有 MCP 时,让 AI 处理这个内容:

帮我查看一下这篇文章的内容 juejin.cn/post/758800...

就会得到 我无法直接访问外部网站链接来查看文章内容, 明明它有个很强的脑子,但是就像是没有眼睛一样,看不到网页里的东西,岂不可惜。


如果工具一旦接入 browsermcp 的 MCP 服务, 它就能 看见 网页。同理,内置的文件访问、搜索等工具也是类似,这样工具们就可以调度大脑,思考网站、写入文件,让整个流程畅通起来。

如果说 AI 是一个强大的大脑,那么 MCP 就是眼睛、手、脚。让 AI 能看、能做。


2.从时间服务看协议本质

理解 MCP 最好的方式,就是动手写一个服务。我们从最简单的时间服务开始,看看这个协议如何工作。 如果什么都没有的时候,问 AI 现在什么时候, 你将得到一个它自认为的错误时间:

我们本文要做的,是基于 Dart 语言,搭建一个可以理解当前时间的 MCP 服务,让 AI 可以在需要时,调用 Dart 的服务,得到本机的精确时间,如下所示:

项目结构很简单:

python 复制代码
now/
├── bin/
│   └── server.dart          # 主服务器文件
├── pubspec.yaml             # Dart 项目配置
├── mcp-config.json          # MCP 服务配置
└── README.md               # 项目说明

3.协议的三个核心阶段

MCP 服务有明确的生命周期,每个阶段都有特定的职责。

初始化阶段 - 协议握手

dart 复制代码
case 'initialize':
  return {
    'jsonrpc': '2.0',
    'result': {
      'protocolVersion': '2024-11-05',
      'capabilities': {
        'tools': {}  // 声明支持工具调用
      },
      'serverInfo': {
        'name': 'now-server',
        'version': '1.0.0'
      }
    },
    'id': id
  };

这个阶段确保客户端和服务端使用兼容的协议版本,就像两个人见面先确认说的是同一种语言。

工具发现阶段 - 能力声明

dart 复制代码
case 'tools/list':
  return {
    'jsonrpc': '2.0',
    'result': {
      'tools': [
        {
          'name': 'get_current_time',
          'description': 'Get the current date and time',
          'inputSchema': {
            'type': 'object',
            'properties': {
              'format': {
                'type': 'string',
                'description': 'Time format (iso, local, utc)',
                'default': 'iso'
              }
            },
            'additionalProperties': false
          }
        }
      ]
    },
    'id': id
  };

这里用 JSON Schema 描述工具的接口。AI 通过这个描述就知道如何调用工具,不需要额外的文档说明。

工具执行阶段 - 实际工作

dart 复制代码
case 'tools/call':
  final toolName = params['name'] as String?;
  final arguments = params['arguments'] as Map<String, dynamic>? ?? {};

  if (toolName == 'get_current_time') {
    return handleGetCurrentTime(arguments, id);
  }

  return {
    'jsonrpc': '2.0',
    'error': {
      'code': -32601,
      'message': 'Tool not found: $toolName'
    },
    'id': id
  };

4.通信机制的核心

MCP 建立在 JSON-RPC 2.0 之上,基于 stdio 通信。服务器监听 stdin,通过 stdout 响应:

dart 复制代码
void main() {
  stdin
      .transform(utf8.decoder)
      .transform(LineSplitter())
      .listen((line) {
    if (line.trim().isEmpty) return;
    
    try {
      final request = jsonDecode(line);
      final response = handleRequest(request);
      if (response != null) {
        stdout.writeln(jsonEncode(response));
        stdout.flush();
      }
    } catch (e) {
      final errorResponse = {
        'jsonrpc': '2.0',
        'error': {
          'code': -32700,
          'message': 'Parse error'
        },
        'id': null
      };
      stdout.writeln(jsonEncode(errorResponse));
      stdout.flush();
    }
  });
}

这种方式跨平台兼容性好,进程隔离天然安全,调试和测试容易。可以直接运行 dart 项目,输入 {"jsonrpc":"2.0","id":1,"method":"initialize"} 来测试服务是否正常响应:

命令行: dart .\bin\server.dart

输入: {"jsonrpc":"2.0","id":1,"method":"initialize"}

输出: {"jsonrpc":"2.0","result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{}},"serverInfo":{"name":"now-server","version":"1.0.0"}},"id":1}


5.协议设计的智慧

MCP 的设计体现了几个重要的软件工程原则:

约定优于配置 - 统一的协议减少了集成的复杂性
最小惊讶原则 - 协议的每个部分都遵循直觉,没有意外的行为
关注点分离 - 协议层面只关心通信格式,业务逻辑由工具实现者决定

这种标准化的力量,就像建筑行业的标准化螺丝。看起来简单,但却让整个行业的协作变得高效。一个 MCP 服务不是孤立的存在。AI 可以协调使用 MCP 工具,联合处理任务, 比如:

将当前时间写到文章开头

此时 AI 大脑就可以调度获取当前时间的 MCP,然后调度写入文件的能力,完成实际的功能。让一个文章可以自动填入当前时间:


结语

MCP 不仅仅是一个技术协议,它代表了 AI 时代工具集成的新思路。通过标准化的接口,我们能够构建更加开放、可扩展的 AI 生态系统。

对于 Flutter 开发者而言,掌握 MCP 意味着能够为 AI 提供移动端的各种能力,从设备信息获取到本地数据处理,都可以通过这种标准化的方式暴露给 AI 使用。

从这个简单的时间服务开始,我们看到了协议设计的智慧、实现的细节、扩展的可能性。这种从简单到复杂、从具体到抽象的学习路径,正是技术成长的最佳方式。

技术的本质不在于复杂性,而在于解决问题的优雅程度。MCP 用简洁的协议解决了复杂的集成问题,这就是技术的魅力:简单的协议,无限的可能。

当我们站在 AI 时代的门槛上,掌握 MCP 这样的基础协议,就像掌握了一把钥匙,能够打开通往未来的大门。


更多文章和视频知识资讯,大家可以关注我的公众号、掘金和 B 站 。让我们一起成长,变得更强。我们下次再见~

相关推荐
dev1 天前
【flutter】0. 搭建一个多端 flutter 开发环境
flutter·架构·前端框架
shankss1 天前
GetX 状态管理详解
android·flutter·ios
明君879971 天前
Flutter 内存管理深度解析:十年老兵的实战心得
flutter
程序员老刘1 天前
谷歌有没有画饼?Flutter 2025 路线图完成度核验
flutter·客户端
菩提祖师_1 天前
基于Flutter的天气查询APP开发
开发语言·javascript·flutter
2501_946244781 天前
Flutter & OpenHarmony OA系统个人中心组件开发指南
java·javascript·flutter
Rysxt_1 天前
Flutter多端开发原理架构教程
flutter·架构
shankss1 天前
Flutter 项目启动全流程详解
android·flutter·ios
扉页的墨1 天前
2025实测:AI/Vibe Coding救了我的命,也差点废了我的武功
flutter·vibecoding