
纸上学来终觉浅,绝知此事要躬行
了解事物最好的方式,就是自己去做些什么。作为一名 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 站 。让我们一起成长,变得更强。我们下次再见~