NimCP-Nim中的简单模型上下文协议(MCP)服务器
NimCP 是一个基于宏的库,用于创建 模型上下文协议(MCP) Nim中的服务器。它利用Nim的宏系统,为构建与LLM应用程序无缝集成的MCP服务器提供了令人难以置信的易于使用的API。
注意:此库的99.9%是使用Claude Code编写的!
特性
- 宏观驱动API -使用简单的声明性语法定义服务器、工具、资源和提示
- 完全支持MCP 2024-11-05 -使用JSON-RPC 2.0完全实现MCP规范
- 多个传输 -支持stdio、SSE、HTTP和WebSocket传输
- 增强型系统 -支持对象、联合、枚举、可选类型和数组
- 自动模式生成 -从Nim类型签名生成的JSON模式
- 请求上下文系统 -进度跟踪、取消和请求生命周期管理
- 资源URI模板 -具有参数提取的动态URI模式(
/users/{id}) - 服务器组成 -使用前缀和路由将多个MCP服务器组合到一个接口中
- 可堵塞测井 -灵活的日志记录系统,具有多个处理程序、级别和结构化输出
- 中间件管道 -请求/响应转换和处理挂钩
- 流利的API -用于优雅服务器配置的方法链模式
- 高性能 -基于Mummy的HTTP和WebSockets实现
- 并发处理 -使用新的任务池库进行stdio传输
- 最小依赖性 -仅使用必要的、维护良好的软件包
快速开始
安装
nimble install nimcp简单的例子
import nimcp
import strformat
let server = mcpServer("my-server", "1.0.0"):
mcpTool:
proc echo(text: string): string =
## Echo back the input text
return "Echo: " & text
mcpTool:
proc add(a: float, b: float): string =
## Add two numbers together
return $fmt"Result: {a + b}"
when isMainModule:
# Use stdio transport (default):
let transport = newStdioTransport()
transport.serve(server)
# Or use HTTP transport:
# let transport = newMummyTransport(8080, "127.0.0.1")
# transport.serve(server)
# Or use WebSocket transport for real-time communication:
# let transport = newWebSocketTransport(8080, "127.0.0.1")
# transport.serve(server)就是这样!您的MCP服务器已准备好运行。
核心概念
工具
工具是LLM应用程序可以调用的函数。用以下方式定义它们 mcpTool 宏,从您的 程序签名和文件注释:
mcpTool:
proc calculate(expression: string): string =
## Perform mathematical calculations
## - expression: Mathematical expression to evaluate
# Your calculation logic here
return "Result: 42"上下文感知与常规工具
NimCP还支持上下文感知工具,这些工具还可以接收服务器上下文以访问服务器状态和请求信息:
# Context aware tools need to have first parameter being an McpRequestContext
mcpTool:
proc notifyTool(ctx: McpRequestContext, args: JsonNode): McpToolResult =
## Log request and track processing
ctx.info("Processing notification request")
# Your notification logic here
let message = args.getOrDefault("message", %"").getStr()
ctx.info("Notification processing complete")
return McpToolResult(content: @[createTextContent("Notification: " & message)])何时使用上下文感知工具:
- 服务器发起的事件
- 访问服务器配置或传输特定功能
- 自定义日志记录或中间件集成
- 请求特定状态管理
手动注册方法:
server.registerTool(tool, handler)-常规工具server.registerToolWithContext(tool, handler)-上下文感知工具- 同样的模式适用于资源和提示
资源
资源提供LLM应用程序可以读取的数据:
mcpResource("data://config", "Configuration", "Application configuration"):
proc get_config(uri: string): string =
return readFile("config.json")提示
提示是LLM交互的可重用模板:
mcpPrompt("code_review", "Code review prompt", @[
McpPromptArgument(name: "language", description: some("Programming language")),
McpPromptArgument(name: "code", description: some("Code to review"))
]):
proc review_prompt(name: string, args: Table[string, JsonNode]): seq[McpPromptMessage] =
let language = args.getOrDefault("language", %"unknown").getStr()
let code = args.getOrDefault("code", %"").getStr()
return @[
McpPromptMessage(
role: System,
content: createTextContent(&"Review this {language} code for best practices and potential issues.")
),
McpPromptMessage(
role: User,
content: createTextContent(code)
)
]手动创建服务器
为了更好地控制,您可以手动创建服务器:
import nimcp
let server = newMcpServer("advanced-server", "2.0.0")
# Register tools manually
let tool = McpTool(
name: "custom_tool",
description: some("A custom tool"),
inputSchema: %*{"type": "object"}
)
proc customHandler(args: JsonNode): McpToolResult =
return McpToolResult(content: @[createTextContent("Custom result")])
server.registerTool(tool, customHandler)
# Run the server
try:
let transport = newStdioTransport()
transport.serve(server)
finally:
server.shutdown()服务器组成
NimCP支持将多个服务器组成一个接口,非常适合API网关:
import nimcp, nimcp/composed_server
# Create individual servers using macro API
let calculatorServer = mcpServer("calculator-service", "1.0.0"):
mcpTool:
proc add(a: float, b: float): string =
## Add two numbers together
return fmt"Result: {a + b}"
let fileServer = mcpServer("file-service", "1.0.0"):
mcpTool:
proc readFile(path: string): string =
## Read contents of a file
try:
return readFile(path)
except IOError as e:
return fmt"Error reading file: {e.msg}"
# Compose them into a single gateway
let apiGateway = newComposedServer("api-gateway", "1.0.0")
# Mount each service with prefixes for namespacing
apiGateway.mountServerAt("/calc", calculatorServer, some("calc_"))
apiGateway.mountServerAt("/files", fileServer, some("file_"))
# Run the composed server
let transport = newStdioTransport()
transport.serve(apiGateway)
# Tools are now available as: calc_add, file_readFile错误处理
NimCP会自动处理JSON-RPC错误,但您可以在处理程序中抛出异常:
mcpTool:
proc validate(data: string): string =
## Validate input data
if data.len == 0:
raise newException(ValueError, "Empty data parameter")
return "Valid!"例子
看看 examples/ 有关综合示例的目录,请参阅 示例README 了解更多信息。
仅从命令行,您就可以使用以下示例测试和列出工具:
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | ./examples/calculator_server如果您使用的是Claude Code,以下是将其添加为MCP服务器的方法:
- 将MCP服务器添加到Claude代码中:
claude mcp add basic_calculator --transport stdio $PWD/examples/basic_calculator- 验证是否已添加:
claude mcp list- 在Claude Code中测试服务器:
添加后,您应该能够在Claude Code对话中直接使用计算器工具:
- add:将两个数字相加
- 乘法:将两个数字相乘
- 幂:计算指数
- math://constants:访问数学常量资源
Claude Code中的示例用法:
- “你能给我加15和27吗?”
- “12的幂是3的幂吗?”
- “给我看看数学常数”
如果CLI方法不起作用,您可以手动编辑MCP配置文件(通常位于~/.claude.json)。就 更改路径 到你所拥有的:
{
"mcpServers": {
"calculator_server": {
"type": "stdio",
"command": "/path/to/examples/calculator_server",
"args": [],
"env": {}
}
}
}测试
运行测试套件:
nimble test贡献
欢迎投稿!请随时提交拉取请求。
许可证
MIT许可证。看 许可证 了解详情。
