/**
* MCP Internal Cloud Backend
* Cloud Run 後端服務入口
*/
import express from 'express'
import cors from 'cors'
import helmet from 'helmet'
import 'dotenv/config'
import { requestLogger, logger } from './middleware/logging.js'
import { looseRateLimit } from './middleware/rate-limit.js'
import healthRouter from './routes/health.js'
import toolsRouter from './routes/tools.js'
const app = express()
const port = parseInt(process.env.PORT || '8080', 10)
// 基礎 middleware
app.use(helmet())
app.use(cors({
origin: process.env.ALLOWED_ORIGINS?.split(',') || '*',
methods: ['GET', 'POST'],
allowedHeaders: ['Content-Type', 'Authorization'],
}))
app.use(express.json({ limit: '10mb' }))
app.use(requestLogger)
// 健康檢查(不需認證)
app.use('/health', looseRateLimit, healthRouter)
// API 路由
app.use('/api/v1/tools', toolsRouter)
// 根路徑
app.get('/', (_req, res) => {
res.json({
name: 'mcp-internal-backend',
version: process.env.npm_package_version || '1.0.0',
status: 'running',
})
})
// 404 處理
app.use((_req, res) => {
res.status(404).json({
success: false,
error: {
code: 'NOT_FOUND',
message: '找不到請求的資源',
},
})
})
// 錯誤處理
app.use((err: Error, _req: express.Request, res: express.Response, _next: express.NextFunction) => {
logger.error({ error: err.message, stack: err.stack }, '未處理的錯誤')
res.status(500).json({
success: false,
error: {
code: 'INTERNAL_ERROR',
message: process.env.NODE_ENV === 'production' ? '內部伺服器錯誤' : err.message,
},
})
})
// 啟動伺服器
app.listen(port, '0.0.0.0', () => {
logger.info({ port }, 'MCP Internal Cloud Backend 啟動')
console.log(`Server running on port ${port}`)
})