import express from 'express';
import cors from 'cors';
import dotenv from 'dotenv';
import { logger } from './utils/logger.js';
import { searchRouter } from './routes/search.js';
import { healthRouter } from './routes/health.js';
// 加载环境变量
dotenv.config();
const app = express();
const PORT = process.env.PORT || 3000;
// 中间件
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// 请求日志中间件
app.use((req, res, next) => {
logger.info(`${req.method} ${req.path}`, {
ip: req.ip,
userAgent: req.get('User-Agent')
});
next();
});
// 路由
app.use('/api/search', searchRouter);
app.use('/api/health', healthRouter);
// 根路径
app.get('/', (req, res) => {
res.json({
name: 'Spider MCP',
version: '1.0.0',
description: 'Web search MCP implementation using pure web scraping',
endpoints: {
search: '/api/search',
health: '/api/health'
}
});
});
// 404处理
app.use('*', (req, res) => {
res.status(404).json({
error: 'Endpoint not found',
path: req.originalUrl
});
});
// 错误处理中间件
app.use((err, req, res, next) => {
logger.error('Unhandled error:', err);
res.status(500).json({
error: 'Internal server error',
message: process.env.NODE_ENV === 'development' ? err.message : 'Something went wrong'
});
});
// 启动服务器
app.listen(PORT, () => {
logger.info(`Spider MCP server running on port ${PORT}`);
logger.info(`Environment: ${process.env.NODE_ENV || 'development'}`);
});
export default app;