  

A. Dart的开发人员友好型MCP(模型上下文协议)框架 随着 注释 和 代码生成.构建MCP服务器就像用注释方法一样简单 @MCPTool, @MCPResource,或 @MCPPrompt -类似于how json_serializable 或 freezed 作品。
✨ 特性
- 🏷️ 基于注解:用简单的注释声明MCP工具、资源和提示
- 🔧 代码生成:使用自动生成样板
build_runner基于扩展的注册 - ✨ 不
@override必需的:没有继承样板的干净方法声明 - 📡 多个传输:支持stdio、HTTP和带有服务器发送事件(SSE)的流式HTTP
- 🔍 类型安全:全飞镖式安全,自动参数提取
- 📚 JSON模式:从方法签名自动生成输入模式
- 🧪 经过全面测试:具有JSON-RPC命令验证的全面测试套件
- ⚡ 生产就绪:使用Relic HTTP服务器完成MCP 2025-06-18协议的实现
- 🌐 现代HTTP:基于Relic框架构建,支持中间件、CORS、日志记录和健康检查
- 🔧 监控:内置健康检查端点和连接监控
- 📊 SSE支持:根据MCP 2025-06-18规范,服务器发送实时流媒体事件
🚀 快速开始
1.添加依赖项
dependencies:
mcp_server_dart: ^1.1.2
relic: ^0.5.0 # Modern HTTP framework
logging: ^1.3.0 # For server logging
dev_dependencies:
build_runner: ^2.4.132.创建您的MCP服务器
import 'package:mcp_server_dart/mcp_server_dart.dart';
part 'my_server.mcp.dart'; // Generated file
class MyMCPServer extends MCPServer {
MyMCPServer() : super(name: 'my-server', version: '1.0.0') {
// Register all generated handlers using the extension
registerGeneratedHandlers();
}
@MCPTool('greet', description: 'Greet someone by name')
Future greet(String name) async {
return 'Hello, $name! 👋';
}
@MCPTool('calculate', description: 'Perform basic arithmetic')
Future calculate(double a, double b, String operation) async {
switch (operation) {
case 'add': return a + b;
case 'subtract': return a - b;
case 'multiply': return a * b;
case 'divide': return b != 0 ? a / b : throw ArgumentError('Division by zero');
default: throw ArgumentError('Unknown operation: $operation');
}
}
@MCPResource('status', description: 'Server status information')
Future> getStatus() async {
return {
'server': name,
'version': version,
'uptime': DateTime.now().toIso8601String(),
'status': 'healthy',
};
}
@MCPPrompt('codeReview', description: 'Generate code review prompts')
String codeReviewPrompt(String code, String language) {
return '''Please review this $language code for:
- Best practices and conventions
- Potential bugs or issues
- Performance improvements
- Security considerations
Code:$code
}
}3.生成代码
dart run build_runner build这会产生 my_server.mcp.dart 具有提供自动注册方法的扩展。
4.运行服务器
import 'dart:io';
import 'package:logging/logging.dart';
void main() async {
// Enable logging to see server activity
Logger.root.level = Level.INFO;
Logger.root.onRecord.listen((record) {
print('${record.level.name}: ${record.time}: ${record.message}');
});
final server = MyMCPServer(); // Handlers auto-registered in constructor
// Choose your transport:
await server.start(); // For CLI integration (stdio)
// OR
await server.serve(port: 8080); // For HTTP server with health checks
}服务器功能:
- 🌐 HTTP服务器:使用Relic框架在指定端口上运行
- 🔍 健康检查:可在
http://localhost:8080/health - 📊 状态端点:服务器指标
http://localhost:8080/status - 📡 MCP端点:可流式传输HTTP
http://localhost:8080/mcp - 📝 请求日志记录:所有记录有定时的HTTP请求
- 🛡️ CORS支持:默认情况下启用跨源请求
- ⚡ 优雅地关闭:正确处理信号情报/信号
- 🔄 SSE流媒体:服务器发送事件以进行实时通信
📖 注释参考
@MCPTool
将方法标记为LLM可以调用的MCP工具:
@MCPTool('toolName', description: 'What this tool does')
Future myTool(ParameterType param) async {
// Implementation
}特征:
- 自动参数提取和类型检查
- 从方法签名生成JSON模式
- 支持默认的可选参数
- 异步和同步方法支持
@MCPResource
将方法标记为提供数据的MCP资源:
@MCPResource('resourceName',
description: 'What this resource contains',
mimeType: 'application/json' // Optional
)
Future> getResource() async {
// Return resource data
}@MCPPrompt
将方法标记为MCP提示模板:
@MCPPrompt('promptName', description: 'What this prompt does')
String generatePrompt(String context, String task) {
return 'Generated prompt based on $context and $task';
}@MCPParam
为参数提供其他元数据:
@MCPTool('example')
Future example(
@MCPParam(description: 'The user name', example: 'John Doe')
String name,
@MCPParam(required: false, description: 'Age in years')
int age = 25,
) async {
return 'Hello $name, age $age';
}🌟 完整示例
请参阅 谷歌地图MCP示例 为了进行全面的演示:
class GoogleMapsMCP extends MCPServer {
GoogleMapsMCP() : super(name: 'google-maps-mcp', version: '1.0.0') {
registerGeneratedHandlers();
}
@MCPTool('searchPlace', description: 'Find places by name or address')
Future> searchPlace(String query, int limit = 5) async {
// Implementation with mock Google Maps API calls
}
@MCPTool('getDirections', description: 'Get directions between two points')
Future> getDirections(
String origin,
String destination,
String mode = 'driving'
) async {
// Implementation
}
@MCPResource('currentLocation', description: 'Current user location')
Future> getCurrentLocation() async {
// Implementation
}
@MCPPrompt('locationSummary', description: 'Generate location summaries')
String locationSummaryPrompt(String location, String summaryType = 'general') {
// Generate contextual prompts
}
}🔧 高级用法
自定义参数验证
@MCPTool('validateEmail')
Future validateEmail(String email) async {
if (!email.contains('@')) {
throw ArgumentError('Invalid email format');
}
// Validation logic
}复杂输入模式
@MCPTool('complexTool', inputSchema: {
'type': 'object',
'properties': {
'config': {
'type': 'object',
'properties': {
'timeout': {'type': 'integer', 'minimum': 1},
'retries': {'type': 'integer', 'maximum': 10}
}
}
}
})
Future complexTool(Map config) async {
// Handle complex nested parameters
}多种运输支持
服务器支持stdio和HTTP传输。您可以扩展上面的基本示例来处理命令行参数:
// Add argument handling to your main() function:
if (args.contains('--stdio')) {
print('🔌 Starting MCP server on stdio...');
await server.start();
} else {
final port = args.contains('--port')
? int.parse(args[args.indexOf('--port') + 1])
: 8080;
print('🌐 Starting HTTP server on port $port...');
print('🔍 Health check: http://localhost:$port/health');
print('📊 Status: http://localhost:$port/status');
print('📡 MCP endpoint: http://localhost:$port/mcp');
await server.serve(port: port);
}运输选项:
- 工作室:非常适合Claude Desktop集成和CLI工具
- 超文本传输协议:非常适合web应用程序、测试和调试 遗迹框架
- 流式HTTP:最新的MCP 2025-06-18规范,支持服务器发送事件
- 健康监测:用于生产监控的内置端点
🌐 可流式HTTP传输(MCP 2025-06-18)
MCP Dart框架现在支持最新的 流式HTTP 运输规范:
主要特点
- 单MCP端点:
POST/GET /mcp处理所有MCP通信 - 服务器发送的事件:服务器发起的消息的实时流式传输
- 会话管理:自动生成和验证会话ID
- 协议头:
MCP-Protocol-Version: 2025-06-18支持 - 安全:用于开发的源验证和本地主机绑定
MCP检验员测试
# Start your server
dart run main.dart --example calculator --http --port 8080
# Test with Inspector CLI
npx @modelcontextprotocol/inspector --cli http://localhost:8080/mcp --transport streamable-http --method tools/list
# Test with Inspector UI
npx @modelcontextprotocol/inspector
# Then connect to: http://localhost:8080/mcp with "Streamable HTTP" transportcURL测试
# Initialize connection
curl -X POST http://localhost:8080/mcp \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'MCP-Protocol-Version: 2025-06-18' \
--data '{"jsonrpc":"2.0","id":"1","method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{}}}'
# List tools
curl -X POST http://localhost:8080/mcp \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'MCP-Protocol-Version: 2025-06-18' \
--data '{"jsonrpc":"2.0","id":"2","method":"tools/list"}'
# Open SSE stream
curl -H 'Accept: text/event-stream' http://localhost:8080/mcp🌐 Relic框架集成
MCP Dart框架使用 遗物 作为其HTTP服务器的基础。Relic是一个受Shelf启发的现代类型安全web服务器框架,但有重大改进:
为什么是Relic?
- 🔒 类型安全:没有了
dynamictypes-所有内容都是强类型的 - ⚡ 演出:用途
Uint8List而不是List为了获得更好的性能 - 🛣️ 高级路由:基于trie的高效路由,具有参数提取功能
- 🔧 现代标题:带验证的类型化标头解析
- 🧪 测试良好:扩展测试覆盖范围和生产就绪
由Relic提供支持的服务器功能
// Your MCP server automatically gets these features:
await server.serve(
port: 8080,
address: InternetAddress.anyIPv4,
enableCors: true, // CORS middleware
keepAliveTimeout: Duration(seconds: 30),
);内置端点:
GET /health-使用服务器指标进行健康检查GET /status-详细的服务器状态和功能POST/GET /mcp-MCP可流式HTTP端点GET /ws-WebSocket升级端点(即将推出)
中间件堆栈:
- 🌐 CORS中间件:跨源请求支持
- 📝 日志中间件:带计时的请求/响应日志记录
- 🛡️ 错误处理:优雅的错误处理和响应
- 🛣️ 路由:自动路线注册和参数提取
有关Relic功能的更多详细信息,请参阅 官方文物文件.
二进制编译用于生产
将MCP服务器编译为本机二进制文件,以获得最佳性能和易于部署:
# Compile to standalone binary
dart compile exe my_server.dart -o mcp-server
# Cross-platform compilation
dart compile exe my_server.dart -o mcp-server-linux --target-os=linux
dart compile exe my_server.dart -o mcp-server-macos --target-os=macos
dart compile exe my_server.dart -o mcp-server.exe --target-os=windows二进制部署的好处:
- ✅ 无需Dart运行时 -独立可执行文件
- ✅ 更快的启动 -无VM开销
- ✅ 易于分发 -单文件部署
- ✅ 生产就绪 -优化性能
Claude桌面配置与二进制文件:
{
"mcpServers": {
"my-server": {
"command": "/path/to/mcp-server"
}
}
}🧪 测试
该框架包括单元和集成测试的全面测试功能。以下是几种方法:
测试HTTP服务器
通过Relic集成,您可以轻松测试MCP服务器的HTTP端点:
import 'dart:convert';
import 'dart:io';
import 'package:test/test.dart';
void main() {
group('MCP Server HTTP Tests', () {
late MyMCPServer server;
late HttpClient client;
setUpAll(() async {
server = MyMCPServer(); // Handlers auto-registered
await server.serve(port: 8081); // Use different port for testing
client = HttpClient();
});
tearDownAll(() async {
await server.shutdown();
client.close();
});
test('health check endpoint works', () async {
final request = await client.get('localhost', 8081, '/health');
final response = await request.close();
expect(response.statusCode, equals(200));
final body = await response.transform(utf8.decoder).join();
final data = jsonDecode(body);
expect(data['status'], equals('healthy'));
expect(data['server'], equals('my-server'));
});
test('MCP endpoint works with Streamable HTTP', () async {
final request = await client.post('localhost', 8081, '/mcp');
request.headers.set('content-type', 'application/json');
request.headers.set('mcp-protocol-version', '2025-06-18');
request.write(jsonEncode({
'jsonrpc': '2.0',
'id': '1',
'method': 'tools/list'
}));
final response = await request.close();
expect(response.statusCode, equals(200));
final body = await response.transform(utf8.decoder).join();
final data = jsonDecode(body);
expect(data['result']['tools'], isA
());
});
});
}单元测试单个方法
import 'package:test/test.dart';
import 'my_server.dart';
void main() {
group('MyMCPServer', () {
late MyMCPServer server;
setUp(() {
server = MyMCPServer(); // Handlers auto-registered
});
test('greet method works directly', () async {
final result = await server.greet('World');
expect(result, equals('Hello, World! 👋'));
});
test('calculate method works', () async {
final result = await server.calculate(10, 5, 'add');
expect(result, equals(15));
});
});
}MCP检验员测试
该框架已经过测试 MCP官方检查员:
# CLI Testing
npx @modelcontextprotocol/inspector --cli http://localhost:8080/mcp --transport streamable-http --method tools/list
# UI Testing
npx @modelcontextprotocol/inspector
# Connect to: http://localhost:8080/mcp with "Streamable HTTP" transport📚 例子
该框架包括几个工作示例:
1. 基本示例
手动注册的简单MCP服务器:
- 你好,世界 (
hello_world.dart):基本问候服务器 - 计算器 (
calculator.dart):数学运算 - ✅ 手动工具注册
- ✅ 资源和及时支持
- ✅ stdio和HTTP模式
2. 高级示例
全面的基于注释的服务器:
- 谷歌地图 (
google_maps.dart):具有多种工具、资源和提示的定位服务 - 气象局 (
weather_service.dart):天气API模拟数据 - ✅
@MCPTool,@MCPResource,@MCPPrompt注释 - ✅ 生成的注册码
- ✅ 复杂参数处理
3. 主流道
统一示例跑步者:
- ✅ 使用命令行选择运行所有示例
- ✅ 支持不同的运输方式
- ✅ 生产就绪部署示例
运行示例
cd example
# Install dependencies
dart pub get
# Generate code for annotation-based examples
dart run build_runner build
# Run main example runner (shows all available examples)
dart run main.dart
# Run specific examples
dart run main.dart --example hello-world
dart run main.dart --example calculator
dart run main.dart --example weather
dart run main.dart --example google-maps
# Run with HTTP server
dart run main.dart --example google-maps --http --port 8080
# Compile examples to binaries
dart compile exe main.dart -o mcp-examples-runner
dart compile exe lib/advanced/google_maps.dart -o google-maps-server
dart compile exe lib/basic/calculator.dart -o calculator-server
# Run compiled binaries
./mcp-examples-runner --example google-maps
./google-maps-server
./calculator-server📋 开发工作流程
- 编写服务器类 延伸
MCPServer - 注释方法 随着
@MCPTool,@MCPResource,或@MCPPrompt - 运行代码生成:
dart run build_runner build - 呼叫
registerGeneratedHandlers()在你的构造函数中 - 选择交通工具 (stdio、HTTP、流式HTTP)并启动服务器
发展观察模式
dart run build_runner watch修改注释时自动重新生成代码。
🚀 生产部署
二进制编译工作流
# 1. Install dependencies and generate code
dart pub get
dart run build_runner build
# 2. Compile to binary
dart compile exe lib/my_server.dart -o dist/mcp-server
# 3. Deploy binary (no Dart runtime needed!)
./dist/mcp-serverDocker部署
# Multi-stage build for minimal production image
FROM dart:stable AS build
WORKDIR /app
COPY . .
RUN dart pub get
RUN dart run build_runner build
RUN dart compile exe lib/server.dart -o mcp-server
# Runtime stage - minimal Alpine image
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=build /app/mcp-server ./
CMD ["./mcp-server"]文件命名灵活性
该框架支持任何文件命名约定:
# Standard Dart files
my_server.dart
# Custom extensions
weather_server.mcp
api_server.tool
# No extension
weather-server
my-mcp-tool
# Executable scripts
#!/usr/bin/env dart对于具有自定义名称的代码生成:
// Keep logic in .dart files for build_runner
// weather_logic.dart
part 'weather_logic.mcp.dart';
class WeatherLogic extends MCPServer { /* ... */ }
// Create wrapper with any name (weather-server, no extension)
import 'weather_logic.dart';
void main() {
final server = WeatherLogic()..registerGeneratedHandlers();
await server.start(); // For CLI integration (stdio)
await server.serve(port: 8080); // For HTTP server with health checks
}🏗️ 框架架构
graph TB
subgraph "👨💻 Your Code"
UserClass["`**MyMCPServer**
@MCPTool('greet')
@MCPResource('data')
@MCPPrompt('help')`"]
end
subgraph "🏗️ MCP Dart Framework"
subgraph "📝 Annotations"
MCPTool["@MCPTool"]
MCPResource["@MCPResource"]
MCPPrompt["@MCPPrompt"]
end
subgraph "⚙️ Code Generation"
Builder["MCP Generator"]
Generated["Generated Extension"]
end
subgraph "🖥️ Core Server"
MCPServer["MCPServer Base Class"]
JSONRPCHandler["JSON-RPC Handler"]
end
subgraph "🚀 Transport"
StdioTransport["Stdio Transport"]
HTTPTransport["HTTP Transport"]
StreamableHTTP["Streamable HTTP + SSE"]
end
end
subgraph "🤖 MCP Clients"
ClaudeDesktop["Claude Desktop"]
MCPInspector["MCP Inspector"]
CustomClient["Custom Client"]
end
UserClass --> MCPTool
UserClass --> MCPResource
UserClass --> MCPPrompt
Builder --> Generated
Generated --> MCPServer
MCPServer --> JSONRPCHandler
JSONRPCHandler --> StdioTransport
JSONRPCHandler --> HTTPTransport
JSONRPCHandler --> StreamableHTTP
StdioTransport --> ClaudeDesktop
HTTPTransport --> MCPInspector
StreamableHTTP --> MCPInspector
StreamableHTTP --> CustomClient🤝 贡献
- 分叉存储库
- 创建特征分支:
git checkout -b feature/amazing-feature - 提交您的更改:
git commit -m 'Add amazing feature' - 推到分支:
git push origin feature/amazing-feature - 打开拉取请求
📄 许可证
此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。
🙏 致谢
📊 项目状态
- ✅ 核心框架:完成MCP 2025-06-18的实施
- ✅ 代码生成:正在工作的build_runner集成
- ✅ 传输层:支持Stdio、HTTP和流式HTTP 遗迹框架
- ✅ HTTP服务器:具有中间件、CORS、日志记录、健康检查的生产就绪服务器
- ✅ 流式HTTP:具有服务器发送事件的完整MCP 2025-06-18规范
- ✅ 二进制编译:使用dart compile exe支持本机可执行文件
- ✅ 测试:具有JSON-RPC和HTTP端点验证的全面测试套件
- ✅ 例子:记录和监控的多个工作示例
- ✅ 生产就绪:经过全面测试的框架,具有优雅的关机功能
- ✅ 部署选项:开发模式、二进制文件、Docker、自定义命名
- ✅ MCP检查员:与官方MCP Inspector UI和CLI完全兼容
