User Authentication MCP Server Development
This tutorial demonstrates how to create an MCP Server that validates user credentials. The server
performs multiple security checks on usernames and passwords, including:
Main Components:
- Importing necessary modules (FastMCP, re, JSON)
- Creating an MCP server instance
- Defining a custom exception class
- Creating an MCP tool for user validation
- Implementing validation functions:
- Username validation (not empty, length limits, allowed characters)
- Password validation (complexity requirements: uppercase, lowercase, numbers, special
characters)
- Credential verification against stored values
- Returning validation results in JSON format
- Starting the MCP server
Code Structure:
import FastMCP
import re
import json
# Create MCP server instance
mcp = FastMCP("user_validation.demo")
# Custom exception class
class ValidationError(Exception):
pass
# Define MCP tool
@mcp.tool(NAME="VALIDATE_USER", DESCRIPTION="User validation tool with multi-layer security checks")
def VALIDATE_USER_tool(USERNAME: Union[str, int], PASSWORD: Union[str, int]):
"""User validation tool with multi-layer validation logic and type conversion"""
# Convert inputs to strings
username = str(USERNAME)
password = str(PASSWORD)
# Validation functions
validate_username(username)
validate_password(password)
check_user_credentials(username, password)
# Return success response
response = {
"status": "success",
"username": username,
"role": "admin" if username == "admin" else "user"
}
return json.dumps(response, ensure_ascii=False)
# Start the MCP server
mcp.run()
Testing the Server:
After running the server, you can test it through the web interface by:
- Opening the provided URL in a browser
- Clicking "Connect" and then "Tools"
- Selecting "List Tools" to find your VALIDATE_USER tool
- Using the tool to test username and password validation
Complete Server.py Code:
from mcp.server.fastmcp import FastMCP
import re
from typing import Union, Dict, Any
import json
# 建立 MCP 伺服器實例
mcp = FastMCP("UserAuthDemo")
class ValidationError(Exception):
"""自訂義驗證錯誤"""
def __init__(self, message: str):
self.message = message
super().__init__(self.message)
@mcp.tool(name="validate_user", description="使用者驗證工具,執行多層安全性檢查")
def validate_user_tool(username: Union[str, int], password: Union[str, int]) -> str:
"""
使用者驗證工具,包含多層驗證邏輯和型別轉換
Args:
username (str 或 int): 使用者名稱
password (str 或 int): 使用者密碼
Returns:
str: JSON 格式的驗證結果字串
Raises:
ValidationError: 當驗證失敗時
"""
try:
# 將使用者名稱和密碼轉換為字串
username = str(username).strip()
password = str(password)
# 驗證使用者名稱
_validate_username(username)
# 驗證密碼
_validate_password(password)
# 檢查使用者憑證
_check_user_credentials(username, password)
# 驗證通過,回傳使用者資訊
return json.dumps({
"status": "success",
"username": username,
"role": "admin" if username == "admin" else "user"
}, ensure_ascii=False)
except ValidationError as e:
# 統一錯誤處理
return json.dumps({
"status": "error",
"message": str(e)
}, ensure_ascii=False)
def _validate_username(username: str) -> None:
"""驗證使用者名稱的內部函數"""
# 1. 檢查使用者名稱是否為空
if not username:
raise ValidationError("使用者名稱不可為空")
# 2. 使用者名稱長度驗證
if len(username) < 3 or len(username)> 20:
raise ValidationError("使用者名稱長度必須在3-20字元之間")
# 3. 使用者名稱格式驗證(只允許英文字母、數字和底線)
if not re.match(r'^[a-zA-Z0-9_]+$', username):
raise ValidationError("使用者名稱只允許英文字母、數字和底線")
def _validate_password(password: str) -> None:
"""驗證密碼的內部函數"""
# 1. 密碼空值檢查
if not password:
raise ValidationError("密碼不可為空")
# 2. 密碼長度驗證
if len(password) < 8: raise ValidationError("密碼長度至少需要8個字元") # 3. 密碼複雜度檢查 complexity_checks=[
(r'[A-Z]', "密碼必須包含至少一個大寫字母" ), (r'[a-z]', "密碼必須包含至少一個小寫字母" ), (r'\d', "密碼必須包含至少一個數字" ),
(r'[!@#$%^&*(),.?":{}|<>]', "密碼必須包含至少一個特殊字元")
]
for pattern, message in complexity_checks:
if not re.search(pattern, password):
raise ValidationError(message)
def _check_user_credentials(username: str, password: str) -> None:
"""檢查使用者憑證的內部函數"""
# 模擬真實世界的使用者驗證
valid_users = {
"admin": "StrongPass123!",
"user": "UserPass456!"
}
if username not in valid_users or valid_users[username] != password:
raise ValidationError("無效的使用者名稱或密碼")
# 啟動 MCP HTTP 伺服器
if __name__ == "__main__":
mcp.run()
MCP 伺服器使用者認證開發教學
本教學示範如何創建一個驗證使用者帳號密碼的 MCP 伺服器。該伺服器對用戶名和密碼執行多層安全檢查,包括:
主要組件:
- 導入必要模組(FastMCP、re、JSON)
- 創建 MCP 伺服器實例
- 定義自定義異常類別
- 創建用於使用者驗證的 MCP 工具
- 實現驗證功能:
- 使用者名稱驗證(非空、長度限制、允許字符)
- 密碼驗證(複雜度要求:大寫、小寫、數字、特殊字符)
- 憑證驗證(與儲存值比對)
- 以 JSON 格式返回驗證結果
- 啟動 MCP 伺服器
程式碼結構:
import FastMCP
import re
import json
# 創建 MCP 伺服器實例
mcp = FastMCP("user_validation.demo")
# 自定義異常類別
class ValidationError(Exception):
pass
# 定義 MCP 工具
@mcp.tool(NAME="VALIDATE_USER", DESCRIPTION="使用者驗證工具,執行多層安全性檢查")
def VALIDATE_USER_tool(USERNAME: Union[str, int], PASSWORD: Union[str, int]):
"""使用者驗證工具,包含多層驗證邏輯以及類型轉換"""
# 將輸入轉換為字串
username = str(USERNAME)
password = str(PASSWORD)
# 驗證函數
validate_username(username)
validate_password(password)
check_user_credentials(username, password)
# 返回成功回應
response = {
"status": "success",
"username": username,
"role": "admin" if username == "admin" else "user"
}
return json.dumps(response, ensure_ascii=False)
# 啟動 MCP 伺服器
mcp.run()
測試伺服器:
運行伺服器後,您可以透過網頁界面進行測試:
- 在瀏覽器中打開提供的 URL
- 點擊「Connect」然後點擊「Tools」
- 選擇「List Tools」找到您的 VALIDATE_USER 工具
- 使用該工具測試用戶名和密碼驗證
完整的 Server.py 程式碼:
from mcp.server.fastmcp import FastMCP
import re
from typing import Union, Dict, Any
import json
# 建立 MCP 伺服器實例
mcp = FastMCP("UserAuthDemo")
class ValidationError(Exception):
"""自訂義驗證錯誤"""
def __init__(self, message: str):
self.message = message
super().__init__(self.message)
@mcp.tool(name="validate_user", description="使用者驗證工具,執行多層安全性檢查")
def validate_user_tool(username: Union[str, int], password: Union[str, int]) -> str:
"""
使用者驗證工具,包含多層驗證邏輯和型別轉換
Args:
username (str 或 int): 使用者名稱
password (str 或 int): 使用者密碼
Returns:
str: JSON 格式的驗證結果字串
Raises:
ValidationError: 當驗證失敗時
"""
try:
# 將使用者名稱和密碼轉換為字串
username = str(username).strip()
password = str(password)
# 驗證使用者名稱
_validate_username(username)
# 驗證密碼
_validate_password(password)
# 檢查使用者憑證
_check_user_credentials(username, password)
# 驗證通過,回傳使用者資訊
return json.dumps({
"status": "success",
"username": username,
"role": "admin" if username == "admin" else "user"
}, ensure_ascii=False)
except ValidationError as e:
# 統一錯誤處理
return json.dumps({
"status": "error",
"message": str(e)
}, ensure_ascii=False)
def _validate_username(username: str) -> None:
"""驗證使用者名稱的內部函數"""
# 1. 檢查使用者名稱是否為空
if not username:
raise ValidationError("使用者名稱不可為空")
# 2. 使用者名稱長度驗證
if len(username) < 3 or len(username)> 20:
raise ValidationError("使用者名稱長度必須在3-20字元之間")
# 3. 使用者名稱格式驗證(只允許英文字母、數字和底線)
if not re.match(r'^[a-zA-Z0-9_]+$', username):
raise ValidationError("使用者名稱只允許英文字母、數字和底線")
def _validate_password(password: str) -> None:
"""驗證密碼的內部函數"""
# 1. 密碼空值檢查
if not password:
raise ValidationError("密碼不可為空")
# 2. 密碼長度驗證
if len(password) < 8: raise ValidationError("密碼長度至少需要8個字元") # 3. 密碼複雜度檢查 complexity_checks=[
(r'[A-Z]', "密碼必須包含至少一個大寫字母" ), (r'[a-z]', "密碼必須包含至少一個小寫字母" ), (r'\d', "密碼必須包含至少一個數字" ),
(r'[!@#$%^&*(),.?":{}|<>]', "密碼必須包含至少一個特殊字元")
]
for pattern, message in complexity_checks:
if not re.search(pattern, password):
raise ValidationError(message)
def _check_user_credentials(username: str, password: str) -> None:
"""檢查使用者憑證的內部函數"""
# 模擬真實世界的使用者驗證
valid_users = {
"admin": "StrongPass123!",
"user": "UserPass456!"
}
if username not in valid_users or valid_users[username] != password:
raise ValidationError("無效的使用者名稱或密碼")
# 啟動 MCP HTTP 伺服器
if __name__ == "__main__":
mcp.run()