aliyun-bailian-mcp-server
Version:
125 lines (111 loc) • 3.15 kB
JavaScript
/**
* MCP Server Express应用
* 基于阿里云百炼API的MCP服务
*/
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const dotenv = require('dotenv');
const path = require('path');
const MCPServer = require('../lib/mcp-server');
// 加载环境变量
try {
dotenv.config({ path: path.join(__dirname, '../.env') });
} catch (err) {
console.warn('未找到.env文件,将使用环境变量');
}
// 配置
const API_KEY = process.env.API_KEY;
const APP_ID = process.env.APP_ID;
const BASE_URL = process.env.BAILIAN_API_BASE_URL || 'https://dashscope.aliyuncs.com/compatible-mode/v1';
const PORT = process.env.PORT || 8080;
const HOST = process.env.HOST || '0.0.0.0';
// 检查必要的环境变量
if (!API_KEY) {
console.error('错误: 未设置API_KEY环境变量');
process.exit(1);
}
// 创建MCP服务器
const mcpServer = new MCPServer(API_KEY, APP_ID, BASE_URL);
// 创建Express应用
const app = express();
app.use(cors());
app.use(bodyParser.json());
// 健康检查接口
app.get('/health', (req, res) => {
res.status(200).json({ status: 'ok', timestamp: new Date().toISOString() });
});
// MCP Tool列表接口
app.get('/tool/list', (req, res) => {
try {
const tools = mcpServer.listTools();
res.status(200).json({
jsonrpc: '2.0',
result: tools,
id: req.query.id || null
});
} catch (error) {
console.error('获取工具列表失败:', error);
res.status(500).json({
jsonrpc: '2.0',
error: {
code: -32603,
message: '服务器内部错误',
data: error.message
},
id: req.query.id || null
});
}
});
// MCP Tool调用接口
app.post('/tool/call', async (req, res) => {
const { id, method, params } = req.body;
// 检查请求格式
if (!method || !params) {
return res.status(400).json({
jsonrpc: '2.0',
error: {
code: -32600,
message: '无效的请求',
data: 'method和params是必需的'
},
id
});
}
try {
// 从方法名中提取工具名称
// 格式: <tool_name>.call
const toolName = method.split('.')[0];
// 调用工具
const result = await mcpServer.callTool(toolName, params);
// 返回结果
res.status(200).json({
jsonrpc: '2.0',
result: result.result,
id
});
} catch (error) {
console.error('工具调用失败:', error);
res.status(500).json({
jsonrpc: '2.0',
error: {
code: -32603,
message: error.message || '工具调用失败',
data: error.response?.data || null
},
id
});
}
});
// 启动服务器
app.listen(PORT, HOST, () => {
console.log(`MCP服务已启动,监听于 http://${HOST}:${PORT}`);
console.log('可用端点:');
console.log(`- 健康检查: http://${HOST}:${PORT}/health`);
console.log(`- 工具列表: http://${HOST}:${PORT}/tool/list`);
console.log(`- 工具调用: http://${HOST}:${PORT}/tool/call`);
});
// 定时清理过期会话
setInterval(() => {
mcpServer.cleanSessions();
}, 1000 * 60 * 30); // 每30分钟