跳到主要内容

MCP Server

介绍

Tuanjie AI MCP Server 是基于模型上下文协议(Model Context Protocol,MCP)构建的扩展服务器,旨在为 Codely CLI 提供与外部系统和服务集成的能力。通过 MCP Server,Tuanjie AI 可以访问数据库、API、文件系统和其他第三方服务,从而大幅扩展其功能边界。

什么是 MCP Server?

MCP Server 是一个独立运行的应用程序,它通过标准化的 MCP 协议向 Codely CLI 暴露工具(tools)、资源(resources)和提示(prompts)。Codely CLI 通过三种传输机制与 MCP Server 通信:

  • Stdio 传输:通过标准输入/输出与本地子进程通信
  • SSE 传输:通过服务器发送事件(Server-Sent Events)与远程服务器通信
  • Streamable HTTP 传输:通过 HTTP 流与远程服务器通信

Tuanjie AI MCP Server 的优势

  • 模块化扩展:将复杂功能封装为独立服务器,保持核心代码库简洁
  • 安全隔离:敏感凭证和服务逻辑与 Tuanjie AI 主进程隔离
  • 灵活部署:支持本地进程、Docker 容器或远程服务多种部署方式
  • 统一接口:所有外部服务通过统一的 MCP 协议访问
  • 动态发现:Tuanjie AI 自动发现服务器提供的工具,无需手动配置

典型应用场景

  • 代码仓库集成:访问 GitHub、GitLab 等 Git 托管服务
  • 数据库操作:查询和操作 PostgreSQL、MySQL、MongoDB 等数据库
  • 云服务访问:与 AWS、Google Cloud、Azure 等云平台交互
  • 团队协作:集成 Slack、Jira、Notion 等协作工具
  • 文件处理:访问网络存储、S3、Google Drive 等文件服务

通过 GUI 管理 MCP Server

  1. 在对话框输入 '/',在下拉菜单中选择 "Manage Mcp Servers"。或者直接输入 "/MCP"。
  2. 在打开的对话框口中创建自己的Mcp Server。
  3. 创建新的Mcp Server后,请开启新的对话会话,新增的 Mcp Server 将在新会话启动时完成加载。
  4. 在对话窗口输入 '@' 即可快速选中您新增的 Mcp Server。

创建Mcp Server时Type的区别:

  • STDIO:标准输入输出(Standard Input/Output)。
    通过标准输入输出流进行本地进程间通信,适合本地工具调用。
  • SSE:服务器发送事件(Server-Sent Events)。
    基于 HTTP 的服务器推送技术,适合服务端向客户端持续推送数据流。
  • Streamable HTTP:可流式传输的 HTTP(一种支持数据流式传输的 HTTP 协议变体)。
    兼容 HTTP 且支持流式响应,兼顾兼容性与实时数据传输。

三种通信方式适用场景对比表

通信方式全称核心特点适用场景优势劣势
STDIOStandard Input/Output基于进程标准输入输出流的本地通信✅ 本地工具/脚本调用
✅ 桌面端本地 MCP 服务
✅ 无网络依赖的离线场景
🔹 低延迟、性能高
🔹 无需网络配置
🔹 部署简单、安全隔离
🔸 仅支持本地进程间通信
🔸 无法跨机器/网络使用
SSEServer-Sent Events基于 HTTP 的单向服务器推送流✅ 云端 MCP 服务
✅ 实时数据推送(如日志、进度)
✅ 浏览器/客户端长连接
🔹 兼容 HTTP 标准
🔹 自动重连机制
🔹 服务端主动推送
🔸 仅单向通信(服务端→客户端)
🔸 不支持二进制数据
🔸 受浏览器连接数限制
Streamable HTTP可流式传输 HTTP兼容 HTTP 协议的双向流式通信✅ 跨网络/云服务部署
✅ 需要双向交互的实时场景
✅ 兼容现有 HTTP 基础设施
🔹 双向流式数据传输
🔹 兼容标准 HTTP/HTTPS
🔹 支持二进制/文本混合流
🔸 实现复杂度略高于 SSE
🔸 部分老旧代理可能不兼容

快速选择建议

  • 本地开发/离线工具 → 选 STDIO,简单高效,无需网络。
  • 云端服务+单向推送 → 选 SSE,适合日志、通知等场景。
  • 跨网络+双向实时交互 → 选 Streamable HTTP,兼容性与实时性平衡最好。

通过 CLI 管理 MCP Server

前置条件

在开始之前,请确保您具备以下条件:

  • Codely CLI 已安装:确保您的系统上已安装最新版本的 Codely CLI
  • Docker(可选):某些 MCP Server 以 Docker 容器形式运行
  • 必要的凭证:根据要连接的服务,准备相应的 API 密钥或访问令牌
  • 网络连接:确保可以访问 MCP Server 所在的服务地址

准备凭证

大多数 MCP Server 需要身份验证才能访问受保护的资源。凭证的安全管理至关重要。

凭证管理最佳实践
  • 使用环境变量:将敏感凭证存储在环境变量中,而非硬编码在配置文件
  • 最小权限原则:为凭证分配完成任务所需的最小权限
  • 定期轮换:定期更新访问令牌和密钥
  • 安全存储:使用系统的安全凭证存储机制
示例:准备 GitHub 凭证

如果您要使用 GitHub MCP Server,需要创建一个 Personal Access Token(PAT):

  1. 登录 GitHub,进入 Settings → Developer settings → Personal access tokens → Tokens (classic)
  2. 创建新的 token,授予以下权限:
    • repo: 完整仓库访问权限
    • read:org: 读取组织信息(如果需要)
  3. 将 token 安全地存储在环境变量中

macOS/Linux:

export GITHUB_PERSONAL_ACCESS_TOKEN="github_pat_..."

Windows (PowerShell):

$env:GITHUB_PERSONAL_ACCESS_TOKEN="github_pat_..."

配置 Codely CLI

Codely CLI 通过 settings.json 文件来发现和连接 MCP Server。您可以配置全局服务器(用户级别)或项目特定服务器(项目级别)。

配置文件位置
  • 用户级别配置:~/.codely-cli/settings.json
  • 项目级别配置:<项目目录>/.codely-cli/settings.json

项目级别配置会覆盖用户级别配置中相同名称的服务器。

基本配置结构

在 settings.json 中添加 mcpServers 对象:

{
"mcpServers": {
"serverName": {
"command": "path/to/executable",
"args": ["--arg1", "value1"],
"env": {
"API_KEY": "$API_KEY"
},
"cwd": "./working/directory",
"timeout": 30000,
"trust": false
}
}
}
配置属性说明
属性类型必需说明
commandstring之一Stdio 传输的可执行文件路径
urlstring之一SSE 传输的端点 URL
httpUrlstring之一HTTP 流式传输的端点 URL
argsstring[]命令行参数(仅用于 Stdio)
headersobjectHTTP 请求头(用于 SSE/HTTP)
envobject环境变量(支持 $VAR 语法展开)
cwdstring工作目录(仅用于 Stdio)
timeoutnumber请求超时(毫秒,默认 600000)
trustboolean是否跳过工具调用确认(默认 false)
includeToolsstring[]包含的工具白名单
excludeToolsstring[]排除的工具黑名单
示例配置
1. GitHub MCP Server(Docker)
{
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server:latest"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
}
}
}
}
2. PostgreSQL MCP Server(Python)
{
"mcpServers": {
"postgres": {
"command": "python",
"args": ["-m", "postgres_mcp_server"],
"cwd": "./mcp-servers/postgres",
"env": {
"DATABASE_URL": "$DATABASE_URL",
"DB_HOST": "${DB_HOST}",
"DB_PORT": "${DB_PORT:-5432}"
},
"timeout": 15000
}
}
}
3. 自定义 Node.js MCP Server
{
"mcpServers": {
"my-custom-server": {
"command": "node",
"args": ["dist/server.js", "--verbose"],
"cwd": "./my-mcp-server",
"trust": true
}
}
}
4. 远程 HTTP MCP Server
{
"mcpServers": {
"remote-api": {
"httpUrl": "https://api.example.com/mcp",
"headers": {
"Authorization": "Bearer ${API_TOKEN}",
"X-Custom-Header": "custom-value"
},
"timeout": 5000
}
}
}

验证连接

配置完成后,重启 Codely CLI 以加载新的 MCP Server 配置。

检查服务器状态

使用 /mcp/mcp list 命令查看所有 MCP Server 的连接状态:

/mcp list

预期输出示例:

✓ github: docker run -i --rm ... - Connected
✓ postgres: python -m postgres_mcp_server - Connected
✗ remote-api: https://api.example.com/mcp - Disconnected
Error: Connection timeout
状态说明
  • Connected:服务器已成功连接并注册了工具
  • Connecting:正在尝试连接
  • Disconnected:连接失败或未连接
  • Disabled:服务器已被手动禁用
故障排查

如果服务器显示为 Disconnected:

  1. 检查 Docker 是否运行(对于 Docker 服务器)
docker ps
  1. 验证命令是否可用
python --version
node --version
  1. 检查环境变量是否设置
echo $GITHUB_PERSONAL_ACCESS_TOKEN
  1. 查看详细错误日志
/mcp list
  1. 强制重新加载
/mcp reload

使用新工具

一旦 MCP Server 成功连接,Tuanjie AI 就可以自动使用服务器提供的所有工具。您无需学习特殊的命令——只需用自然语言描述您的需求即可。

工具自动发现

Tuanjie AI 会自动:

  • 枚举工具:从服务器获取所有可用工具及其定义
  • 模式验证:验证工具的输入/输出模式
  • 命名空间处理:为工具添加 mcp_{serverName}_ 前缀以避免冲突
  • 注册到工具库:使工具对模型可见
使用场景示例
场景 1:列出 GitHub 仓库的 Pull Requests

用户输入:

列出 google/gemini-cli 仓库的所有打开的 PR,按创建时间排序

Tuanjie AI 自动执行的步骤:

  1. 识别请求涉及 GitHub 仓库操作
  2. 选择 mcp_github_list_pull_requests 工具
  3. 请求用户确认工具调用(除非服务器被标记为信任)
  4. 使用参数执行工具:
{
"owner": "google",
"repo": "gemini-cli",
"state": "open"
}
  1. 解析返回的 PR 数据并以友好的格式呈现
场景 2:创建 GitHub Issue

用户输入:

在我的仓库中创建一个 issue,标题是"Bug: 登录失败",描述是"请查看附件的日志"

Tuanjie AI 执行:

  1. 识别需要创建 GitHub Issue
  2. 调用 mcp_github_create_issue 工具
  3. 使用以下参数:
{
"title": "Bug: 登录失败",
"body": "请查看附件的日志",
"labels": ["bug"]
}
  1. 返回创建的 issue 链接和详情
场景 3:查询 PostgreSQL 数据库

用户输入:

查询 users 表中最近注册的 10 个用户

Tuanjie AI 执行:

  1. 识别需要数据库查询
  2. 调用 mcp_postgres_query 工具
  3. 使用参数:
{
"query": "SELECT * FROM users ORDER BY created_at DESC LIMIT 10"
}
  1. 以表格形式展示查询结果
场景 4:读取 MCP 资源

如果 MCP Server 暴露了资源,您可以使用 @ 语法引用:

请分析 @github://repo/contents/README.md 的内容

Tuanjie AI 会自动:

  1. 识别 @github:// 资源引用
  2. 调用服务器的 resources/read 方法
  3. 将资源内容注入到对话上下文中

故障排除

常见问题

问题 1:服务器无法启动

症状:/mcp list 显示 Disconnected

解决方案:

  1. 手动运行服务器命令查看错误信息
docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN ghcr.io/github/github-mcp-server:latest
  1. 检查端口是否被占用
netstat -an | grep 8080
  1. 验证依赖是否安装
pip list | grep mcp
npm list | grep @modelcontextprotocol

问题 2:工具未被发现

症状:服务器已连接但工具列表为空

解决方案:

  1. 强制重新加载:
/mcp reload
  1. 检查服务器日志是否有错误
  2. 验证服务器是否正确实现了 MCP 协议的工具列表端点

问题 3:工具执行失败

症状:工具调用时返回错误

解决方案:

  1. 检查参数是否符合工具的模式定义
  2. 验证凭证是否有效且具有足够权限
  3. 增加超时时间
  4. 查看服务器的 stderr 输出

问题 4:环境变量未展开

症状:服务器无法访问环境变量

解决方案:

  1. 确认环境变量已在 shell 中设置
  2. 使用正确的语法:
    • ${VAR_NAME}$VAR_NAME(所有平台)
    • %VAR_NAME%(仅 Windows)
  3. 验证变量名拼写正确

如何创建 Tuanjie AI MCP Server

理解 MCP 协议

MCP 是一个开放标准协议,定义了 AI 助手与外部服务的通信规范。核心概念包括:

MCP 核心组件
  • Tools(工具):可执行的函数,接受输入参数并返回结果
  • Resources(资源):可读取的数据实体(文件、文档、记录等)
  • Prompts(提示):预定义的提示模板,可作为斜杠命令调用
MCP 消息类型
方法方向说明
tools/list客户端 → 服务器列出所有可用工具
tools/call客户端 → 服务器调用特定工具
resources/list客户端 → 服务器列出所有可用资源
resources/read客户端 → 服务器读取特定资源
prompts/list客户端 → 服务器列出所有可用提示
prompts/get客户端 → 服务器获取特定提示

创建项目结构

项目目录布局
codely-mcp-server/
├── package.json # Node.js 项目配置
├── tsconfig.json # TypeScript 配置
├── src/
│ ├── index.ts # 服务器入口点
│ ├── tools/ # 工具实现
│ │ ├── calculator.ts
│ │ └── data-processor.ts
│ ├── resources/ # 资源实现
│ │ └── file-reader.ts
│ └── prompts/ # 提示实现
│ └── code-review.ts
├── dist/ # 编译输出(自动生成)
└── README.md # 项目文档
初始化项目
# 创建项目目录
mkdir codely-mcp-server
cd codely-mcp-server

# 初始化 Node.js 项目
npm init -y

# 安装依赖
npm install @modelcontextprotocol/sdk zod

# 安装开发依赖
npm install -D typescript @types/node ts-node
配置 TypeScript

创建 tsconfig.json:

{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"lib": ["ES2022"],
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "Node16",
"resolveJsonModule": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}

更新 package.json:

{
"name": "codely-mcp-server",
"version": "1.0.0",
"description": "Tuanjie AI MCP Server for custom integrations",
"type": "module",
"main": "dist/index.js",
"bin": {
"codely-mcp": "./dist/index.js"
},
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"dev": "ts-node src/index.ts",
"watch": "tsc --watch"
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.4",
"zod": "^3.22.4"
},
"devDependencies": {
"@types/node": "^20.0.0",
"ts-node": "^10.9.0",
"typescript": "^5.0.0"
}
}

实现服务器逻辑

基础服务器实现

创建 src/index.ts:

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';

// 创建 MCP 服务器实例
const server = new McpServer({
name: 'codely-mcp-server',
version: '1.0.0',
});

// 在这里注册工具、资源和提示

// 启动服务器
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('Tuanjie AI MCP Server running on stdio');
}

main().catch((error) => {
console.error('Fatal error in main():', error);
process.exit(1);
});

注册工具

工具是 MCP Server 的核心功能。每个工具都有一个名称、描述和输入模式。

示例 1:计算器工具

创建 src/tools/calculator.ts:

import { z } from 'zod';

export const calculatorTool = {
name: 'calculate',
description: '执行基本的数学运算(加、减、乘、除)',
inputSchema: z.object({
operation: z.enum(['add', 'subtract', 'multiply', 'divide']),
a: z.number().describe('第一个操作数'),
b: z.number().describe('第二个操作数')
}),
handler: async ({ operation, a, b }) => {
let result: number;

switch (operation) {
case 'add':
result = a + b;
break;
case 'subtract':
result = a - b;
break;
case 'multiply':
result = a * b;
break;
case 'divide':
if (b === 0) {
throw new Error('除数不能为零');
}
result = a / b;
break;
default:
throw new Error(`未知的操作:${operation}`);
}

return {
content: [
{
type: 'text',
text: `${operation}(${a}, ${b}) = ${result}`
}
]
};
}
};

在 src/index.ts 中注册工具:

import { calculatorTool } from './tools/calculator.js';

// 注册计算器工具
server.registerTool(
calculatorTool.name,
calculatorTool.description,
calculatorTool.inputSchema.shape,
calculatorTool.handler
);
示例 2:数据处理工具

创建 src/tools/data-processor.ts:

import { z } from 'zod';

export const dataProcessorTool = {
name: 'process_data',
description: '处理和分析 JSON 数据数组',
inputSchema: z.object({
data: z.array(z.record(z.any())).describe('要处理的数据数组'),
operation: z.enum(['sum', 'average', 'max', 'min', 'count']),
field: z.string().optional().describe('要操作的字段名称')
}),
handler: async ({ data, operation, field }) => {
if (data.length === 0) {
return {
content: [
{
type: 'text',
text: '数据数组为空'
}
]
};
}

let result: number | string;

if (field) {
const values = data.map(item => item[field]).filter(v => typeof v === 'number') as number[];

if (values.length === 0) {
return {
content: [
{
type: 'text',
text: `字段 "${field}" 不存在或没有数值数据`
}
]
};
}

switch (operation) {
case 'sum':
result = values.reduce((sum, v) => sum + v, 0);
break;
case 'average':
result = values.reduce((sum, v) => sum + v, 0) / values.length;
break;
case 'max':
result = Math.max(...values);
break;
case 'min':
result = Math.min(...values);
break;
case 'count':
result = values.length;
break;
}
} else {
result = data.length;
}

return {
content: [
{
type: 'text',
text: `${operation} 结果:${result}`
}
]
};
}
};

在 src/index.ts 中注册:

import { dataProcessorTool } from './tools/data-processor.js';

server.registerTool(
dataProcessorTool.name,
dataProcessorTool.description,
dataProcessorTool.inputSchema.shape,
dataProcessorTool.handler
);

处理资源

资源代表服务器暴露的可读数据实体。

示例:文件读取资源

创建 src/resources/file-reader.ts:

import { z } from 'zod';
import { promises as fs } from 'fs';
import * as path from 'path';

export const fileReaderResource = {
uri: 'file://workspace',
name: 'workspace-files',
description: '读取工作区中的文件',
mimeType: 'text/plain',
handler: async (uri: string) => {
// 解析 URI,例如 file://workspace/path/to/file.txt
const filePath = uri.replace('file://workspace', '');
const fullPath = path.resolve(process.cwd(), filePath);

try {
const content = await fs.readFile(fullPath, 'utf-8');
return {
contents: [
{
uri,
mimeType: 'text/plain',
text: content
}
]
};
} catch (error) {
return {
contents: [
{
uri,
mimeType: 'text/plain',
text: `无法读取文件:${error instanceof Error ? error.message : String(error)}`
}
]
};
}
}
};

在 src/index.ts 中注册资源:

import { fileReaderResource } from './resources/file-reader.js';

// 注册文件读取资源
server.registerResource(
fileReaderResource.uri,
{
name: fileReaderResource.name,
description: fileReaderResource.description,
mimeType: fileReaderResource.mimeType
},
fileReaderResource.handler
);

添加提示

提示是预定义的模板,可以作为斜杠命令快速调用。

示例:代码审查提示

创建 src/prompts/code-review.ts:

import { z } from 'zod';

export const codeReviewPrompt = {
name: 'code-review',
description: '对代码进行全面的审查',
arguments: {
filePath: z.string().describe('要审查的文件路径'),
focus: z.enum(['security', 'performance', 'style', 'all']).optional().describe('审查重点')
},
handler: async ({ filePath, focus = 'all' }) => {
const focusText = focus === 'all' ? '全面' : focus;
return {
messages: [
{
role: 'user',
content: {
type: 'text',
text: `请对文件 ${filePath} 进行${focusText}代码审查。请检查以下方面:

${focus === 'all' || focus === 'security' ? '- 安全漏洞和潜在风险\n' : ''}
${focus === 'all' || focus === 'performance' ? '- 性能优化机会\n' : ''}
${focus === 'all' || focus === 'style' ? '- 代码风格和最佳实践\n' : ''}
${focus === 'all' ? '- 错误处理和边界情况\n- 代码可读性和可维护性\n' : ''}

请提供具体的改进建议和代码示例。`
}
}
]
};
}
};

在 src/index.ts 中注册提示:

import { codeReviewPrompt } from './prompts/code-review.js';

// 注册代码审查提示
server.registerPrompt(
codeReviewPrompt.name,
{
title: 'Code Review',
description: codeReviewPrompt.description,
arguments: codeReviewPrompt.arguments
},
codeReviewPrompt.handler
);

构建和打包

构建项目
npm run build

这将在 dist/ 目录中生成编译后的 JavaScript 文件。

测试本地服务器
# 使用 ts-node 直接运行
npm run dev

# 或者先构建再运行
npm run build
npm start
创建 Docker 镜像(可选)

创建 Dockerfile:

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY dist ./dist

CMD ["node", "dist/index.js"]

构建和推送镜像:

# 构建镜像
docker build -t codely-mcp-server:latest .

# 运行容器测试
docker run -i --rm codely-mcp-server:latest

# 推送到镜像仓库
docker tag codely-mcp-server:latest your-registry/codely-mcp-server:latest
docker push your-registry/codely-mcp-server:latest

测试服务器

手动测试

使用 mcp-client-cli 或直接通过 stdin/stdout 测试:

# 发送请求
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node dist/index.js
通过 Codely CLI 测试

将服务器添加到 settings.json:

{
"mcpServers": {
"codely": {
"command": "node",
"args": ["/path/to/codely-mcp-server/dist/index.js"],
"trust": true
}
}
}
  1. 重启 Codely CLI
  2. 验证连接:
/mcp list
  1. 测试工具:
计算 123 和 456 的和

部署选项

选项 1:本地安装

将服务器安装到用户的系统:

# 全局安装
npm install -g /path/to/codely-mcp-server

# 或使用 npm link 开发
cd /path/to/codely-mcp-server
npm link

在 settings.json 中配置:

{
"mcpServers": {
"codely": {
"command": "codely-mcp"
}
}
}
选项 2:Docker 部署
{
"mcpServers": {
"codely": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"your-registry/codely-mcp-server:latest"
]
}
}
}
选项 3:远程 HTTP/SSE 服务

将服务器部署到云服务,通过 HTTP 或 SSE 暴露:

{
"mcpServers": {
"codely": {
"httpUrl": "https://mcp.your-domain.com/codely",
"headers": {
"Authorization": "Bearer ${API_TOKEN}"
}
}
}
}

附录

完整示例服务器

以下是完整的 src/index.ts 文件示例:

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
import { calculatorTool } from './tools/calculator.js';
import { dataProcessorTool } from './tools/data-processor.js';
import { fileReaderResource } from './resources/file-reader.js';
import { codeReviewPrompt } from './prompts/code-review.js';

// 创建服务器实例
const server = new McpServer({
name: 'codely-mcp-server',
version: '1.0.0',
});

// 注册工具
server.registerTool(
calculatorTool.name,
calculatorTool.description,
calculatorTool.inputSchema.shape,
calculatorTool.handler
);

server.registerTool(
dataProcessorTool.name,
dataProcessorTool.description,
dataProcessorTool.inputSchema.shape,
dataProcessorTool.handler
);

// 注册资源
server.registerResource(
fileReaderResource.uri,
{
name: fileReaderResource.name,
description: fileReaderResource.description,
mimeType: fileReaderResource.mimeType
},
fileReaderResource.handler
);

// 注册提示
server.registerPrompt(
codeReviewPrompt.name,
{
title: 'Code Review',
description: codeReviewPrompt.description,
arguments: codeReviewPrompt.arguments
},
codeReviewPrompt.handler
);

// 启动服务器
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('Tuanjie AI MCP Server running on stdio');
}

main().catch((error) => {
console.error('Fatal error in main():', error);
process.exit(1);
});

最佳实践

  • 错误处理:始终提供清晰的错误消息
  • 输入验证:使用 Zod schema 严格验证输入
  • 日志记录:使用 console.error 记录调试信息
  • 超时处理:为长时间操作设置合理的超时
  • 安全考虑:永远不要在日志中输出敏感信息
  • 文档完善:为每个工具、资源和提示提供清晰的描述

文档版本:1.0.0 最后更新:2026 年 3 月 24 日