H2

hanhpm/2a202600883-maihanhpham-day26-mcp-tools-integration

Developer tools
0 stars 90 forks Quality 52 Trend 4

Đây là hai khái niệm hay bị nhầm lẫn nhưng thực ra ở , và chứ không thay thế.

Overview

Đây là hai khái niệm hay bị nhầm lẫn nhưng thực ra ở , và chứ không thay thế. là một khả năng của model (capability). Model được huấn luyện để khi bạn đưa cho nó danh sách các "công cụ" (kèm schema mô tả tham số), nó có thể tự quyết định gọi công cụ nào và sinh ra JSON tham số phù hợp. Bản thân model function — nó chỉ nói "hãy gọi get_weather(city='Hanoi')". App mới là nơi chạy tool. là một giao thức chuẩn (protocol) — giống như USB-C hay HTTP cho thế giới AI. Nó định nghĩa cách một (như Claude Code, Claude Desktop) kết nối tới các để khám phá và sử dụng tools, resources, prompts một cách thống nhất. Điểm quan trọng nhất: . Chúng không loại trừ nhau. - : app đơn giản, tool gắn chặt với 1 ứng dụng, không cần chia sẻ. - : muốn tool/tích hợp dùng lại được trên nhiều AI client, muốn tách biệt logic tool khỏi app, hoặc xây hệ sinh thái tích hợp (DB, file, API nội bộ...). Cùng một tool get_weather, dưới đây là hai cách triển khai để thấy rõ sự khác biệt. Tool được .

README

Phân biệt MCP và Function Calling

Đây là hai khái niệm hay bị nhầm lẫn nhưng thực ra ở hai tầng khác nhau, và bổ sung cho nhau chứ không thay thế.

Cấu trúc repo

day26-mcp/
├── README.md                ← Bạn đang đọc file này
├── requirements.txt         ← pip install -r requirements.txt
│
├── 01-function-calling/     ← Bước 1: Function Calling thuần (Gemini SDK)
│   ├── README.md
│   └── weather_function_calling.py
│
├── 02-mcp-basics/           ← Bước 2: MCP server + client (không cần API key)
│   ├── README.md
│   ├── weather_server.py
│   └── weather_client.py
│
└── 03-production/           ← Bước 3: Auth, Tool Registry, Versioning
    ├── README.md
    ├── auth_server.py
    ├── auth_client.py
    ├── registry.json
    ├── registry_client.py
    └── versioned_server.py

Quick start

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

# MCP demo (không cần API key)
cd 02-mcp-basics && python weather_client.py

# Function Calling (cần Gemini API key)
export GEMINI_API_KEY=...
cd 01-function-calling && python weather_function_calling.py

# Production — Auth (2 terminal)
cd 03-production
python auth_server.py              # terminal 1
python auth_client.py              # terminal 2

# Production — Tool Registry
cd 03-production && python registry_client.py

Định nghĩa ngắn gọn

Function Calling là một khả năng của model (capability). Model được huấn luyện để khi bạn đưa cho nó danh sách các “công cụ” (kèm schema mô tả tham số), nó có thể tự quyết định gọi công cụ nào và sinh ra JSON tham số phù hợp. Bản thân model không chạy function — nó chỉ nói “hãy gọi get_weather(city='Hanoi')”. App mới là nơi chạy tool.

MCP (Model Context Protocol) là một giao thức chuẩn (protocol) — giống như USB-C hay HTTP cho thế giới AI. Nó định nghĩa cách một MCP Client (như Claude Code, Claude Desktop) kết nối tới các MCP Server để khám phá và sử dụng tools, resources, prompts một cách thống nhất.


So sánh trực tiếp

Tiêu chí Function Calling Model Context Protocol (MCP)
Bản chất Tính năng của mô hình (Model capability) Giao thức giao tiếp client–server
Ai định nghĩa tool? Bạn hard-code trong từng app Server tự công bố (self-describe) tool
Tái sử dụng Phải viết lại cho mỗi app/model Viết 1 lần, mọi MCP client dùng được
Thực thi App của bạn tự chạy MCP Server chạy, client điều phối
Tính chuẩn hóa Mỗi nhà cung cấp 1 kiểu (OpenAI, Anthropic khác nhau) Một chuẩn chung do Anthropic đề xuất
Hệ sinh thái Khó chia sẻ dạng module đóng gói sẵn Dễ dàng chia sẻ và tải về các “MCP Servers” mã nguồn mở

Quan hệ giữa chúng

Điểm quan trọng nhất: MCP dùng Function Calling bên dưới. Chúng không loại trừ nhau.

User hỏi
   │
   ▼
LLM (dùng Function Calling để quyết định gọi tool nào)
   │
   ▼
MCP Client  ──[giao thức MCP]──►  MCP Server (thực thi tool thật)
   │                                   │
   ◄───────────── kết quả ─────────────┘
   ▼
LLM tổng hợp câu trả lời

Khi nào dùng cái nào?

  • Function Calling thuần: app đơn giản, tool gắn chặt với 1 ứng dụng, không cần chia sẻ.
  • MCP: muốn tool/tích hợp dùng lại được trên nhiều AI client, muốn tách biệt logic tool khỏi app, hoặc xây hệ sinh thái tích hợp (DB, file, API nội bộ…).

Minh hoạ bằng mã nguồn

Cùng một tool get_weather, dưới đây là hai cách triển khai để thấy rõ sự khác biệt.

Cách 1 — Function Calling thuần (Google Gemini SDK)

Tool được định nghĩa và thực thi ngay trong app. Model chỉ quyết định gọi tool nào, app tự chạy và đưa kết quả trở lại.

User hỏi → Model quyết định gọi get_weather("Hà Nội")
                    │
                    ▼
             App TỰ THỰC THI hàm get_weather
                    │
                    ▼
             Model tổng hợp câu trả lời

Nhược điểm: schema viết tay, tool gắn chặt trong app — muốn dùng lại ở app khác phải copy cả schema lẫn hàm.

Chi tiết + code: xem 01-function-calling/README.md

Cách 2 — MCP (server tự công bố tool, mọi client dùng chung)

Tool được tách ra một MCP server độc lập. Server tự “khai báo” nó có tool gì; bất kỳ MCP client nào (Claude Code, Claude Desktop, Cursor…) cũng cắm vào dùng được mà không cần biết code bên trong.

weather_client.py                       weather_server.py
┌─────────────┐    giao thức MCP    ┌─────────────────┐
│  list_tools │ ──────────────────▶ │ @mcp.tool()     │
│  call_tool  │ ◀────────────────── │ get_weather()   │
└─────────────┘     stdio           └─────────────────┘

Chi tiết + code: xem 02-mcp-basics/README.md

Điểm khác biệt rút ra từ code

Function Calling thuần MCP
Khai báo schema Tự viết tay trong app @mcp.tool() tự sinh từ type hints
Nơi thực thi tool Trong app gọi model Trong MCP server riêng
Khám phá tool Hard-code danh sách tools session.list_tools() tại runtime
Dùng lại ở app khác Copy code Cắm thêm client, không sửa server
Vai trò Function Calling Là toàn bộ cơ chế Là lớp model bên trong MCP

MCP trong Production

Các ví dụ trên chạy tốt trên máy cá nhân, nhưng đưa vào hệ thống production cần giải quyết thêm ba vấn đề:

┌─────────────────────────────────────────────────────┐
│                  Production MCP                     │
│                                                     │
│  ┌──────────┐   ┌───────────┐   ┌───────────────┐   │
│  │ Security │   │ Registry  │   │  Versioning   │   │
│  │          │   │           │   │               │   │
│  │ • Auth   │   │ • Discover│   │ • v1 compat   │   │
│  │ • Token  │   │ • Connect │   │ • v2 features │   │
│  │ • Scopes │   │ • Health  │   │ • Deprecation │   │
│  └──────────┘   └───────────┘   └───────────────┘   │
└─────────────────────────────────────────────────────┘

1. Security — Authentication & Authorization

MCP server phục vụ qua HTTP cho nhiều client → cần xác thực. MCP SDK hỗ trợ sẵn Bearer Token verification:

  • Server: cấu hình AuthSettings + implement TokenVerifier protocol
  • Client: gửi header Authorization: Bearer qua httpx.AsyncClient
  • Không có token → 401, token sai → 403, logic tool không biết gì về auth
Tầng Demo (stdio) Production (HTTP)
Transport stdio (cùng máy) Streamable HTTP (qua mạng)
Auth Không cần Bearer token / OAuth / mTLS
Phạm vi truy cập Toàn bộ Scopes giới hạn từng client

2. Tool Registry & Discovery

Agent không hard-code tool nào. Nó hỏi Tool Registry — danh mục trung tâm liệt kê tất cả tool từ mọi server — theo yêu cầu task:

Agent nhận task "lấy thời tiết Hà Nội"
   │
   ▼
Tool Registry: "tool nào có tag 'weather'?"
   │
   ├── get_weather v1.0 → server: weather (stdio)
   └── get_weather_v2 v2.0 → server: weather-v2 (stdio)
   │
   ▼
Agent chọn best match (v2.0, không deprecated)
   │
   ▼
Kết nối tới server weather-v2, gọi get_weather_v2(city="Hanoi")

Registry là tool-centric — đơn vị khám phá là tool (tag, description, parameters), không phải server.

Hard-code (demo) Tool Registry (production)
Agent biết tool nào? Chỉ tool được code sẵn Tất cả tool trong registry
Tìm tool Theo tên cố định Theo tag, keyword, capability
Thêm tool mới Sửa code agent Thêm entry vào registry
Chọn tool Developer quyết định Agent tự chọn best match

3. Versioning & Backward Compatibility

Server v1 có get_weather(city) trả chuỗi đơn giản. V2 muốn trả JSON chi tiết, thêm include_forecast. Nếu đổi trực tiếp → mọi client cũ break. Giải pháp — 3 kỹ thuật kết hợp:

Kỹ thuật Mô tả
Tool mới song song get_weather_v2 tồn tại bên cạnh get_weather — không xoá tool cũ
Tham số optional include_forecast, units có default → client cũ gọi vẫn đúng
Server metadata Resource server://info công bố version + deprecation notice

Chi tiết + code cho cả 3 phần: xem 03-production/README.md

Tổng kết Production Checklist

Khía cạnh Dev/Demo Production
Transport stdio (cùng máy) HTTP/SSE (qua mạng)
Auth Không Bearer token, OAuth, mTLS
Discovery Hard-code tool/server Tool Registry — agent tìm tool theo task
Versioning 1 tool duy nhất Tool v1 + v2 song song, deprecation notice
Health Không Health check, retry, circuit breaker
Logging print() Structured logging, tracing (OpenTelemetry)

Tóm lại: Function Calling là cơ chế model gọi công cụ; MCP là chuẩn để kết nối model với các công cụ đó — và MCP thực chất dùng Function Calling làm nền tảng để hoạt động.

View the full README on GitHub

Install

This server does not publish a one-line install command.

Open the repository installation guide New to MCP? Start with the mcpskill.org guide →