使用说明
示例OnionApp
示例解决方案,突出显示了构建在洋葱架构todo域之上的轻量级模型上下文协议(MCP)服务器。配套ASP。NET核心最小API作为一种通过HTTP探索相同应用程序服务的方便方式与之配套。
解决方案布局
SampleOnionApp.Domain–聚合根和域逻辑(TodoItem实体)。SampleOnionApp.Application–用例服务、DTO和抽象合同(ITodoService,ITodoRepository,TodoItemRequest).SampleOnionApp.Infrastructure-基础设施问题;包括内存存储库和注册助手。SampleOnionApp.Presentation–ASP。NET核心最小API在下公开REST端点/api/todos(可选伴侣主机)。SampleOnionApp.McpServer–控制台主机通过简单的MCP风格的JSON-RPC循环公开相同的功能(项目重点)。
表示层仅依赖于应用层和基础设施注册,而web API和MCP服务器都通过依赖项注入来解析应用程序服务。
先决条件
- .NET SDK 8.0+
- 只有当您打算添加外部NuGet包时,才需要网络访问。当前的代码库构建没有第三方包还原。
运行MCP服务器
dotnet run --project src/SampleOnionApp.McpServer
服务器在STDIN上监听换行符分隔的JSON-RPC 2.0请求,并在STDOUT上发出响应。一个小小的握手看起来像:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize"}' \
'{"jsonrpc":"2.0","id":2,"method":"call_tool","params":{"name":"todos_create","arguments":{"title":"Draft docs","description":"Outline MCP support"}}}' \
'{"jsonrpc":"2.0","id":3,"method":"call_tool","params":{"name":"todos_list"}}' \
| dotnet run --project src/SampleOnionApp.McpServer
支持的方法:
initializecall_tool具有以下工具名称:todos_listtodos_gettodos_createtodos_create_rangetodos_updatetodos_completetodos_deletetodos_delete_all
备注
该实现有意保持传输的简单性,以便于学习:它接受换行符分隔的JSON,而不是完整的MCP帧头。在中调整设置src/SampleOnionApp.McpServer/Program.cs如果你需要字节精确的合规性。
使用Codex CLI注册MCP服务器
辅助脚本 scripts/run-mcp-server.sh 包装服务器启动。向食品法典委员会提供:
codex mcp add sample-onion-todos ./scripts/run-mcp-server.sh
之后, codex mcp list 将显示条目。您可以通过启动Codex并选择 sample-onion-todos 服务器在收到提示时(或在通常可用时使用相关CLI标志)。
运行web API(可选配套主机)
dotnet run --project src/SampleOnionApp.Presentation
运行后,使用任何HTTP客户端练习端点:
GET /api/todos?filter=read–列出所有项目(可选择按标题/描述文本过滤)。GET /api/todos/{id}–检索单个项目。POST /api/todos–创建项目({ "title": "Read spec", "description": "Model Context Protocol" }).POST /api/todos/bulk–在一次调用中创建多个项目(忽略标题为空的条目)。PUT /api/todos/{id}–更新标题/描述。POST /api/todos/{id}/complete标记为完成。DELETE /api/todos/{id}?confirm=true–删除一个项目(需要明确的confirm=true信号)。DELETE /api/todos?confirm=true–删除每个项目并返回删除的数字。
下一步
- 将内存中的存储库与持久数据存储交换。
- 强化MCP传输,以遵守官方帧协议(内容长度标头、心跳等)。
- 围绕应用程序服务和JSON-RPC处理程序添加单元测试。
