Skip to content

MCP 设置配置

本指南说明如何使用 mcp_settings.json 文件在 xiaozhi-mcphub 中配置 MCP 服务器、用户认证和小智平台集成。

配置文件概述

xiaozhi-mcphub 使用单一配置文件 mcp_settings.json 管理所有设置:

  • MCP 服务器配置:定义可用的 MCP 服务器
  • 用户认证:管理用户账户和权限
  • 小智平台集成:配置与小智AI平台的连接

基本文件结构

mcp_settings.json

json
{
  "mcpServers": {
    "server-name": {
      "command": "command-to-run",
      "args": ["arg1", "arg2"],
      "env": {
        "ENV_VAR": "value"
      }
    }
  },
  "users": {
    "username": {
      "password": "$2b$10$hashedPassword",
      "isAdmin": true
    }
  },
  "xiaozhi": {
    "enabled": true,
    "webSocketUrl": "wss://api.xiaozhi.ai/ws",
    "reconnect": {
      "maxAttempts": 10,
      "initialDelay": 2000,
      "maxDelay": 60000,
      "backoffMultiplier": 2
    }
  }
}

MCP 服务器配置

基本服务器设置

每个 MCP 服务器需要以下基本配置:

字段类型必需描述
commandstring可执行命令或路径
argsarray命令行参数
envobject环境变量

常用 MCP 服务器示例

Fetch 服务器(HTTP 请求)

json
{
  "mcpServers": {
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    }
  }
}

Playwright 服务器(网页自动化)

json
{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest", "--headless"]
    }
  }
}

高德地图服务器

json
{
  "mcpServers": {
    "amap": {
      "command": "python",
      "args": ["-m", "mcp_amap"],
      "env": {
        "AMAP_MAPS_API_KEY": "${AMAP_MAPS_API_KEY}"
      }
    }
  }
}

Slack 服务器

json
{
  "mcpServers": {
    "slack": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-slack"],
      "env": {
        "SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
        "SLACK_TEAM_ID": "${SLACK_TEAM_ID}"
      }
    }
  }
}

GitHub 服务器

json
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
      }
    }
  }
}

环境变量替换

xiaozhi-mcphub 支持使用 ${VAR_NAME} 语法引用环境变量:

json
{
  "mcpServers": {
    "example": {
      "command": "python",
      "args": ["-m", "example_server"],
      "env": {
        "API_KEY": "${API_KEY}",
        "DEBUG": "${DEBUG}"
      }
    }
  }
}

用户认证配置

用户文件结构

json
{
  "users": {
    "admin": {
      "password": "$2b$10$N9qo8uLOickgx2ZMRZoMye...",
      "isAdmin": true
    },
    "user1": {
      "password": "$2b$10$N9qo8uLOickgx2ZMRZoMye...",
      "isAdmin": false
    }
  }
}

用户字段

字段类型描述
passwordstringbcrypt 加密的密码哈希
isAdminboolean是否为管理员(true=管理员)

创建用户

  1. 生成密码哈希
javascript
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash('your-password', 10);
console.log(hash); // 复制这个哈希值到配置文件
  1. 添加到配置文件
json
{
  "users": {
    "newuser": {
      "password": "$2b$10$generatedHashFromAbove",
      "isAdmin": false
    }
  }
}

小智平台集成配置

基本配置

json
{
  "xiaozhi": {
    "enabled": true,
    "webSocketUrl": "wss://api.xiaozhi.ai/ws",
    "reconnect": {
      "maxAttempts": 10,
      "initialDelay": 2000,
      "maxDelay": 60000,
      "backoffMultiplier": 2
    }
  }
}

配置字段

字段类型默认值描述
enabledbooleantrue是否启用小智平台集成
webSocketUrlstring-小智平台 WebSocket URL
reconnectobject-重连配置(可选)

重连配置

字段类型默认值描述
maxAttemptsnumber10最大重连尝试次数
initialDelaynumber2000初始重连延迟(毫秒)
maxDelaynumber60000最大重连延迟(毫秒)
backoffMultipliernumber2退避倍数

完整配置示例

开发环境配置

json
{
  "mcpServers": {
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    },
    "amap": {
      "command": "python",
      "args": ["-m", "mcp_amap"],
      "env": {
        "AMAP_MAPS_API_KEY": "${AMAP_MAPS_API_KEY}"
      }
    }
  },
  "users": {
    "admin": {
      "password": "$2b$10$N9qo8uLOickgx2ZMRZoMye.IACyqpBXNWHYF8jH.2/RMv7S0A8B3G",
      "isAdmin": true
    },
    "developer": {
      "password": "$2b$10$N9qo8uLOickgx2ZMRZoMye.IACyqpBXNWHYF8jH.2/RMv7S0A8B3G",
      "isAdmin": false
    }
  },
  "xiaozhi": {
    "enabled": true,
    "webSocketUrl": "wss://api-dev.xiaozhi.ai/ws",
    "reconnect": {
      "maxAttempts": 5,
      "initialDelay": 1000,
      "maxDelay": 30000,
      "backoffMultiplier": 2
    }
  }
}

生产环境配置

json
{
  "mcpServers": {
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    },
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest", "--headless"]
    },
    "amap": {
      "command": "python",
      "args": ["-m", "mcp_amap"],
      "env": {
        "AMAP_MAPS_API_KEY": "${AMAP_MAPS_API_KEY}"
      }
    },
    "slack": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-slack"],
      "env": {
        "SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
        "SLACK_TEAM_ID": "${SLACK_TEAM_ID}"
      }
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
      }
    }
  },
  "users": {
    "admin": {
      "password": "$2b$10$secure-hash-for-production",
      "isAdmin": true
    }
  },
  "xiaozhi": {
    "enabled": true,
    "webSocketUrl": "wss://api.xiaozhi.ai/ws",
    "reconnect": {
      "maxAttempts": 10,
      "initialDelay": 2000,
      "maxDelay": 60000,
      "backoffMultiplier": 2
    }
  }
}

配置管理

文件权限

确保配置文件具有适当的权限:

bash
# 设置安全权限
chmod 600 mcp_settings.json
chown $USER:$USER mcp_settings.json

备份配置

bash
# 创建备份
cp mcp_settings.json mcp_settings.json.backup

# 定期备份
tar -czf "mcp_settings_$(date +%Y%m%d_%H%M%S).tar.gz" mcp_settings.json

验证配置

bash
# 验证 JSON 语法
cat mcp_settings.json | jq .

# 检查环境变量
envsubst < mcp_settings.json | jq .

故障排除

常见问题

1. MCP 服务器启动失败

检查命令是否可用:

bash
# 检查 uvx
which uvx

# 检查 npx
which npx

# 检查 python
which python

手动测试命令:

bash
# 测试 fetch 服务器
uvx mcp-server-fetch

# 测试 playwright
npx @playwright/mcp@latest --headless

2. 用户认证失败

验证密码哈希:

javascript
const bcrypt = require('bcrypt');
const isValid = await bcrypt.compare('password', 'stored-hash');
console.log('Password valid:', isValid);

检查用户配置:

bash
cat mcp_settings.json | jq '.users'

3. 小智平台连接失败

检查 WebSocket URL:

bash
# 测试连接
wscat -c "wss://api.xiaozhi.ai/ws"

# 检查环境变量
echo $XIAOZHI_WEBSOCKET_URL

查看连接状态:

bash
curl http://localhost:3000/api/xiaozhi/status

4. 环境变量未找到

检查 .env 文件:

bash
# 查看所有环境变量
printenv | grep -E '(AMAP|SLACK|GITHUB)'

# 验证 .env 文件
cat .env

调试配置

启用调试日志:

bash
DEBUG=mcphub:* pnpm start

配置验证脚本

创建一个简单的验证脚本:

javascript
// validate-config.js
const fs = require('fs');

function validateConfig(configPath = './mcp_settings.json') {
  try {
    const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
    
    // 验证 MCP 服务器
    if (!config.mcpServers) {
      console.error('Missing mcpServers section');
      return false;
    }
    
    for (const [name, server] of Object.entries(config.mcpServers)) {
      if (!server.command || !server.args) {
        console.error(`Server ${name} missing command or args`);
        return false;
      }
    }
    
    // 验证用户
    if (!config.users) {
      console.warn('No users configured');
    }
    
    // 验证小智配置
    if (config.xiaozhi?.enabled && !config.xiaozhi.webSocketUrl) {
      console.error('Xiaozhi enabled but webSocketUrl missing');
      return false;
    }
    
    console.log('Configuration is valid');
    return true;
  } catch (error) {
    console.error('Configuration validation failed:', error.message);
    return false;
  }
}

if (require.main === module) {
  const configPath = process.argv[2] || './mcp_settings.json';
  process.exit(validateConfig(configPath) ? 0 : 1);
}

module.exports = { validateConfig };

使用验证脚本:

bash
node validate-config.js
node validate-config.js /path/to/mcp_settings.json

安全最佳实践

密钥管理

  • 使用环境变量:存储所有 API 密钥和敏感信息
  • 不要硬编码:避免在配置文件中直接写入密钥
  • 定期轮换:定期更新 API 密钥和用户密码

文件安全

  • 限制权限:设置文件权限为 600
  • 定期备份:创建配置文件的安全备份
  • 版本控制:不要将真实配置文件提交到版本控制

网络安全

  • 使用 HTTPS:在生产环境中启用 HTTPS
  • 验证证书:确保 WebSocket 连接使用有效证书
  • 防火墙规则:限制不必要的网络访问

提示

  • 使用 .env.example 作为环境变量模板
  • 为不同环境维护单独的配置文件
  • 定期验证配置文件的正确性
  • 监控服务器状态和连接健康状况

安全提醒

  • 永远不要在配置文件中硬编码密钥
  • 确保 mcp_settings.json 文件权限设置正确
  • 定期审查和更新用户密码
  • 保护小智平台的 WebSocket 连接

这个配置指南涵盖了 xiaozhi-mcphub 的所有核心配置需求,包括 MCP 服务器管理、用户认证和小智平台集成。