MCP服务器模板

一个用于在V编程语言中创建模型上下文协议(MCP)服务器的模板仓库,提供可扩展的MCP服务器基础架构。

  • by Nexlab-One
  • V
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 Nexlab-One/v-mcp

使用说明

V MCP服务器模板

用于用V编程语言创建模型上下文协议(MCP)服务器的模板存储库。此模板提供了一个干净、最小的基础,您可以扩展它来构建自己的MCP服务器。

概述

此模板包括:

  • JSON-RPC 2.0协议的实现:完成MCP协议处理
  • 模块化架构:关注点的清晰分离(协议、服务器、工具)
  • 工具注册系统:易于扩展工具处理程序注册
  • 配置管理:基于环境变量的配置
  • 生成脚本:适用于Windows和Unix的现成构建脚本
  • 示例工具:示例工具实现以指导您的开发

快速开始

先决条件

入门指南

  1. 使用此模板 创建自己的存储库:

    • 在GitHub上点击“使用此模板”,或
    • 克隆此存储库并删除 .git 目录
  2. 自定义模块名称 在 v.mod:

    Module {
        name: 'your_mcp_server'  // Change this
        description: 'Your MCP server description'
        version: '0.1.0'
        dependencies: []
    }
    
  3. 自定义配置 在 src/server/config.v:

    • 添加特定于服务器的配置字段
    • 更新 from_env() 读取环境变量
  4. 添加您的工具 在 src/tools/tools.v:

    • 实现工具处理程序功能
    • 将它们注册到 register_all()
  5. 构建和测试:

    # Linux/macOS
    ./build.sh
    
    # Windows
    build.bat
    
  6. 运行您的服务器:

    ./mcp-server  # or mcp-server.exe on Windows
    

项目结构

.
├── src/
│   ├── main.v              # Entry point and JSON-RPC message loop
│   ├── mcp/
│   │   └── mcp.v          # JSON-RPC 2.0 protocol implementation
│   ├── server/
│   │   ├── config.v        # Configuration management
│   │   └── server.v        # Server state management
│   └── tools/
│       └── tools.v         # Tool registry and handlers
├── build.sh                # Linux/macOS build script
├── build.bat               # Windows build script
├── v.mod                   # V module definition
└── README.md              # This file

定制指南

1.配置(src/server/config.v)

添加您的服务器特定配置:

pub struct ServerConfig {
pub:
    data_path      string = ''
    cache_ttl_seconds int = 300
    max_results    int = 50
    log_level      string = 'INFO'
}

pub fn from_env() ServerConfig {
    data_path := os.getenv('DATA_PATH')
    // ... your configuration logic
    return ServerConfig{
        data_path: data_path
        // ...
    }
}

2.服务器状态(src/server/server.v)

添加服务器的状态和方法:

pub struct ServerState {
pub mut:
    config ServerConfig
    cache  map[string]CacheEntry
    data   map[string]string
}

pub fn new_server(config ServerConfig) ServerState {
    return ServerState{
        config: config
        cache: map[string]CacheEntry{}
        data: map[string]string{}
    }
}

3.工具(src/tools/tools.v)

实现您的工具处理程序:

fn handle_my_tool(params mcp.JsonAny, mut server_state server.ServerState) string {
    // Extract parameters
    query := mcp.extract_string_param(params, 'query') or {
        return 'Error: Query parameter is required'
    }
    
    // Implement your logic
    result := server_state.process_query(query)
    
    // Return result (markdown format recommended)
    return '# Results\n\n${result}'
}

fn (mut r ToolRegistry) register_all() {
    r.handlers['my_tool'] = handle_my_tool
    // Add more handlers...
}

4.主要入口点(src/main.v)

自定义启动日志记录和初始化:

fn main() {
    config := server.from_env()
    mut server_state := server.new_server(config)
    
    // Add your initialization logic here
    server_state.initialize() or {
        mcp.log('ERROR', 'Failed to initialize: ${err}')
        return
    }
    
    mcp.log('INFO', 'Starting My MCP Server...')
    // ... rest of the loop
}

MCP协议

此模板实现了MCP使用的JSON-RPC 2.0协议。协议模块(src/mcp/mcp.v)手柄:

  • 消息读/写(stdio)
  • 请求/响应解析
  • 错误处理
  • 参数提取实用程序

除非需要自定义传输(HTTP、WebSocket等),否则不需要修改协议实现。

示例工具

该模板包括两个示例工具:

  1. get_info:返回服务器信息
  2. example_tool:创建新工具的模板

用您自己的工具实现替换这些。

测试

通过stdin发送JSON-RPC请求来测试您的服务器:

echo '{"jsonrpc":"2.0","id":1,"method":"get_info","params":{}}' | ./mcp-server

与MCP客户端集成

光标IDE

添加 .cursor/mcp.json:

{
  "mcpServers": {
    "my-server": {
      "command": "/path/to/mcp-server",
      "env": {
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

其他MCP客户端

服务器通过与所有MCP客户端兼容的stdio通过JSON-RPC 2.0进行通信。

最佳实践

  1. 工具命名:使用描述性的、面向行动的名称(例如。, get_data, search_items, process_file)

  2. 错误处理:始终验证参数并返回明确的错误消息

  3. 响应格式:使用Markdown作为工具响应,以便在客户端中实现丰富的格式

  4. 日志记录:使用 mcp.log() 对于重要事件和错误

  5. 配置:使用环境变量进行配置,以保持服务器的灵活性

  6. 状态管理:将服务器状态保持在 ServerState 如有需要,确保其线程安全

扩展模板

添加缓存

pub struct CacheEntry {
    data      string
    timestamp int
}

pub fn (mut s ServerState) get_cached(key string) ?string {
    entry := s.cache[key] or { return none }
    if time.now().unix - entry.timestamp > s.config.cache_ttl_seconds {
        s.cache.delete(key)
        return none
    }
    return entry.data
}

添加文件操作

pub fn (mut s ServerState) load_data(path string) ! {
    content := os.read_file(path)!
    // Process content...
}

添加搜索功能

pub fn (mut s ServerState) search(query string) []SearchResult {
    // Implement search logic...
    return results
}

许可证

此模板按原样提供。请为您的项目自定义许可证。

贡献

如果你改进了这个模板,可以考虑回馈他人!

资源

示例项目

有关完整示例,请参阅:


幸福大厦! 🚀