一个功能完整的 MCP 服务,支持用户登录/注册和 token 校验。支持多产品隔离,同一用户名可以在不同产品下独立存在。
- 用户登录/注册: 通过用户名、密码和产品名称登录或注册
- Token 校验: 校验 JWT token 的有效性并返回用户信息
- 多产品支持: 不同产品可以有相同的用户名
- 密码加密: 使用 SHA256 加密存储密码
- MySQL 数据库: 使用 MySQL 数据库存储用户数据,支持高并发和数据持久化
- 操作日志: 记录所有登录、注册、校验操作的详细日志
- 数据迁移: 支持从 JSON 文件自动迁移到 MySQL 数据库
npm install login-register-mcpgit clone <repository-url>
cd login-register-mcp
npm install本服务使用 MySQL 数据库存储用户数据。请按照以下步骤配置:
请参考 MySQL 安装配置指南 完成 MySQL 的安装和配置。
复制环境配置文件:
cp .env.example .env编辑 .env 文件,配置数据库连接信息:
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=123456
DB_NAME=login_register_mcp
JWT_SECRET=mcp-login-register-secret-key# 测试数据库连接
node scripts/test-db-connection.js
# 初始化数据库表结构
npm run init-db初始化脚本会自动:
- 创建数据库和表结构
- 迁移现有的 JSON 数据(如果存在)
- 显示迁移结果统计
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"login-register": {
"command": "npx",
"args": ["login-register-mcp"]
}
}
}方法 1: 使用 npx(推荐)
在 Windsurf 的 MCP 配置文件中添加:
{
"mcpServers": {
"login-register": {
"command": "npx",
"args": ["login-register-mcp"]
}
}
}方法 2: 使用本地路径
如果使用本地开发版本,配置为:
{
"mcpServers": {
"login-register": {
"command": "node",
"args": ["/Users/hrtps/workSpace/ai-demo/mcp/loginRegister-mcp/src/index.js"]
}
}
}方法 3: 使用全局安装
# 全局安装
npm install -g login-register-mcp
# 然后配置
{
"mcpServers": {
"login-register": {
"command": "login-register-mcp"
}
}
}配置完成后重启 Windsurf,然后就可以在对话中使用 MCP 工具:
-
登录/注册用户:
@login-register 请帮我用用户名 "admin" 密码 "123456" 产品名 "myapp" 登录 -
校验 token:
@login-register 请校验这个 token: "eyJhbGciOiJIUzI1NiIs..." -
查看可用工具:
@login-register 有哪些可用的工具?
import { login, verifyToken } from 'login-register-mcp/client';
// 登录/注册
const result = await login('username', 'password', 'myapp');
console.log(result);
// {
// token: "eyJhbGciOiJIUzI1NiIs...",
// userId: "uuid",
// username: "username",
// product: "myapp",
// isNewUser: true,
// message: "新用户已创建并返回token"
// }
// 校验 token
const verification = await verifyToken(result.token);
console.log(verification);
// {
// valid: true,
// userId: "uuid",
// username: "username",
// product: "myapp",
// createdAt: "2026-03-06T09:44:36.558Z",
// tokenExp: "2026-03-13T09:44:36.000Z",
// tokenIat: "2026-03-06T09:44:36.000Z"
// }import { LoginRegisterClient } from 'login-register-mcp/client';
const client = new LoginRegisterClient();
await client.connect();
// 多次调用
const user1 = await client.login('user1', 'pass1', 'app1');
const user2 = await client.login('user2', 'pass2', 'app1');
const verify1 = await client.verifyToken(user1.token);
const verify2 = await client.verifyToken(user2.token);
await client.disconnect();import express from 'express';
import { login, verifyToken } from 'login-register-mcp/client';
const app = express();
app.use(express.json());
// 登录接口
app.post('/api/auth/login', async (req, res) => {
try {
const { username, password, product } = req.body;
const result = await login(username, password, product);
res.json({ success: true, data: result });
} catch (error) {
res.status(401).json({ success: false, message: error.message });
}
});
// Token 校验中间件
async function authMiddleware(req, res, next) {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({ message: '缺少 token' });
}
const result = await verifyToken(token);
if (result.valid) {
req.user = result;
next();
} else {
res.status(401).json({ message: result.error });
}
}
app.listen(3000);import { getTokenByUsername, verifyToken } from 'login-register-mcp/service';
// 直接调用服务函数(同进程内)
const result = getTokenByUsername('username', 'password', 'product');
const verification = verifyToken(result.token);参数:
username(string, 必填): 用户名password(string, 必填): 密码product(string, 必填): 产品/业务名称
返回:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": "uuid",
"username": "用户名",
"product": "产品名称",
"isNewUser": true,
"message": "新用户已创建并返回token"
}参数:
token(string, 必填): JWT token
返回:
{
"valid": true,
"userId": "uuid",
"username": "用户名",
"product": "产品名称",
"createdAt": "2026-03-06T09:44:36.558Z",
"tokenExp": "2026-03-13T09:44:36.000Z",
"tokenIat": "2026-03-06T09:44:36.000Z"
}JWT_SECRET: JWT 签名密钥(可选,默认使用内置密钥)
用户数据存储在 MySQL 数据库中,包含以下表结构:
CREATE TABLE `users` (
`id` VARCHAR(36) NOT NULL PRIMARY KEY COMMENT '用户唯一标识符 (UUID)',
`username` VARCHAR(100) NOT NULL COMMENT '用户名',
`password` VARCHAR(64) NOT NULL COMMENT 'SHA256加密后的密码',
`product` VARCHAR(100) NOT NULL COMMENT '产品/业务名称',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`status` TINYINT(1) DEFAULT 1 COMMENT '用户状态: 1-正常, 0-禁用',
UNIQUE KEY `uk_username_product` (`username`, `product`),
KEY `idx_username` (`username`),
KEY `idx_product` (`product`),
KEY `idx_created_at` (`created_at`)
);CREATE TABLE `login_logs` (
`id` BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID',
`user_id` VARCHAR(36) NOT NULL COMMENT '用户ID',
`username` VARCHAR(100) NOT NULL COMMENT '用户名',
`product` VARCHAR(100) NOT NULL COMMENT '产品名称',
`action` VARCHAR(20) NOT NULL COMMENT '操作类型: login, register, verify',
`success` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否成功: 1-成功, 0-失败',
`error_message` TEXT DEFAULT NULL COMMENT '错误信息',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
);支持以下环境变量配置:
DB_HOST: 数据库主机地址(默认: localhost)DB_PORT: 数据库端口(默认: 3306)DB_USER: 数据库用户名(默认: root)DB_PASSWORD: 数据库密码(默认: 123456)DB_NAME: 数据库名称(默认: login_register_mcp)JWT_SECRET: JWT 签名密钥(默认: mcp-login-register-secret-key)
查看 examples/ 目录获取更多使用示例:
basic-usage.js- 基本使用示例express-integration.js- Express.js 集成示例
# 自动化测试(推荐)
npm test
# 手动测试登录/注册
node test.js login <用户名> <密码> <产品名称>
# 手动测试 token 校验
node test.js verify <token>
# 测试数据库连接
node scripts/test-db-connection.js
# 初始化/重置数据库
npm run init-db# 基本使用示例
node examples/basic-usage.js
# Express 集成示例
node examples/express-integration.jsMIT
业务代码中想调用 mcp 服务拿到数据,可以通过以下方式调用: