MCP Server User Authentication Tutorial

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:

  1. Importing necessary modules (FastMCP, re, JSON)
  2. Creating an MCP server instance
  3. Defining a custom exception class
  4. Creating an MCP tool for user validation
  5. 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
  6. Returning validation results in JSON format
  7. 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:

  1. Opening the provided URL in a browser
  2. Clicking "Connect" and then "Tools"
  3. Selecting "List Tools" to find your VALIDATE_USER tool
  4. 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 伺服器。該伺服器對用戶名和密碼執行多層安全檢查,包括:

主要組件:

  1. 導入必要模組(FastMCP、re、JSON)
  2. 創建 MCP 伺服器實例
  3. 定義自定義異常類別
  4. 創建用於使用者驗證的 MCP 工具
  5. 實現驗證功能:
    • 使用者名稱驗證(非空、長度限制、允許字符)
    • 密碼驗證(複雜度要求:大寫、小寫、數字、特殊字符)
    • 憑證驗證(與儲存值比對)
  6. 以 JSON 格式返回驗證結果
  7. 啟動 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()

測試伺服器:

運行伺服器後,您可以透過網頁界面進行測試:

  1. 在瀏覽器中打開提供的 URL
  2. 點擊「Connect」然後點擊「Tools」
  3. 選擇「List Tools」找到您的 VALIDATE_USER 工具
  4. 使用該工具測試用戶名和密碼驗證

完整的 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()