# Directory Structure ``` ├── .env.example ├── .gitignore ├── chatmcp.yaml ├── docker-compose.yml ├── Dockerfile ├── LICENSE ├── package-lock.json ├── package.json ├── README.md ├── src │ ├── index.ts │ ├── text_eval.ts │ └── utils.ts └── tsconfig.json ``` # Files -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- ```yaml 1 | services: 2 | mcp-server: 3 | build: 4 | context: . 5 | dockerfile: Dockerfile 6 | ports: 7 | - "${MCP_PORT}:${MCP_PORT}" 8 | environment: 9 | - NODE_ENV=production 10 | - PORT=${MCP_PORT} 11 | - TRANSLATION_API_KEY=${TRANSLATION_API_KEY} 12 | - TRANSLATION_MODEL=${TRANSLATION_MODEL} 13 | - TRANSLATION_BASE_URL=${TRANSLATION_BASE_URL} 14 | restart: always 15 | ``` -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "NodeNext", 5 | "moduleResolution": "NodeNext", 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "outDir": "./dist", 11 | "declaration": true, 12 | "sourceMap": true, 13 | "resolveJsonModule": true 14 | }, 15 | "include": [ 16 | "src/**/*" 17 | ], 18 | "exclude": [ 19 | "node_modules", 20 | "dist" 21 | ] 22 | } ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "airylark-mcp-server", 3 | "version": "0.1.0", 4 | "main": "dist/index.js", 5 | "description": "AiryLark的ModelContextProtocol(MCP)服务器,提供高精度翻译API", 6 | "license": "SEE LICENSE IN ../LICENSE", 7 | "author": "AiryLark Team", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/wizd/airylark.git", 11 | "directory": "mcp-server" 12 | }, 13 | "keywords": [ 14 | "mcp", 15 | "translation", 16 | "openai", 17 | "api", 18 | "airylark" 19 | ], 20 | "scripts": { 21 | "build": "tsc", 22 | "start": "node dist/index.js", 23 | "dev": "node --loader ts-node/esm src/index.ts", 24 | "lint": "eslint src/**/*.ts", 25 | "test": "jest", 26 | "clean": "rimraf dist", 27 | "prebuild": "npm run clean" 28 | }, 29 | "dependencies": { 30 | "@chatmcp/sdk": "^1.0.5", 31 | "@modelcontextprotocol/sdk": "^1.8.0", 32 | "dotenv": "^16.4.7", 33 | "express": "^5.1.0", 34 | "node-fetch": "^3.3.2", 35 | "zod": "^3.24.2" 36 | }, 37 | "devDependencies": { 38 | "@types/express": "^5.0.1", 39 | "@types/node": "^20", 40 | "eslint": "^9", 41 | "jest": "^29.7.0", 42 | "rimraf": "^5.0.5", 43 | "ts-jest": "^29.1.2", 44 | "ts-node": "^10.9.2", 45 | "typescript": "^5" 46 | }, 47 | "engines": { 48 | "node": ">=18.0.0" 49 | }, 50 | "type": "module" 51 | } 52 | ``` -------------------------------------------------------------------------------- /chatmcp.yaml: -------------------------------------------------------------------------------- ```yaml 1 | params: 2 | type: object 3 | properties: 4 | TRANSLATION_API_KEY: 5 | type: string 6 | description: API密钥,用于翻译服务 7 | TRANSLATION_BASE_URL: 8 | type: string 9 | description: 翻译API基础URL 10 | default: "https://api.openai.com/v1" 11 | TRANSLATION_MODEL: 12 | type: string 13 | description: 翻译使用的模型名称 14 | default: "gpt-4o" 15 | required: 16 | - TRANSLATION_API_KEY 17 | 18 | rest: 19 | name: translation-server 20 | port: 3031 21 | endpoint: /api 22 | 23 | npx: 24 | command: 25 | | TRANSLATION_API_KEY={TRANSLATION_API_KEY} TRANSLATION_BASE_URL={TRANSLATION_BASE_URL} TRANSLATION_MODEL={TRANSLATION_MODEL} npx -y server-translation-mcp --mode=rest 26 | config: 27 | | { 28 | "mcpServers": { 29 | "translation-server": { 30 | "command": "npx", 31 | "args": [ 32 | "-y", 33 | "server-translation-mcp", 34 | "--mode=rest" 35 | ], 36 | "env": { 37 | "TRANSLATION_API_KEY": "YOUR_API_KEY_HERE", 38 | "TRANSLATION_BASE_URL": "https://api.openai.com/v1", 39 | "TRANSLATION_MODEL": "gpt-4o" 40 | } 41 | } 42 | } 43 | } 44 | 45 | docker: 46 | command: 47 | | docker run -i --rm -e TRANSLATION_API_KEY={TRANSLATION_API_KEY} -e TRANSLATION_BASE_URL={TRANSLATION_BASE_URL} -e TRANSLATION_MODEL={TRANSLATION_MODEL} -p 3031:3031 mcp/translation-server 48 | config: 49 | | { 50 | "mcpServers": { 51 | "translation-server": { 52 | "command": "docker", 53 | "args": [ 54 | "run", 55 | "-i", 56 | "--rm", 57 | "-e", 58 | "TRANSLATION_API_KEY", 59 | "-e", 60 | "TRANSLATION_BASE_URL", 61 | "-e", 62 | "TRANSLATION_MODEL", 63 | "-p", 64 | "3031:3031", 65 | "mcp/translation-server" 66 | ], 67 | "env": { 68 | "TRANSLATION_API_KEY": "YOUR_API_KEY_HERE", 69 | "TRANSLATION_BASE_URL": "https://api.openai.com/v1", 70 | "TRANSLATION_MODEL": "gpt-4o" 71 | } 72 | } 73 | } 74 | } ```