mORMot2 MCP服务器
实施MCP规范2025-06-18 完全支持通过SSE进行双向通知。
特性
核心
- 纯mORMot2实现 -mORMot2之外没有外部依赖
- 双重运输支持 -stdio和HTTP与SSE
- JSON-RPC 2.0 -使用完全协议支持
TDocVariant - 模块化架构 -易于使用自定义工具、资源和提示进行扩展
- 跨平台 -使用Delphi和Free Pascal编译
MCP能力
- 工具 -使用JSON模式验证注册自定义工具
listChanged通知 - 资源 -基于URI访问的列表、读取、模板和订阅
- 提示 -列出并获取多种内容类型(文本、图像、音频、资源)
- 日志记录 -
setLevel使用RFC 5424日志级别的方法 - 完成 -提示和资源的参数自动完成
传输层
- stdio传输 -JSON-RPC换行符分隔,记录到stderr
- HTTP传输 -支持服务器端事件(SSE)、CORS和TLS的REST API
- 会话管理 -加密会话ID(128位)
- SSE通知 -实时双向通信
- 保持活跃 -可配置的SSE保活(默认30秒)
- 平滑关闭 -SIGTERM/SIGINT处理,超时5秒
- 事件总线 -用于内部通知路由的线程安全发布/订阅
通知
notifications/tools/list_changed-工具注册更改notifications/resources/list_changed-资源更改notifications/resources/updated-已订阅的资源更新notifications/prompts/list_changed-快速更改notifications/message-记录消息notifications/progress-进度更新notifications/cancelled-请求取消
需求
- mORMot2 框架
- Delphi 10.3+(已测试)或Free Pascal 3.2+(尚未测试)
项目结构
mORMot-MCP-Server/
├── MCPServer.dpr # Delphi project
├── MCPServer.lpr # Free Pascal project
├── MCPServer.lpi # Lazarus project
├── src/
│ ├── Core/
│ │ ├── MCP.Manager.Registry.pas # Manager registration
│ │ └── MCP.Events.pas # Event bus (pub/sub)
│ ├── Protocol/
│ │ └── MCP.Types.pas # Core types and settings
│ ├── Transport/
│ │ ├── MCP.Transport.Base.pas # Transport abstraction
│ │ ├── MCP.Transport.Stdio.pas # stdio transport
│ │ └── MCP.Transport.Http.pas # HTTP + SSE transport
│ ├── Server/
│ │ └── MCP.Server.pas # Legacy HTTP server
│ ├── Managers/
│ │ ├── MCP.Manager.Core.pas # initialize, ping
│ │ ├── MCP.Manager.Tools.pas # tools/list, tools/call
│ │ ├── MCP.Manager.Resources.pas # resources/*, subscriptions
│ │ ├── MCP.Manager.Prompts.pas # prompts/list, prompts/get
│ │ ├── MCP.Manager.Logging.pas # logging/setLevel
│ │ └── MCP.Manager.Completion.pas # completion/complete
│ ├── Tools/
│ │ ├── MCP.Tool.Base.pas # Base tool class
│ │ ├── MCP.Tool.Echo.pas # Echo example
│ │ └── MCP.Tool.GetTime.pas # GetTime example
│ ├── Resources/
│ │ └── MCP.Resource.Base.pas # Base resource class
│ └── Prompts/
│ └── MCP.Prompt.Base.pas # Base prompt class建筑
使用Delphi
打开 MCPServer.dproj 在Delphi IDE中。确保配置了mORMot2源路径。
# Or from command line
msbuild MCPServer.dproj /p:Config=Release /p:Platform=Win64免费Pascal/Lazarus
lazbuild MCPServer.lpi用法
stdio传输(适用于克劳德桌面)
MCPServer.exe --transport=stdio在Claude桌面中配置(claude_desktop_config.json):
{
"mcpServers": {
"mormot-server": {
"command": "C:\\path\\to\\MCPServer.exe",
"args": ["--transport=stdio"]
}
}
}HTTP传输(用于web客户端)
# Default port 3000
MCPServer.exe --transport=http
# Custom port
MCPServer.exe --transport=http --port=8080HTTPS/TLS
# Self-signed certificate (development/testing)
MCPServer.exe --transport=http --tls-self-signed
# With certificate files
MCPServer.exe --transport=http --tls --cert=server.crt --key=server.key
# With encrypted private key
MCPServer.exe --transport=http --tls --cert=server.crt --key=server.key --key-password=secretTLS使用mORMot2的原生支持:Windows上的SChannel(没有额外的DLL),Linux上的OpenSSL。
SSE连接
# Open SSE stream for notifications
curl -N -H "Accept: text/event-stream" http://localhost:3000/mcpAPI示例
初始化会话
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Protocol-Version: 2025-06-18" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {"name": "test", "version": "1.0"}
}
}'列出工具
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: " \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'呼叫工具
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: " \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "echo",
"arguments": {"message": "Hello, World!"}
}
}'添加自定义工具
unit MCP.Tool.MyTool;
{$I mormot.defines.inc}
interface
uses
mormot.core.base,
mormot.core.variants,
MCP.Tool.Base;
type
TMCPToolMyTool = class(TMCPToolBase)
protected
function BuildInputSchema: Variant; override;
public
constructor Create; override;
function Execute(const Arguments: Variant): Variant; override;
end;
implementation
constructor TMCPToolMyTool.Create;
begin
inherited;
fName := 'my_tool';
fDescription := 'My custom tool';
end;
function TMCPToolMyTool.BuildInputSchema: Variant;
begin
TDocVariantData(Result).InitFast;
TDocVariantData(Result).S['type'] := 'object';
// Add properties...
end;
function TMCPToolMyTool.Execute(const Arguments: Variant): Variant;
begin
// Return success
Result := ToolResultText('Done!');
// Or return error
// Result := ToolResultText('Error message', True);
end;
end.注册于 MCPServer.dpr:
ToolsManager.RegisterTool(TMCPToolMyTool.Create);配置
中的设置 MCP.Types.pas:
Settings.ServerName := 'mORMot-MCP-Server';
Settings.ServerVersion := '1.0.0';
Settings.Port := 3000;
Settings.Host := '0.0.0.0';
Settings.Endpoint := '/mcp';
Settings.SSEKeepaliveIntervalMs := 30000; // 30 seconds演出
| 特性 | mORMot2 MCP服务器 |
|---|---|
| HTTP服务器 | THttpAsyncServer (异步I/O) |
| JSON | TDocVariant (零拷贝) |
| 内存 | 最小分配 |
| 线程 | 线程池 |
| SSE | 本地实现 |
许可证
MIT许可证-请参阅 许可证 文件。
