跳到主要内容

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)
headersobject否HTTP 请求头(用于 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 记录调试信息
  • 超时处理:为长时间操作设置合理的超时
  • 安全考虑:永远不要在日志中输出敏感信息
  • 文档完善:为每个工具、资源和提示提供清晰的描述