Cách xây dựng Máy chủ MCP cho Claude Code (Hướng dẫn hoàn chỉnh)

Điều gì là MCP?
MCP là một giao thức tiêu chuẩn hóa cách các mô hình AI giao tiếp với các công cụ bên ngoài. Hãy tưởng tượng nó như USB cho AI — một kết nối phổ biến cho phép bất kỳ mô hình AI nào sử dụng bất kỳ công cụ nào.
Một máy chủ MCP:
Xác định các công cụ có sẵn (Claude có thể làm gì?)
Quản lý các cuộc gọi công cụ (Claude nói "xem xét cơ sở dữ liệu", máy chủ thực hiện)
Trả kết quả (gửi dữ liệu trở lại Claude)
Setup máy chủ MCP đầu tiên của bạn
Bước 1: Cài đặt dự án
mkdir my-mcp-server
cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node tsx
npx tsc --init
Bước 2: Cấu trúc máy chủ cơ bản
// src/index.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
const server = new McpServer({
name: 'my-custom-tools',
version: '1.0.0',
});
// Định nghĩa một công cụ đơn giản
server.tool(
'greet',
'Xin chào một người dùng bằng tên',
{
name: z.string().describe('Tên để chào'),
},
async ({ name }) => ({
content: [
{
type: 'text',
text: `Xin chào, ${name}! Chào mừng đến với máy chủ MCP của tôi.`,
},
],
})
);
// Bắt đầu máy chủ
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);
Bước 3: Đăng ký với mã Claude
// Trong tệp .claude/settings.json hoặc CLAUDE.md của dự án:
// Thêm cấu hình máy chủ MCP
{
"mcpServers": {
"my-tools": {
"command": "npx",
"args": ["tsx", "/path/to/my-mcp-server/src/index.ts"]
}
}
}
Building một máy chủ cơ sở dữ liệu MCP
Use case phổ biến nhất: cho phép Claude truy cập cơ sở dữ liệu của bạn.
// src/database-server.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
import { Pool } from 'pg';
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
const server = new McpServer({
name: 'database-tools',
version: '1.0.0',
});
// Chức năng đọc-only
server.tool(
'query_database',
'Thực hiện một truy vấn đọc-only SQL chống lại cơ sở dữ liệu',
{
sql: z.string().describe('Truy vấn SQL SELECT để thực hiện'),
},
async ({ sql }) => {
// An toàn: chỉ cho phép truy vấn SELECT
if (!sql.trim().toUpperCase().startsWith('SELECT')) {
return {
content: [{
type: 'text',
text: 'Lỗi: Chỉ cho phép truy vấn SELECT.',
}],
isError: true,
};
}
try {
const result = await pool.query(sql);
return {
content: [{
type: 'text',
text: JSON.stringify(result.rows, null, 2),
}],
};
} catch (error) {
return {
content: [{
type: 'text',
text: `Lỗi truy vấn: ${error.message}`,
}],
isError: true,
};
}
}
);
// Chức năng liệt kê schema bảng
server.tool(
'list_tables',
'Liệt kê tất cả các bảng trong cơ sở dữ liệu với các cột',
{},
async () => {
const result = await pool.query(`
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'public'
ORDER BY table_name, ordinal_position
`);
return {
content: [{
type: 'text',
text: JSON.stringify(result.rows, null, 2),
}],
};
}
);
Thiết kế một Server tích hợp API
// src/api-server.ts
server.tool(
'search_github',
'Tìm kiếm các dự án trên GitHub',
{
query: z.string().describe('Từ khóa tìm kiếm cho các dự án'),
language: z.string().optional().describe('Lọc theo ngôn ngữ lập trình'),
},
async ({ query, language }) => {
const params = new URLSearchParams({
q: language ? `${query} language:${language}` : query,
sort: 'stars',
order: 'desc',
});
const response = await fetch(
`https://api.github.com/search/repositories?${params}`,
{ headers: { 'Accept': 'application/vnd.github.v3+json' } }
);
const data = await response.json();
const repos = data.items.slice(0, 10).map(repo => ({
name: repo.full_name,
description: repo.description,
stars: repo.stargazers_count,
url: repo.html_url,
}));
return {
content: [{
type: 'text',
text: JSON.stringify(repos, null, 2),
}],
};
}
);
Thực hành tốt nhất về bảo mật
Những gì không bao giờ được cho phép là các hoạt động ghi mà không cần xác nhận — đọc-only mặc định
Bảo vệ và khử trùng tất cả đầu vào — sử dụng lược đồ Zod cho an toàn kiểu
Giới hạn phạm vi truy vấn — hạn chế truy cập cơ sở dữ liệu vào các lược đồ bảng cụ thể
Lưu tất cả các cuộc gọi công cụ — bản ghi để debug và bảo mật
Sử dụng biến môi trường cho thông tin đăng nhập — không mã hóa bí mật
Giới hạn tốc độ các cuộc gọi công cụ — ngăn chặn hành vi máy chủ bị mất kiểm soát
Những câu hỏi thường gặp khác
Những ngôn ngữ nào có thể xây dựng máy chủ MCP?
Lực lượng phát triển chính hỗ trợ TypeScript/JavaScript và Python. Các SDK cộng đồng tồn tại cho Go, Rust và các ngôn ngữ khác.
Liệu máy chủ MCP có thể chạy ở xa không?
Có — MCP hỗ trợ cả giao thức stdio (địa phương) và HTTP/SSE (trực tuyến). Máy chủ ở xa có thể chạy trên bất kỳ nhà cung cấp đám mây nào.
Số lượng công cụ mà một máy chủ MCP có thể hiển thị?
Không có giới hạn cứng, nhưng giữ nó tập trung. Một máy chủ với 5-10 công cụ được định nghĩa rõ ràng tốt hơn một máy chủ với 50 công cụ mờ nhạt. Claude cần hiểu rõ từng công cụ để sử dụng hiệu quả.
