Просмотр исходного кода

feat: 完成 Admin MCP 工具扩展 - 添加 8 个新模块的管理工具

新增工具模块:
- 文件管理工具 (list, get, delete)
- 银行名称管理工具 (完整 CRUD)
- 渠道管理工具 (完整 CRUD)
- 残疾人管理工具 (完整 CRUD)
- 残疾人企业查询工具
- 平台管理工具 (完整 CRUD + 状态切换)
- 薪资管理工具 (完整 CRUD)
- 订单管理工具扩展 (添加 CUD)
- 公司管理工具扩展 (添加 CUD)

其他变更:
- 清理登录/登出工具 (Token 通过 Authorization header 预置)
- 扩展 Schema 定义 (新增 8 个模块的 Schema)
- 扩展类型定义 (新增 File, BankName, Channel, DisabledPerson, SalaryLevel 等)
- 在主入口注册所有新工具

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 3 недель назад
Родитель
Сommit
4e2937207f

+ 3 - 2
_bmad-output/implementation-artifacts/tech-spec-admin-mcp-tools-extension.md

@@ -2,8 +2,9 @@
 title: 'Admin MCP 工具扩展 - 添加缺失的管理后台功能'
 slug: 'admin-mcp-tools-extension'
 created: '2026-03-17'
-status: 'ready-for-dev'
-stepsCompleted: [1, 2, 3, 4]
+status: 'verification-complete'
+stepsCompleted: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
+verificationDate: '2026-03-18'
 tech_stack: ['TypeScript', 'Zod', 'Hono', 'Express', 'Node.js']
 files_to_modify: [
   'packages/admin-mcp-server/src/index.ts',

+ 818 - 50
packages/admin-mcp-server/src/index.ts

@@ -20,6 +20,13 @@ import { orderTools } from './tools/order-tools.js';
 import { areaTools } from './tools/area-tools.js';
 import { companyTools } from './tools/company-tools.js';
 import { authTools } from './tools/auth-tools.js';
+import { fileTools } from './tools/file-tools.js';
+import { bankNameTools } from './tools/bank-name-tools.js';
+import { channelTools } from './tools/channel-tools.js';
+import { disabilityTools } from './tools/disability-tools.js';
+import { disabilityCompanyTools } from './tools/disability-company-tools.js';
+import { platformTools } from './tools/platform-tools.js';
+import { salaryTools } from './tools/salary-tools.js';
 import { getApiClient } from './services/api-client.js';
 
 // ============================================================================
@@ -58,55 +65,7 @@ function createMcpServer(): McpServer {
  */
 function registerAllTools(targetServer: McpServer): void {
   // Authentication tools
-  registerToolWithAnnotations(
-    authTools.login,
-    { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
-    'Admin Login',
-    `Authenticate with the admin backend using username and password.
-
-This tool establishes an authenticated session by logging in to the admin system.
-The authentication token is automatically stored and used for subsequent tool calls.
-
-Args:
-  - username (string): Admin username
-  - password (string): Admin password
-
-Returns:
-  Authentication result with user information.
-
-Examples:
-  - Use when: "Login to admin system" -> params with username="admin", password="password"
-  - Use when: "I need to access the admin API" -> first call this tool
-
-Error Handling:
-  - Returns "Error: Authentication failed" if credentials are invalid
-  - Returns "Error: Cannot connect to API server" if backend is unreachable`,
-    targetServer
-  );
-
-  registerToolWithAnnotations(
-    authTools.logout,
-    { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
-    'Admin Logout',
-    `Logout from the admin backend and clear the authentication token.
-
-This tool ends the current admin session by clearing the stored authentication token.
-Subsequent API calls will require re-authentication.
-
-Args:
-  - None
-
-Returns:
-  Logout confirmation message.
-
-Examples:
-  - Use when: "Logout from admin system" or "End admin session"
-
-Error Handling:
-  - Rarely fails, mainly for client-side issues`,
-    targetServer
-  );
-
+  // Note: Token is pre-configured via Authorization header, so only getCurrentUser is available
   registerToolWithAnnotations(
     authTools.getCurrentUser,
     { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
@@ -116,6 +75,9 @@ Error Handling:
 This tool returns details about the user that is currently logged in,
 including their roles, permissions, and profile information.
 
+Note: Authentication is handled via Authorization header. This tool only
+verifies the current token and returns user information.
+
 Args:
   - None
 
@@ -127,7 +89,7 @@ Examples:
   - Use when: "Check my admin permissions"
 
 Error Handling:
-  - Returns "Error: Authentication failed" if not logged in`,
+  - Returns "Error: Authentication failed" if token is invalid`,
     targetServer
   );
 
@@ -572,6 +534,74 @@ Returns:
 Examples:
   - Use when: "Get order with ID 12345" -> params with id=12345
 
+Error Handling:
+  - Returns "Error: Resource not found" if order ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    orderTools.orderCreate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
+    'Create Order',
+    `Create a new order in the admin system.
+
+Args:
+  - companyId (number): Company ID (required)
+  - platformId (number): Platform ID (optional)
+  - orderAmount (number): Order amount (required)
+  - userId (number): User ID (optional)
+  - deliveryAddressId (number): Delivery address ID (optional)
+
+Returns:
+  Created order information with ID.
+
+Examples:
+  - Use when: "Create a new order" -> params with companyId=1, orderAmount=1000
+
+Error Handling:
+  - Returns "Error: Data validation failed" if parameters are invalid`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    orderTools.orderUpdate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Update Order',
+    `Update an existing order.
+
+Args:
+  - id (number): Order ID to update (required)
+  - companyId (number): Company ID (optional)
+  - platformId (number): Platform ID (optional)
+  - orderAmount (number): Order amount (optional)
+  - status (string): Order status (optional)
+
+Returns:
+  Updated order information.
+
+Examples:
+  - Use when: "Update order 1" -> params with id=1, status="completed"
+
+Error Handling:
+  - Returns "Error: Resource not found" if order ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    orderTools.orderDelete,
+    { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
+    'Delete Order',
+    `Delete an order by ID.
+
+Args:
+  - id (number): Order ID to delete (required)
+
+Returns:
+  Deletion confirmation.
+
+Examples:
+  - Use when: "Delete order with ID 1" -> params with id=1
+
 Error Handling:
   - Returns "Error: Resource not found" if order ID doesn't exist`,
     targetServer
@@ -849,6 +879,744 @@ Error Handling:
   - Returns "Error: Resource not found" if company ID doesn't exist`,
     targetServer
   );
+
+  // ============================================================================
+  // File Management Tools
+  // ============================================================================
+
+  registerToolWithAnnotations(
+    fileTools.fileList,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
+    'List Files',
+    `List and search files with pagination and filtering.
+
+This tool retrieves a paginated list of files from the admin system.
+
+Args:
+  - page (number): Page number, starting from 1 (default: 1)
+  - pageSize (number): Number of items per page, 1-100 (default: 20)
+  - keyword (string): Optional search keyword
+  - sortBy (string): Optional field to sort by
+  - sortOrder (string): Sort direction: "ASC" or "DESC" (default: "DESC")
+  - filters (string): Optional filter conditions as JSON string
+  - response_format (string): Output format: "markdown" or "json" (default: "markdown")
+
+Returns:
+  Paginated list of files with total count.
+
+Examples:
+  - Use when: "List all files" -> default parameters
+
+Error Handling:
+  - Returns "Error: Permission denied" if not authorized`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    fileTools.fileGet,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Get File by ID',
+    `Retrieve detailed information about a specific file by ID.
+
+Args:
+  - id (number): File ID (required)
+
+Returns:
+  Complete file information.
+
+Examples:
+  - Use when: "Get file with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if file ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    fileTools.fileDelete,
+    { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
+    'Delete File',
+    `Delete a file by ID.
+
+Args:
+  - id (number): File ID to delete (required)
+
+Returns:
+  Deletion confirmation.
+
+Examples:
+  - Use when: "Delete file with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if file ID doesn't exist`,
+    targetServer
+  );
+
+  // ============================================================================
+  // Bank Name Management Tools
+  // ============================================================================
+
+  registerToolWithAnnotations(
+    bankNameTools.bankNameList,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
+    'List Bank Names',
+    `List and search bank names with pagination.
+
+This tool retrieves a paginated list of bank names from the admin system.
+
+Args:
+  - page (number): Page number, starting from 1 (default: 1)
+  - pageSize (number): Number of items per page, 1-100 (default: 20)
+  - keyword (string): Optional search keyword (optional)
+  - sortBy (string): Optional field to sort by (optional)
+  - sortOrder (string): Sort direction: "ASC" or "DESC" (default: "DESC")
+  - filters (string): Optional filter conditions as JSON string (optional)
+  - response_format (string): Output format: "markdown" or "json" (default: "markdown")
+
+Returns:
+  Paginated list of bank names with total count.
+
+Examples:
+  - Use when: "List all bank names" -> default parameters
+
+Error Handling:
+  - Returns "Error: Permission denied" if not authorized`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    bankNameTools.bankNameGet,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Get Bank Name by ID',
+    `Retrieve detailed information about a specific bank name by ID.
+
+Args:
+  - id (number): Bank name ID (required)
+
+Returns:
+  Complete bank name information.
+
+Examples:
+  - Use when: "Get bank name with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if bank name ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    bankNameTools.bankNameCreate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
+    'Create Bank Name',
+    `Create a new bank name in the admin system.
+
+Args:
+  - name (string): Bank name (required)
+  - code (string): Bank code (required)
+  - status (number): Status: 0 = disabled, 1 = enabled (optional)
+
+Returns:
+  Created bank name information with ID.
+
+Examples:
+  - Use when: "Create a new bank name" -> params with name="ICBC", code="ICBC"
+
+Error Handling:
+  - Returns "Error: Data already exists" if bank name code is duplicated`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    bankNameTools.bankNameUpdate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Update Bank Name',
+    `Update an existing bank name.
+
+Args:
+  - id (number): Bank name ID to update (required)
+  - name (string): Bank name (optional)
+  - code (string): Bank code (optional)
+  - status (number): Status (optional)
+
+Returns:
+  Updated bank name information.
+
+Examples:
+  - Use when: "Update bank name 1 status" -> params with id=1, status=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if bank name ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    bankNameTools.bankNameDelete,
+    { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
+    'Delete Bank Name',
+    `Delete a bank name by ID.
+
+Args:
+  - id (number): Bank name ID to delete (required)
+
+Returns:
+  Deletion confirmation.
+
+Examples:
+  - Use when: "Delete bank name with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if bank name ID doesn't exist`,
+    targetServer
+  );
+
+  // ============================================================================
+  // Channel Management Tools
+  // ============================================================================
+
+  registerToolWithAnnotations(
+    channelTools.channelList,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
+    'List Channels',
+    `List and search channels with pagination.
+
+This tool retrieves a paginated list of channels from the admin system.
+
+Args:
+  - skip (number): Skip records (default: 0)
+  - take (number): Take records, 1-100 (default: 20)
+  - response_format (string): Output format: "markdown" or "json" (default: "markdown")
+
+Returns:
+  Paginated list of channels with total count.
+
+Examples:
+  - Use when: "List all channels" -> default parameters
+
+Error Handling:
+  - Returns "Error: Permission denied" if not authorized`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    channelTools.channelGet,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Get Channel by ID',
+    `Retrieve detailed information about a specific channel by ID.
+
+Args:
+  - id (number): Channel ID (required)
+
+Returns:
+  Complete channel information.
+
+Examples:
+  - Use when: "Get channel with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if channel ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    channelTools.channelCreate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
+    'Create Channel',
+    `Create a new channel in the admin system.
+
+Args:
+  - channelName (string): Channel name (required)
+  - channelType (string): Channel type (optional)
+  - contactPerson (string): Contact person (optional)
+  - contactPhone (string): Contact phone (optional)
+  - description (string): Description (optional)
+
+Returns:
+  Created channel information with ID.
+
+Examples:
+  - Use when: "Create a new channel" -> params with channelName="Online"
+
+Error Handling:
+  - Returns "Error: Data already exists" if channel name is duplicated`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    channelTools.channelUpdate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Update Channel',
+    `Update an existing channel.
+
+Args:
+  - id (number): Channel ID to update (required)
+  - channelName (string): Channel name (optional)
+  - channelType (string): Channel type (optional)
+  - contactPerson (string): Contact person (optional)
+  - contactPhone (string): Contact phone (optional)
+  - description (string): Description (optional)
+
+Returns:
+  Updated channel information.
+
+Examples:
+  - Use when: "Update channel 1" -> params with id=1, channelName="Online Store"
+
+Error Handling:
+  - Returns "Error: Resource not found" if channel ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    channelTools.channelDelete,
+    { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
+    'Delete Channel',
+    `Delete a channel by ID.
+
+Args:
+  - id (number): Channel ID to delete (required)
+
+Returns:
+  Deletion confirmation.
+
+Examples:
+  - Use when: "Delete channel with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if channel ID doesn't exist`,
+    targetServer
+  );
+
+  // ============================================================================
+  // Disabled Person Management Tools
+  // ============================================================================
+
+  registerToolWithAnnotations(
+    disabilityTools.disabledPersonList,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
+    'List Disabled Persons',
+    `List and search disabled persons with pagination.
+
+This tool retrieves a paginated list of disabled persons from the admin system.
+
+Args:
+  - skip (number): Skip records (default: 0)
+  - take (number): Take records, 1-100 (default: 20)
+  - response_format (string): Output format: "markdown" or "json" (default: "markdown")
+
+Returns:
+  Paginated list of disabled persons with total count.
+
+Examples:
+  - Use when: "List all disabled persons" -> default parameters
+
+Error Handling:
+  - Returns "Error: Permission denied" if not authorized`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    disabilityTools.disabledPersonGet,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Get Disabled Person by ID',
+    `Retrieve detailed information about a specific disabled person by ID.
+
+Args:
+  - id (number): Disabled person ID (required)
+
+Returns:
+  Complete disabled person information.
+
+Examples:
+  - Use when: "Get disabled person with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if disabled person ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    disabilityTools.disabledPersonCreate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
+    'Create Disabled Person',
+    `Create a new disabled person in the admin system.
+
+Args:
+  - name (string): Name (required)
+  - idCard (string): ID Card number (required)
+  - disabilityCertNo (string): Disability certificate number (required)
+  - disabilityType (string): Disability type (optional)
+  - disabilityLevel (string): Disability level (optional)
+  - phone (string): Phone number (optional)
+  - gender (string): Gender (optional)
+  - city (string): City (optional)
+  - district (string): District (optional)
+  - companyId (number): Company ID (optional)
+  - platformId (number): Platform ID (optional)
+  - status (number): Status: 0 = disabled, 1 = enabled (optional)
+
+Returns:
+  Created disabled person information with ID.
+
+Examples:
+  - Use when: "Create a new disabled person" -> params with name="John", idCard="...", disabilityCertNo="..."
+
+Error Handling:
+  - Returns "Error: Data already exists" if ID card is duplicated`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    disabilityTools.disabledPersonUpdate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Update Disabled Person',
+    `Update an existing disabled person.
+
+Args:
+  - id (number): Disabled person ID to update (required)
+  - name (string): Name (optional)
+  - idCard (string): ID Card number (optional)
+  - disabilityCertNo (string): Disability certificate number (optional)
+  - disabilityType (string): Disability type (optional)
+  - disabilityLevel (string): Disability level (optional)
+  - phone (string): Phone number (optional)
+  - gender (string): Gender (optional)
+  - city (string): City (optional)
+  - district (string): District (optional)
+  - companyId (number): Company ID (optional)
+  - platformId (number): Platform ID (optional)
+  - status (number): Status (optional)
+
+Returns:
+  Updated disabled person information.
+
+Examples:
+  - Use when: "Update disabled person 1" -> params with id=1, name="John"
+
+Error Handling:
+  - Returns "Error: Resource not found" if disabled person ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    disabilityTools.disabledPersonDelete,
+    { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
+    'Delete Disabled Person',
+    `Delete a disabled person by ID.
+
+Args:
+  - id (number): Disabled person ID to delete (required)
+
+Returns:
+  Deletion confirmation.
+
+Examples:
+  - Use when: "Delete disabled person with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if disabled person ID doesn't exist`,
+    targetServer
+  );
+
+  // ============================================================================
+  // Disability Company Query Tools
+  // ============================================================================
+
+  registerToolWithAnnotations(
+    disabilityCompanyTools.queryDisabilityCompany,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
+    'Query Disabled Persons with Company',
+    `Query disabled persons with their company information using multiple filters.
+
+This is a read-only query tool for finding disabled persons and their associated companies.
+
+Args:
+  - name (string): Person name for search (optional)
+  - idCard (string): ID Card number (optional)
+  - companyName (string): Company name (optional)
+  - gender (string): Gender (optional)
+  - disabilityType (string): Disability type (optional)
+  - disabilityLevel (string): Disability level (optional)
+  - minAge (number): Minimum age (optional)
+  - maxAge (number): Maximum age (optional)
+  - city (string): City (optional)
+  - district (string): District (optional)
+  - companyId (number): Company ID (optional)
+  - platformId (number): Platform ID (optional)
+  - skip (number): Skip records (default: 0)
+  - take (number): Take records, 1-100 (default: 20)
+  - response_format (string): Output format: "markdown" or "json" (default: "markdown")
+
+Returns:
+  Query results with matching disabled persons and their company information.
+
+Examples:
+  - Use when: "Find disabled persons by company name" -> params with companyName="ABC Corp"
+  - Use when: "Query disabled persons in a city" -> params with city="Beijing"
+
+Error Handling:
+  - Returns "Error: Permission denied" if not authorized`,
+    targetServer
+  );
+
+  // ============================================================================
+  // Platform Management Tools
+  // ============================================================================
+
+  registerToolWithAnnotations(
+    platformTools.platformList,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
+    'List Platforms',
+    `List and search platforms with pagination.
+
+This tool retrieves a paginated list of platforms from the admin system.
+
+Args:
+  - skip (number): Skip records (default: 0)
+  - take (number): Take records, 1-100 (default: 20)
+  - response_format (string): Output format: "markdown" or "json" (default: "markdown")
+
+Returns:
+  Paginated list of platforms with total count.
+
+Examples:
+  - Use when: "List all platforms" -> default parameters
+
+Error Handling:
+  - Returns "Error: Permission denied" if not authorized`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    platformTools.platformGet,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Get Platform by ID',
+    `Retrieve detailed information about a specific platform by ID.
+
+Args:
+  - id (number): Platform ID (required)
+
+Returns:
+  Complete platform information.
+
+Examples:
+  - Use when: "Get platform with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if platform ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    platformTools.platformCreate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
+    'Create Platform',
+    `Create a new platform in the admin system.
+
+Args:
+  - platformName (string): Platform name (required)
+  - contactPerson (string): Contact person (optional)
+  - contactPhone (string): Contact phone (optional)
+  - contactEmail (string): Contact email (optional)
+
+Returns:
+  Created platform information with ID.
+
+Examples:
+  - Use when: "Create a new platform" -> params with platformName="New Platform"
+
+Error Handling:
+  - Returns "Error: Data already exists" if platform name is duplicated`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    platformTools.platformUpdate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Update Platform',
+    `Update an existing platform.
+
+Args:
+  - id (number): Platform ID to update (required)
+  - platformName (string): Platform name (optional)
+  - contactPerson (string): Contact person (optional)
+  - contactPhone (string): Contact phone (optional)
+  - contactEmail (string): Contact email (optional)
+
+Returns:
+  Updated platform information.
+
+Examples:
+  - Use when: "Update platform 1" -> params with id=1, platformName="Updated Name"
+
+Error Handling:
+  - Returns "Error: Resource not found" if platform ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    platformTools.platformDelete,
+    { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
+    'Delete Platform',
+    `Delete a platform by ID.
+
+Args:
+  - id (number): Platform ID to delete (required)
+
+Returns:
+  Deletion confirmation.
+
+Examples:
+  - Use when: "Delete platform with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if platform ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    platformTools.platformToggleStatus,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Toggle Platform Status',
+    `Toggle the status of a platform (enabled/disabled).
+
+This tool switches the platform status between enabled (1) and disabled (0).
+
+Args:
+  - id (number): Platform ID (required)
+
+Returns:
+  Updated platform with new status.
+
+Examples:
+  - Use when: "Toggle platform 1 status" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if platform ID doesn't exist`,
+    targetServer
+  );
+
+  // ============================================================================
+  // Salary Level Management Tools
+  // ============================================================================
+
+  registerToolWithAnnotations(
+    salaryTools.salaryList,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
+    'List Salary Levels',
+    `List and search salary levels with pagination.
+
+This tool retrieves a paginated list of salary levels from the admin system.
+
+Args:
+  - skip (number): Skip records (default: 0)
+  - take (number): Take records, 1-100 (default: 20)
+  - response_format (string): Output format: "markdown" or "json" (default: "markdown")
+
+Returns:
+  Paginated list of salary levels with total count.
+
+Examples:
+  - Use when: "List all salary levels" -> default parameters
+
+Error Handling:
+  - Returns "Error: Permission denied" if not authorized`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    salaryTools.salaryGet,
+    { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Get Salary Level by ID',
+    `Retrieve detailed information about a specific salary level by ID.
+
+Args:
+  - id (number): Salary level ID (required)
+
+Returns:
+  Complete salary level information.
+
+Examples:
+  - Use when: "Get salary level with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if salary level ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    salaryTools.salaryCreate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
+    'Create Salary Level',
+    `Create a new salary level in the admin system.
+
+Args:
+  - provinceId (number): Province ID (optional)
+  - cityId (number): City ID (optional)
+  - districtId (number): District ID (optional)
+  - baseSalary (number): Base salary (optional)
+  - allowance (number): Allowance (optional)
+  - insurance (number): Insurance (optional)
+  - providentFund (number): Provident fund (optional)
+  - totalSalary (number): Total salary (optional)
+
+Returns:
+  Created salary level information with ID.
+
+Examples:
+  - Use when: "Create a new salary level" -> params with baseSalary=5000, totalSalary=6000
+
+Error Handling:
+  - Returns "Error: Data already exists" if salary level for location exists`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    salaryTools.salaryUpdate,
+    { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
+    'Update Salary Level',
+    `Update an existing salary level.
+
+Args:
+  - id (number): Salary level ID to update (required)
+  - provinceId (number): Province ID (optional)
+  - cityId (number): City ID (optional)
+  - districtId (number): District ID (optional)
+  - baseSalary (number): Base salary (optional)
+  - allowance (number): Allowance (optional)
+  - insurance (number): Insurance (optional)
+  - providentFund (number): Provident fund (optional)
+  - totalSalary (number): Total salary (optional)
+
+Returns:
+  Updated salary level information.
+
+Examples:
+  - Use when: "Update salary level 1" -> params with id=1, baseSalary=5500
+
+Error Handling:
+  - Returns "Error: Resource not found" if salary level ID doesn't exist`,
+    targetServer
+  );
+
+  registerToolWithAnnotations(
+    salaryTools.salaryDelete,
+    { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
+    'Delete Salary Level',
+    `Delete a salary level by ID.
+
+Args:
+  - id (number): Salary level ID to delete (required)
+
+Returns:
+  Deletion confirmation.
+
+Examples:
+  - Use when: "Delete salary level with ID 1" -> params with id=1
+
+Error Handling:
+  - Returns "Error: Resource not found" if salary level ID doesn't exist`,
+    targetServer
+  );
 }
 
 // ============================================================================

+ 860 - 0
packages/admin-mcp-server/src/schemas/index.ts

@@ -660,6 +660,833 @@ export const CompanyUpdateInputSchema = z
  */
 export const CompanyDeleteInputSchema = ResourceIdSchema;
 
+// ============================================================================
+// File Schemas
+// ============================================================================
+
+/**
+ * File list input schema
+ */
+export const FileListInputSchema = ListQuerySchema;
+
+/**
+ * File get input schema
+ */
+export const FileGetInputSchema = ResourceIdSchema;
+
+/**
+ * File delete input schema
+ */
+export const FileDeleteInputSchema = ResourceIdSchema;
+
+// ============================================================================
+// Bank Name Schemas
+// ============================================================================
+
+/**
+ * Bank name list input schema
+ */
+export const BankNameListInputSchema = ListQuerySchema;
+
+/**
+ * Bank name get input schema
+ */
+export const BankNameGetInputSchema = ResourceIdSchema;
+
+/**
+ * Bank name create input schema
+ */
+export const BankNameCreateInputSchema = z
+  .object({
+    name: z
+      .string()
+      .min(1, 'Bank name is required')
+      .max(100, 'Bank name cannot exceed 100 characters')
+      .describe('Bank name (required)'),
+    code: z
+      .string()
+      .min(1, 'Bank code is required')
+      .max(20, 'Bank code cannot exceed 20 characters')
+      .describe('Bank code (required)'),
+    status: z
+      .number()
+      .int()
+      .min(0)
+      .max(1)
+      .optional()
+      .describe('Status: 0 = disabled, 1 = enabled')
+  })
+  .strict();
+
+/**
+ * Bank name update input schema
+ */
+export const BankNameUpdateInputSchema = z
+  .object({
+    id: z
+      .number()
+      .int()
+      .positive('ID must be a positive integer')
+      .describe('Bank name ID to update'),
+    name: z
+      .string()
+      .min(1, 'Bank name is required')
+      .max(100, 'Bank name cannot exceed 100 characters')
+      .optional()
+      .describe('Bank name'),
+    code: z
+      .string()
+      .min(1, 'Bank code is required')
+      .max(20, 'Bank code cannot exceed 20 characters')
+      .optional()
+      .describe('Bank code'),
+    status: z
+      .number()
+      .int()
+      .min(0)
+      .max(1)
+      .optional()
+      .describe('Status: 0 = disabled, 1 = enabled')
+  })
+  .strict();
+
+/**
+ * Bank name delete input schema
+ */
+export const BankNameDeleteInputSchema = ResourceIdSchema;
+
+// ============================================================================
+// Channel Schemas
+// ============================================================================
+
+/**
+ * Channel list input schema (uses skip/take for pagination)
+ */
+export const ChannelListInputSchema = z
+  .object({
+    skip: z
+      .number()
+      .int()
+      .min(0)
+      .default(0)
+      .optional()
+      .describe('Skip records'),
+    take: z
+      .number()
+      .int()
+      .min(1)
+      .max(100)
+      .default(20)
+      .optional()
+      .describe('Take records'),
+    response_format: ResponseFormatSchema.default(ResponseFormat.MARKDOWN)
+  })
+  .strict();
+
+/**
+ * Channel get input schema
+ */
+export const ChannelGetInputSchema = z
+  .object({
+    id: z
+      .number()
+      .int()
+      .positive('ID must be a positive integer')
+      .describe('Channel ID')
+  })
+  .strict();
+
+/**
+ * Channel create input schema
+ */
+export const ChannelCreateInputSchema = z
+  .object({
+    channelName: z
+      .string()
+      .min(1, 'Channel name is required')
+      .max(100, 'Channel name cannot exceed 100 characters')
+      .describe('Channel name (required)'),
+    channelType: z
+      .string()
+      .max(50, 'Channel type cannot exceed 50 characters')
+      .optional()
+      .describe('Channel type'),
+    contactPerson: z
+      .string()
+      .max(50, 'Contact person cannot exceed 50 characters')
+      .optional()
+      .describe('Contact person'),
+    contactPhone: z
+      .string()
+      .max(20, 'Contact phone cannot exceed 20 characters')
+      .optional()
+      .describe('Contact phone'),
+    description: z
+      .string()
+      .optional()
+      .describe('Description')
+  })
+  .strict();
+
+/**
+ * Channel update input schema
+ */
+export const ChannelUpdateInputSchema = z
+  .object({
+    id: z
+      .number()
+      .int()
+      .positive('ID must be a positive integer')
+      .describe('Channel ID to update'),
+    channelName: z
+      .string()
+      .min(1, 'Channel name is required')
+      .max(100, 'Channel name cannot exceed 100 characters')
+      .optional()
+      .describe('Channel name'),
+    channelType: z
+      .string()
+      .max(50, 'Channel type cannot exceed 50 characters')
+      .optional()
+      .describe('Channel type'),
+    contactPerson: z
+      .string()
+      .max(50, 'Contact person cannot exceed 50 characters')
+      .optional()
+      .describe('Contact person'),
+    contactPhone: z
+      .string()
+      .max(20, 'Contact phone cannot exceed 20 characters')
+      .optional()
+      .describe('Contact phone'),
+    description: z
+      .string()
+      .optional()
+      .describe('Description')
+  })
+  .strict();
+
+/**
+ * Channel delete input schema
+ */
+export const ChannelDeleteInputSchema = z
+  .object({
+    id: z
+      .number()
+      .int()
+      .positive('ID must be a positive integer')
+      .describe('Channel ID to delete')
+  })
+  .strict();
+
+// ============================================================================
+// Disabled Person Schemas
+// ============================================================================
+
+/**
+ * Disabled person list input schema (uses skip/take for pagination)
+ */
+export const DisabledPersonListInputSchema = z
+  .object({
+    skip: z
+      .number()
+      .int()
+      .min(0)
+      .default(0)
+      .optional()
+      .describe('Skip records'),
+    take: z
+      .number()
+      .int()
+      .min(1)
+      .max(100)
+      .default(20)
+      .optional()
+      .describe('Take records'),
+    response_format: ResponseFormatSchema.default(ResponseFormat.MARKDOWN)
+  })
+  .strict();
+
+/**
+ * Disabled person get input schema
+ */
+export const DisabledPersonGetInputSchema = ResourceIdSchema;
+
+/**
+ * Disabled person create input schema
+ */
+export const DisabledPersonCreateInputSchema = z
+  .object({
+    name: z
+      .string()
+      .min(1, 'Name is required')
+      .max(50, 'Name cannot exceed 50 characters')
+      .describe('Name (required)'),
+    idCard: z
+      .string()
+      .regex(/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/, 'Invalid ID Card number')
+      .describe('ID Card number'),
+    disabilityCertNo: z
+      .string()
+      .min(1, 'Disability certificate number is required')
+      .describe('Disability certificate number (required)'),
+    disabilityType: z
+      .string()
+      .optional()
+      .describe('Disability type'),
+    disabilityLevel: z
+      .string()
+      .optional()
+      .describe('Disability level'),
+    phone: z
+      .string()
+      .regex(/^1[3-9]\d{9}$/, 'Invalid phone number format')
+      .optional()
+      .describe('Phone number'),
+    gender: z
+      .string()
+      .optional()
+      .describe('Gender'),
+    birthday: z
+      .coerce
+      .date()
+      .optional()
+      .describe('Birthday'),
+    address: z
+      .string()
+      .optional()
+      .describe('Address'),
+    city: z
+      .string()
+      .optional()
+      .describe('City'),
+    district: z
+      .string()
+      .optional()
+      .describe('District'),
+    companyId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Company ID'),
+    platformId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Platform ID'),
+    status: z
+      .number()
+      .int()
+      .min(0)
+      .max(1)
+      .optional()
+      .describe('Status: 0 = disabled, 1 = enabled')
+  })
+  .strict();
+
+/**
+ * Disabled person update input schema
+ */
+export const DisabledPersonUpdateInputSchema = z
+  .object({
+    id: z
+      .number()
+      .int()
+      .positive('ID must be a positive integer')
+      .describe('Disabled person ID to update'),
+    name: z
+      .string()
+      .min(1, 'Name is required')
+      .max(50, 'Name cannot exceed 50 characters')
+      .optional()
+      .describe('Name'),
+    idCard: z
+      .string()
+      .regex(/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/, 'Invalid ID Card number')
+      .optional()
+      .describe('ID Card number'),
+    disabilityCertNo: z
+      .string()
+      .min(1, 'Disability certificate number is required')
+      .optional()
+      .describe('Disability certificate number'),
+    disabilityType: z
+      .string()
+      .optional()
+      .describe('Disability type'),
+    disabilityLevel: z
+      .string()
+      .optional()
+      .describe('Disability level'),
+    phone: z
+      .string()
+      .regex(/^1[3-9]\d{9}$/, 'Invalid phone number format')
+      .optional()
+      .describe('Phone number'),
+    gender: z
+      .string()
+      .optional()
+      .describe('Gender'),
+    birthday: z
+      .coerce
+      .date()
+      .optional()
+      .describe('Birthday'),
+    address: z
+      .string()
+      .optional()
+      .describe('Address'),
+    city: z
+      .string()
+      .optional()
+      .describe('City'),
+    district: z
+      .string()
+      .optional()
+      .describe('District'),
+    companyId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Company ID'),
+    platformId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Platform ID'),
+    status: z
+      .number()
+      .int()
+      .min(0)
+      .max(1)
+      .optional()
+      .describe('Status: 0 = disabled, 1 = enabled')
+  })
+  .strict();
+
+/**
+ * Disabled person delete input schema
+ */
+export const DisabledPersonDeleteInputSchema = ResourceIdSchema;
+
+// ============================================================================
+// Disability Company Query Schemas
+// ============================================================================
+
+/**
+ * Disability company query input schema
+ */
+export const DisabilityCompanyQueryInputSchema = z
+  .object({
+    name: z
+      .string()
+      .optional()
+      .describe('Person name for search'),
+    idCard: z
+      .string()
+      .optional()
+      .describe('ID Card number'),
+    companyName: z
+      .string()
+      .optional()
+      .describe('Company name'),
+    gender: z
+      .string()
+      .optional()
+      .describe('Gender'),
+    disabilityType: z
+      .string()
+      .optional()
+      .describe('Disability type'),
+    disabilityLevel: z
+      .string()
+      .optional()
+      .describe('Disability level'),
+    minAge: z
+      .number()
+      .int()
+      .min(0)
+      .optional()
+      .describe('Minimum age'),
+    maxAge: z
+      .number()
+      .int()
+      .min(0)
+      .optional()
+      .describe('Maximum age'),
+    city: z
+      .string()
+      .optional()
+      .describe('City'),
+    district: z
+      .string()
+      .optional()
+      .describe('District'),
+    companyId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Company ID'),
+    platformId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Platform ID'),
+    skip: z
+      .number()
+      .int()
+      .min(0)
+      .default(0)
+      .optional()
+      .describe('Skip records'),
+    take: z
+      .number()
+      .int()
+      .min(1)
+      .max(100)
+      .default(20)
+      .optional()
+      .describe('Take records'),
+    response_format: ResponseFormatSchema.default(ResponseFormat.MARKDOWN)
+  })
+  .strict();
+
+// ============================================================================
+// Platform Schemas
+// ============================================================================
+
+/**
+ * Platform list input schema (uses skip/take for pagination)
+ */
+export const PlatformListInputSchema = z
+  .object({
+    skip: z
+      .number()
+      .int()
+      .min(0)
+      .default(0)
+      .optional()
+      .describe('Skip records'),
+    take: z
+      .number()
+      .int()
+      .min(1)
+      .max(100)
+      .default(20)
+      .optional()
+      .describe('Take records'),
+    response_format: ResponseFormatSchema.default(ResponseFormat.MARKDOWN)
+  })
+  .strict();
+
+/**
+ * Platform get input schema
+ */
+export const PlatformGetInputSchema = ResourceIdSchema;
+
+/**
+ * Platform create input schema
+ */
+export const PlatformCreateInputSchema = z
+  .object({
+    platformName: z
+      .string()
+      .min(1, 'Platform name is required')
+      .max(100, 'Platform name cannot exceed 100 characters')
+      .describe('Platform name (required)'),
+    contactPerson: z
+      .string()
+      .max(50, 'Contact person cannot exceed 50 characters')
+      .optional()
+      .describe('Contact person'),
+    contactPhone: z
+      .string()
+      .max(20, 'Contact phone cannot exceed 20 characters')
+      .optional()
+      .describe('Contact phone'),
+    contactEmail: z
+      .string()
+      .email('Invalid email format')
+      .max(100, 'Contact email cannot exceed 100 characters')
+      .optional()
+      .describe('Contact email')
+  })
+  .strict();
+
+/**
+ * Platform update input schema
+ */
+export const PlatformUpdateInputSchema = z
+  .object({
+    id: z
+      .number()
+      .int()
+      .positive('ID must be a positive integer')
+      .describe('Platform ID to update'),
+    platformName: z
+      .string()
+      .min(1, 'Platform name is required')
+      .max(100, 'Platform name cannot exceed 100 characters')
+      .optional()
+      .describe('Platform name'),
+    contactPerson: z
+      .string()
+      .max(50, 'Contact person cannot exceed 50 characters')
+      .optional()
+      .describe('Contact person'),
+    contactPhone: z
+      .string()
+      .max(20, 'Contact phone cannot exceed 20 characters')
+      .optional()
+      .describe('Contact phone'),
+    contactEmail: z
+      .string()
+      .email('Invalid email format')
+      .max(100, 'Contact email cannot exceed 100 characters')
+      .optional()
+      .describe('Contact email')
+  })
+  .strict();
+
+/**
+ * Platform delete input schema
+ */
+export const PlatformDeleteInputSchema = ResourceIdSchema;
+
+/**
+ * Platform toggle status input schema
+ */
+export const PlatformToggleStatusInputSchema = ResourceIdSchema;
+
+// ============================================================================
+// Salary Schemas
+// ============================================================================
+
+/**
+ * Salary list input schema (uses skip/take for pagination)
+ */
+export const SalaryListInputSchema = z
+  .object({
+    skip: z
+      .number()
+      .int()
+      .min(0)
+      .default(0)
+      .optional()
+      .describe('Skip records'),
+    take: z
+      .number()
+      .int()
+      .min(1)
+      .max(100)
+      .default(20)
+      .optional()
+      .describe('Take records'),
+    response_format: ResponseFormatSchema.default(ResponseFormat.MARKDOWN)
+  })
+  .strict();
+
+/**
+ * Salary get input schema
+ */
+export const SalaryGetInputSchema = ResourceIdSchema;
+
+/**
+ * Salary create input schema
+ */
+export const SalaryCreateInputSchema = z
+  .object({
+    provinceId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Province ID'),
+    cityId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('City ID'),
+    districtId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('District ID'),
+    baseSalary: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Base salary'),
+    allowance: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Allowance'),
+    insurance: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Insurance'),
+    providentFund: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Provident fund'),
+    totalSalary: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Total salary')
+  })
+  .strict();
+
+/**
+ * Salary update input schema
+ */
+export const SalaryUpdateInputSchema = z
+  .object({
+    id: z
+      .number()
+      .int()
+      .positive('ID must be a positive integer')
+      .describe('Salary level ID to update'),
+    provinceId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Province ID'),
+    cityId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('City ID'),
+    districtId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('District ID'),
+    baseSalary: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Base salary'),
+    allowance: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Allowance'),
+    insurance: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Insurance'),
+    providentFund: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Provident fund'),
+    totalSalary: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Total salary')
+  })
+  .strict();
+
+/**
+ * Salary delete input schema
+ */
+export const SalaryDeleteInputSchema = ResourceIdSchema;
+
+// ============================================================================
+// Order Additional Schemas (Create/Update/Delete)
+// ============================================================================
+
+/**
+ * Order create input schema
+ */
+export const OrderCreateInputSchema = z
+  .object({
+    companyId: z
+      .number()
+      .int()
+      .positive('Company ID is required')
+      .describe('Company ID (required)'),
+    platformId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Platform ID'),
+    orderAmount: z
+      .number()
+      .nonnegative('Order amount must be non-negative')
+      .describe('Order amount (required)'),
+    userId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('User ID'),
+    deliveryAddressId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Delivery address ID')
+  })
+  .strict();
+
+/**
+ * Order update input schema
+ */
+export const OrderUpdateInputSchema = z
+  .object({
+    id: z
+      .number()
+      .int()
+      .positive('ID must be a positive integer')
+      .describe('Order ID to update'),
+    companyId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Company ID'),
+    platformId: z
+      .number()
+      .int()
+      .positive()
+      .optional()
+      .describe('Platform ID'),
+    orderAmount: z
+      .number()
+      .nonnegative()
+      .optional()
+      .describe('Order amount'),
+    status: z
+      .string()
+      .optional()
+      .describe('Order status')
+  })
+  .strict();
+
+/**
+ * Order delete input schema
+ */
+export const OrderDeleteInputSchema = ResourceIdSchema;
+
 // ============================================================================
 // Export all schema types
 // ============================================================================
@@ -683,6 +1510,9 @@ export type SystemConfigUpdateInput = z.infer<typeof SystemConfigUpdateInputSche
 export type SystemConfigDeleteInput = z.infer<typeof SystemConfigDeleteInputSchema>;
 export type OrderListInput = z.infer<typeof OrderListInputSchema>;
 export type OrderGetInput = z.infer<typeof OrderGetInputSchema>;
+export type OrderCreateInput = z.infer<typeof OrderCreateInputSchema>;
+export type OrderUpdateInput = z.infer<typeof OrderUpdateInputSchema>;
+export type OrderDeleteInput = z.infer<typeof OrderDeleteInputSchema>;
 export type AreaListInput = z.infer<typeof AreaListInputSchema>;
 export type AreaGetInput = z.infer<typeof AreaGetInputSchema>;
 export type AreaCreateInput = z.infer<typeof AreaCreateInputSchema>;
@@ -693,3 +1523,33 @@ export type CompanyGetInput = z.infer<typeof CompanyGetInputSchema>;
 export type CompanyCreateInput = z.infer<typeof CompanyCreateInputSchema>;
 export type CompanyUpdateInput = z.infer<typeof CompanyUpdateInputSchema>;
 export type CompanyDeleteInput = z.infer<typeof CompanyDeleteInputSchema>;
+export type FileListInput = z.infer<typeof FileListInputSchema>;
+export type FileGetInput = z.infer<typeof FileGetInputSchema>;
+export type FileDeleteInput = z.infer<typeof FileDeleteInputSchema>;
+export type BankNameListInput = z.infer<typeof BankNameListInputSchema>;
+export type BankNameGetInput = z.infer<typeof BankNameGetInputSchema>;
+export type BankNameCreateInput = z.infer<typeof BankNameCreateInputSchema>;
+export type BankNameUpdateInput = z.infer<typeof BankNameUpdateInputSchema>;
+export type BankNameDeleteInput = z.infer<typeof BankNameDeleteInputSchema>;
+export type ChannelListInput = z.infer<typeof ChannelListInputSchema>;
+export type ChannelGetInput = z.infer<typeof ChannelGetInputSchema>;
+export type ChannelCreateInput = z.infer<typeof ChannelCreateInputSchema>;
+export type ChannelUpdateInput = z.infer<typeof ChannelUpdateInputSchema>;
+export type ChannelDeleteInput = z.infer<typeof ChannelDeleteInputSchema>;
+export type DisabledPersonListInput = z.infer<typeof DisabledPersonListInputSchema>;
+export type DisabledPersonGetInput = z.infer<typeof DisabledPersonGetInputSchema>;
+export type DisabledPersonCreateInput = z.infer<typeof DisabledPersonCreateInputSchema>;
+export type DisabledPersonUpdateInput = z.infer<typeof DisabledPersonUpdateInputSchema>;
+export type DisabledPersonDeleteInput = z.infer<typeof DisabledPersonDeleteInputSchema>;
+export type DisabilityCompanyQueryInput = z.infer<typeof DisabilityCompanyQueryInputSchema>;
+export type PlatformListInput = z.infer<typeof PlatformListInputSchema>;
+export type PlatformGetInput = z.infer<typeof PlatformGetInputSchema>;
+export type PlatformCreateInput = z.infer<typeof PlatformCreateInputSchema>;
+export type PlatformUpdateInput = z.infer<typeof PlatformUpdateInputSchema>;
+export type PlatformDeleteInput = z.infer<typeof PlatformDeleteInputSchema>;
+export type PlatformToggleStatusInput = z.infer<typeof PlatformToggleStatusInputSchema>;
+export type SalaryListInput = z.infer<typeof SalaryListInputSchema>;
+export type SalaryGetInput = z.infer<typeof SalaryGetInputSchema>;
+export type SalaryCreateInput = z.infer<typeof SalaryCreateInputSchema>;
+export type SalaryUpdateInput = z.infer<typeof SalaryUpdateInputSchema>;
+export type SalaryDeleteInput = z.infer<typeof SalaryDeleteInputSchema>;

+ 4 - 96
packages/admin-mcp-server/src/tools/auth-tools.ts

@@ -2,95 +2,12 @@
  * Authentication Tools
  *
  * MCP tools for admin authentication.
+ * Note: Token is pre-configured via Authorization header.
+ * Login/logout tools are removed as token is managed externally.
  */
 
 import { getApiClient } from '../services/api-client.js';
-import { LoginInputSchema } from '../schemas/index.js';
-import type { LoginInput } from '../schemas/index.js';
-import type { TokenResponse, User } from '../types.js';
-
-/**
- * Login tool - authenticates admin user and stores token
- */
-export const loginTool = async (args: LoginInput) => {
-  const apiClient = getApiClient();
-
-  try {
-    const { username, password } = args;
-
-    const response = await apiClient.post<TokenResponse>('/api/v1/auth/login', {
-      username,
-      password
-    });
-
-    const { token, user } = response;
-
-    // Store the token for subsequent requests
-    apiClient.setToken(token);
-
-    const structuredOutput = {
-      success: true,
-      token: token.substring(0, 20) + '...', // Partial token for security
-      userId: user?.id,
-      username: user?.username,
-      nickname: user?.nickname
-    };
-
-    const markdown = [
-      '✅ **Login Successful**',
-      '',
-      `**Welcome**, ${user?.nickname || user?.username}!`,
-      `**User ID**: ${user?.id}`,
-      `**Username**: ${user?.username}`,
-      user?.nickname ? `**Nickname**: ${user.nickname}` : null,
-      '',
-      'You are now authenticated and can use other admin tools.'
-    ].filter(Boolean).join('\n');
-
-    return {
-      content: [{ type: 'text', text: markdown }],
-      structuredContent: structuredOutput
-    };
-  } catch (error) {
-    return {
-      content: [{
-        type: 'text',
-        text: `Error: ${error instanceof Error ? error.message : 'Login failed'}`
-      }]
-    };
-  }
-};
-
-/**
- * Logout tool - clears authentication token
- */
-export const logoutTool = async () => {
-  const apiClient = getApiClient();
-
-  try {
-    // Clear the stored token
-    apiClient.clearToken();
-
-    const markdown = '✅ **Logout Successful**\n\nYou have been logged out.';
-
-    const structuredOutput = {
-      success: true,
-      message: 'Logged out successfully'
-    };
-
-    return {
-      content: [{ type: 'text', text: markdown }],
-      structuredContent: structuredOutput
-    };
-  } catch (error) {
-    return {
-      content: [{
-        type: 'text',
-        text: `Error: ${error instanceof Error ? error.message : 'Logout failed'}`
-      }]
-    };
-  }
-};
+import type { User } from '../types.js';
 
 /**
  * Get current user tool - returns current authenticated user info
@@ -153,17 +70,8 @@ export const getCurrentUserTool = async () => {
 };
 
 // Export tool registration configs
+// Note: Only getCurrentUser is exported as login/logout are handled via Authorization header
 export const authTools = {
-  login: {
-    name: 'admin_login',
-    schema: LoginInputSchema,
-    handler: loginTool
-  },
-  logout: {
-    name: 'admin_logout',
-    schema: undefined, // No input schema needed
-    handler: logoutTool
-  },
   getCurrentUser: {
     name: 'admin_get_current_user',
     schema: undefined, // No input schema needed

+ 296 - 0
packages/admin-mcp-server/src/tools/bank-name-tools.ts

@@ -0,0 +1,296 @@
+/**
+ * Bank Name Management Tools
+ *
+ * MCP tools for managing bank names in the admin system.
+ */
+
+import { getApiClient } from '../services/api-client.js';
+import {
+  BankNameListInputSchema,
+  BankNameGetInputSchema,
+  BankNameCreateInputSchema,
+  BankNameUpdateInputSchema,
+  BankNameDeleteInputSchema
+} from '../schemas/index.js';
+import type {
+  BankNameListInput,
+  BankNameGetInput,
+  BankNameCreateInput,
+  BankNameUpdateInput,
+  BankNameDeleteInput
+} from '../schemas/index.js';
+import { CHARACTER_LIMIT, ResponseFormat } from '../constants.js';
+import type { BankName, PaginatedResponse } from '../types.js';
+
+/**
+ * Format bank name data for markdown output
+ */
+function formatBankNameMarkdown(bankName: BankName): string {
+  const lines = [
+    `## Bank Name: ${bankName.name} (ID: ${bankName.id})`,
+    '',
+    `**Name**: ${bankName.name}`,
+    `**Code**: ${bankName.code}`,
+    `**Status**: ${bankName.status === 1 ? 'Enabled' : 'Disabled'}`,
+    `**Created At**: ${new Date(bankName.createdAt).toLocaleString('zh-CN')}`,
+    ''
+  ];
+
+  return lines.join('\n');
+}
+
+/**
+ * Format bank name list for markdown output
+ */
+function formatBankNameListMarkdown(bankNames: BankName[], total: number, current: number, pageSize: number): string {
+  const lines = [
+    `# Bank Name List`,
+    '',
+    `Total: ${total} bank names | Page: ${current} | Page Size: ${pageSize}`,
+    ''
+  ];
+
+  for (const bankName of bankNames) {
+    lines.push(formatBankNameMarkdown(bankName));
+  }
+
+  return lines.join('\n');
+}
+
+/**
+ * List bank names tool
+ */
+export const bankNameListTool = async (args: BankNameListInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { page, pageSize, keyword, sortBy, sortOrder, filters, response_format } = args;
+
+    const params: Record<string, unknown> = {
+      page: page || 1,
+      pageSize: pageSize || 20
+    };
+
+    if (keyword) params.keyword = keyword;
+    if (sortBy) params.sortBy = sortBy;
+    if (sortOrder) params.sortOrder = sortOrder;
+    if (filters) params.filters = filters;
+
+    const response = await apiClient.get<PaginatedResponse<BankName>>('/api/v1/bank-names', params);
+
+    const bankNames = response.data || [];
+    const total = response.pagination?.total || 0;
+
+    const structuredOutput = {
+      total,
+      count: bankNames.length,
+      current: page || 1,
+      pageSize: pageSize || 20,
+      bankNames: bankNames.map((b: BankName) => ({
+        id: b.id,
+        name: b.name,
+        code: b.code,
+        status: b.status,
+        createdAt: b.createdAt
+      })),
+      hasMore: total > (page || 1) * (pageSize || 20)
+    };
+
+    let textContent: string;
+    if (response_format === ResponseFormat.JSON) {
+      textContent = JSON.stringify(structuredOutput, null, 2);
+    } else {
+      let markdown = formatBankNameListMarkdown(bankNames, total, page || 1, pageSize || 20);
+
+      // Check character limit
+      if (markdown.length > CHARACTER_LIMIT) {
+        const halfLength = Math.floor(bankNames.length / 2);
+        const truncatedBankNames = bankNames.slice(0, halfLength);
+        markdown = formatBankNameListMarkdown(truncatedBankNames, total, page || 1, pageSize || 20);
+        markdown += `\n---\n⚠️ **Response truncated**: Showing ${halfLength} of ${bankNames.length} results. Use pagination to see more.\n`;
+      }
+
+      textContent = markdown;
+    }
+
+    return {
+      content: [{ type: 'text', text: textContent }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to list bank names'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Get single bank name tool
+ */
+export const bankNameGetTool = async (args: BankNameGetInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    const response = await apiClient.get<BankName>(`/api/v1/bank-names/${id}`);
+
+    const bankName = response;
+
+    const structuredOutput = {
+      id: bankName.id,
+      name: bankName.name,
+      code: bankName.code,
+      status: bankName.status,
+      createdAt: bankName.createdAt,
+      updatedAt: bankName.updatedAt
+    };
+
+    const markdown = formatBankNameMarkdown(bankName);
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to get bank name'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Create bank name tool
+ */
+export const bankNameCreateTool = async (args: BankNameCreateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const response = await apiClient.post<BankName>('/api/v1/bank-names', args);
+
+    const bankName = response;
+
+    const structuredOutput = {
+      id: bankName.id,
+      name: bankName.name,
+      code: bankName.code,
+      status: bankName.status,
+      createdAt: bankName.createdAt
+    };
+
+    const markdown = `✅ **Bank Name Created Successfully**\n\n${formatBankNameMarkdown(bankName)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to create bank name'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Update bank name tool
+ */
+export const bankNameUpdateTool = async (args: BankNameUpdateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id, ...updateData } = args;
+    const response = await apiClient.put<BankName>(`/api/v1/bank-names/${id}`, updateData);
+
+    const bankName = response;
+
+    const structuredOutput = {
+      id: bankName.id,
+      name: bankName.name,
+      code: bankName.code,
+      status: bankName.status,
+      updatedAt: bankName.updatedAt
+    };
+
+    const markdown = `✅ **Bank Name Updated Successfully**\n\n${formatBankNameMarkdown(bankName)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to update bank name'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Delete bank name tool
+ */
+export const bankNameDeleteTool = async (args: BankNameDeleteInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    await apiClient.delete<{ success: boolean }>(`/api/v1/bank-names/${id}`);
+
+    const markdown = `✅ **Bank Name Deleted Successfully**\n\nBank Name ID ${id} has been deleted.`;
+
+    const structuredOutput = {
+      success: true,
+      deletedBankNameId: id
+    };
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to delete bank name'}`
+      }]
+    };
+  }
+};
+
+// Export tool registration configs
+export const bankNameTools = {
+  bankNameList: {
+    name: 'admin_list_bank_names',
+    schema: BankNameListInputSchema,
+    handler: bankNameListTool
+  },
+  bankNameGet: {
+    name: 'admin_get_bank_name',
+    schema: BankNameGetInputSchema,
+    handler: bankNameGetTool
+  },
+  bankNameCreate: {
+    name: 'admin_create_bank_name',
+    schema: BankNameCreateInputSchema,
+    handler: bankNameCreateTool
+  },
+  bankNameUpdate: {
+    name: 'admin_update_bank_name',
+    schema: BankNameUpdateInputSchema,
+    handler: bankNameUpdateTool
+  },
+  bankNameDelete: {
+    name: 'admin_delete_bank_name',
+    schema: BankNameDeleteInputSchema,
+    handler: bankNameDeleteTool
+  }
+};

+ 310 - 0
packages/admin-mcp-server/src/tools/channel-tools.ts

@@ -0,0 +1,310 @@
+/**
+ * Channel Management Tools
+ *
+ * MCP tools for managing channels in the admin system.
+ * Uses custom routes with skip/take pagination.
+ */
+
+import { getApiClient } from '../services/api-client.js';
+import {
+  ChannelListInputSchema,
+  ChannelGetInputSchema,
+  ChannelCreateInputSchema,
+  ChannelUpdateInputSchema,
+  ChannelDeleteInputSchema
+} from '../schemas/index.js';
+import type {
+  ChannelListInput,
+  ChannelGetInput,
+  ChannelCreateInput,
+  ChannelUpdateInput,
+  ChannelDeleteInput
+} from '../schemas/index.js';
+import { CHARACTER_LIMIT, ResponseFormat } from '../constants.js';
+import type { Channel } from '../types.js';
+
+/**
+ * Format channel data for markdown output
+ */
+function formatChannelMarkdown(channel: Channel): string {
+  const lines = [
+    `## Channel: ${channel.channelName} (ID: ${channel.id})`,
+    '',
+    `**Channel Name**: ${channel.channelName}`,
+    `**Channel Type**: ${channel.channelType || 'N/A'}`,
+    channel.contactPerson ? `**Contact Person**: ${channel.contactPerson}` : null,
+    channel.contactPhone ? `**Contact Phone**: ${channel.contactPhone}` : null,
+    channel.description ? `**Description**: ${channel.description}` : null,
+    `**Status**: ${channel.status === 1 ? 'Enabled' : 'Disabled'}`,
+    `**Created At**: ${new Date(channel.createTime).toLocaleString('zh-CN')}`,
+    ''
+  ].filter(Boolean);
+
+  return lines.join('\n');
+}
+
+/**
+ * Format channel list for markdown output
+ */
+function formatChannelListMarkdown(channels: Channel[], total: number, skip: number, take: number): string {
+  const lines = [
+    `# Channel List`,
+    '',
+    `Total: ${total} channels | Skip: ${skip} | Take: ${take}`,
+    ''
+  ];
+
+  for (const channel of channels) {
+    lines.push(formatChannelMarkdown(channel));
+  }
+
+  return lines.join('\n');
+}
+
+/**
+ * List channels tool
+ */
+export const channelListTool = async (args: ChannelListInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { skip = 0, take = 20, response_format } = args;
+
+    const params: Record<string, unknown> = {
+      skip: skip.toString(),
+      take: take.toString()
+    };
+
+    // Custom route uses getAllChannels endpoint
+    const response = await apiClient.get<{ data: Channel[]; total: number }>('/api/v1/channels/getAllChannels', params);
+
+    const channels = response.data || [];
+    const total = response.total || 0;
+
+    const structuredOutput = {
+      total,
+      count: channels.length,
+      skip,
+      take,
+      channels: channels.map((c: Channel) => ({
+        id: c.id,
+        channelName: c.channelName,
+        channelType: c.channelType,
+        contactPerson: c.contactPerson,
+        contactPhone: c.contactPhone,
+        description: c.description,
+        status: c.status,
+        createTime: c.createTime
+      })),
+      hasMore: skip + take < total
+    };
+
+    let textContent: string;
+    if (response_format === ResponseFormat.JSON) {
+      textContent = JSON.stringify(structuredOutput, null, 2);
+    } else {
+      let markdown = formatChannelListMarkdown(channels, total, skip, take);
+
+      // Check character limit
+      if (markdown.length > CHARACTER_LIMIT) {
+        const halfLength = Math.floor(channels.length / 2);
+        const truncatedChannels = channels.slice(0, halfLength);
+        markdown = formatChannelListMarkdown(truncatedChannels, total, skip, take);
+        markdown += `\n---\n⚠️ **Response truncated**: Showing ${halfLength} of ${channels.length} results. Use pagination to see more.\n`;
+      }
+
+      textContent = markdown;
+    }
+
+    return {
+      content: [{ type: 'text', text: textContent }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to list channels'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Get single channel tool
+ */
+export const channelGetTool = async (args: ChannelGetInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    const response = await apiClient.get<Channel>('/api/v1/channels/getChannel', { id });
+
+    const channel = response;
+
+    const structuredOutput = {
+      id: channel.id,
+      channelName: channel.channelName,
+      channelType: channel.channelType,
+      contactPerson: channel.contactPerson,
+      contactPhone: channel.contactPhone,
+      description: channel.description,
+      status: channel.status,
+      createTime: channel.createTime,
+      updateTime: channel.updateTime
+    };
+
+    const markdown = formatChannelMarkdown(channel);
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to get channel'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Create channel tool
+ */
+export const channelCreateTool = async (args: ChannelCreateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const response = await apiClient.post<Channel>('/api/v1/channels/createChannel', args);
+
+    const channel = response;
+
+    const structuredOutput = {
+      id: channel.id,
+      channelName: channel.channelName,
+      channelType: channel.channelType,
+      contactPerson: channel.contactPerson,
+      contactPhone: channel.contactPhone,
+      description: channel.description,
+      status: channel.status,
+      createTime: channel.createTime
+    };
+
+    const markdown = `✅ **Channel Created Successfully**\n\n${formatChannelMarkdown(channel)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to create channel'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Update channel tool
+ */
+export const channelUpdateTool = async (args: ChannelUpdateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id, ...updateData } = args;
+    // Custom route uses POST with id in body
+    const response = await apiClient.post<Channel>('/api/v1/channels/updateChannel', { id, ...updateData });
+
+    const channel = response;
+
+    const structuredOutput = {
+      id: channel.id,
+      channelName: channel.channelName,
+      channelType: channel.channelType,
+      contactPerson: channel.contactPerson,
+      contactPhone: channel.contactPhone,
+      description: channel.description,
+      status: channel.status,
+      updateTime: channel.updateTime
+    };
+
+    const markdown = `✅ **Channel Updated Successfully**\n\n${formatChannelMarkdown(channel)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to update channel'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Delete channel tool
+ */
+export const channelDeleteTool = async (args: ChannelDeleteInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    // Custom route uses POST with id in body
+    await apiClient.post<{ success: boolean }>('/api/v1/channels/deleteChannel', { id });
+
+    const markdown = `✅ **Channel Deleted Successfully**\n\nChannel ID ${id} has been deleted.`;
+
+    const structuredOutput = {
+      success: true,
+      deletedChannelId: id
+    };
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to delete channel'}`
+      }]
+    };
+  }
+};
+
+// Export tool registration configs
+export const channelTools = {
+  channelList: {
+    name: 'admin_list_channels',
+    schema: ChannelListInputSchema,
+    handler: channelListTool
+  },
+  channelGet: {
+    name: 'admin_get_channel',
+    schema: ChannelGetInputSchema,
+    handler: channelGetTool
+  },
+  channelCreate: {
+    name: 'admin_create_channel',
+    schema: ChannelCreateInputSchema,
+    handler: channelCreateTool
+  },
+  channelUpdate: {
+    name: 'admin_update_channel',
+    schema: ChannelUpdateInputSchema,
+    handler: channelUpdateTool
+  },
+  channelDelete: {
+    name: 'admin_delete_channel',
+    schema: ChannelDeleteInputSchema,
+    handler: channelDeleteTool
+  }
+};

+ 3 - 3
packages/admin-mcp-server/src/tools/company-tools.ts

@@ -34,7 +34,7 @@ function formatCompanyMarkdown(company: Company): string {
     company.contactPhone ? `**Contact Phone**: ${company.contactPhone}` : null,
     company.contactEmail ? `**Contact Email**: ${company.contactEmail}` : null,
     company.address ? `**Address**: ${company.address}` : null,
-    company.platform ? `**Platform**: ${company.platform.name} (ID: ${company.platformId})` : null,
+    company.platform ? `**Platform**: ${company.platform.platformName} (ID: ${company.platformId})` : null,
     `**Status**: ${company.status === 1 ? 'Enabled' : 'Disabled'}`,
     `**Created At**: ${new Date(company.createTime).toLocaleString('zh-CN')}`,
     ''
@@ -98,7 +98,7 @@ export const companyListTool = async (args: CompanyListInput) => {
         contactEmail: c.contactEmail,
         address: c.address,
         platformId: c.platformId,
-        platformName: c.platform?.name,
+        platformName: c.platform?.platformName,
         status: c.status,
         createTime: c.createTime
       })),
@@ -156,7 +156,7 @@ export const companyGetTool = async (args: CompanyGetInput) => {
       contactEmail: company.contactEmail,
       address: company.address,
       platformId: company.platformId,
-      platformName: company.platform?.name,
+      platformName: company.platform?.platformName,
       status: company.status,
       createTime: company.createTime,
       updateTime: company.updateTime

+ 181 - 0
packages/admin-mcp-server/src/tools/disability-company-tools.ts

@@ -0,0 +1,181 @@
+/**
+ * Disability Company Query Tools
+ *
+ * MCP tools for querying disabled persons with company information.
+ * This is a read-only query tool with multiple filter options.
+ */
+
+import { getApiClient } from '../services/api-client.js';
+import {
+  DisabilityCompanyQueryInputSchema
+} from '../schemas/index.js';
+import type {
+  DisabilityCompanyQueryInput
+} from '../schemas/index.js';
+import { CHARACTER_LIMIT, ResponseFormat } from '../constants.js';
+import type { DisabledPerson } from '../types.js';
+
+/**
+ * Format disabled person with company data for markdown output
+ */
+function formatDisabilityCompanyMarkdown(person: DisabledPerson): string {
+  const lines = [
+    `## ${person.name} (ID: ${person.id})`,
+    '',
+    `**ID Card**: ${person.idCard}`,
+    `**Disability Cert No**: ${person.disabilityCertNo}`,
+    person.disabilityType ? `**Disability Type**: ${person.disabilityType}` : null,
+    person.disabilityLevel ? `**Disability Level**: ${person.disabilityLevel}` : null,
+    person.gender ? `**Gender**: ${person.gender}` : null,
+    person.company ? `**Company**: ${person.company.companyName}` : 'No company assigned',
+    person.city ? `**City**: ${person.city}` : null,
+    person.district ? `**District**: ${person.district}` : null,
+    ''
+  ].filter(Boolean);
+
+  return lines.join('\n');
+}
+
+/**
+ * Format disability company query results for markdown output
+ */
+function formatDisabilityCompanyListMarkdown(persons: DisabledPerson[], total: number, skip: number, take: number): string {
+  const lines = [
+    `# Disabled Person & Company Query Results`,
+    '',
+    `Total: ${total} results | Skip: ${skip} | Take: ${take}`,
+    ''
+  ];
+
+  for (const person of persons) {
+    lines.push(formatDisabilityCompanyMarkdown(person));
+  }
+
+  return lines.join('\n');
+}
+
+/**
+ * Query disabled persons with company information tool
+ */
+export const disabilityCompanyQueryTool = async (args: DisabilityCompanyQueryInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const {
+      name,
+      idCard,
+      companyName,
+      gender,
+      disabilityType,
+      disabilityLevel,
+      minAge,
+      maxAge,
+      city,
+      district,
+      companyId,
+      platformId,
+      skip = 0,
+      take = 20,
+      response_format
+    } = args;
+
+    const params: Record<string, unknown> = {
+      skip: skip.toString(),
+      take: take.toString()
+    };
+
+    // Add optional query parameters
+    if (name) params.name = name;
+    if (idCard) params.idCard = idCard;
+    if (companyName) params.companyName = companyName;
+    if (gender) params.gender = gender;
+    if (disabilityType) params.disabilityType = disabilityType;
+    if (disabilityLevel) params.disabilityLevel = disabilityLevel;
+    if (minAge !== undefined) params.minAge = minAge;
+    if (maxAge !== undefined) params.maxAge = maxAge;
+    if (city) params.city = city;
+    if (district) params.district = district;
+    if (companyId) params.companyId = companyId;
+    if (platformId) params.platformId = platformId;
+
+    // Custom query endpoint for finding persons with company
+    const response = await apiClient.get<{ data: DisabledPerson[]; total: number }>('/api/v1/disability-company/findPersonsWithCompany', params);
+
+    const persons = response.data || [];
+    const total = response.total || 0;
+
+    const structuredOutput = {
+      total,
+      count: persons.length,
+      skip,
+      take,
+      query: {
+        name,
+        idCard,
+        companyName,
+        gender,
+        disabilityType,
+        disabilityLevel,
+        minAge,
+        maxAge,
+        city,
+        district,
+        companyId,
+        platformId
+      },
+      results: persons.map((p: DisabledPerson) => ({
+        id: p.id,
+        name: p.name,
+        idCard: p.idCard,
+        disabilityCertNo: p.disabilityCertNo,
+        disabilityType: p.disabilityType,
+        disabilityLevel: p.disabilityLevel,
+        gender: p.gender,
+        companyId: p.companyId,
+        companyName: p.company?.companyName,
+        city: p.city,
+        district: p.district,
+        platformId: p.platformId
+      })),
+      hasMore: skip + take < total
+    };
+
+    let textContent: string;
+    if (response_format === ResponseFormat.JSON) {
+      textContent = JSON.stringify(structuredOutput, null, 2);
+    } else {
+      let markdown = formatDisabilityCompanyListMarkdown(persons, total, skip, take);
+
+      // Check character limit
+      if (markdown.length > CHARACTER_LIMIT) {
+        const halfLength = Math.floor(persons.length / 2);
+        const truncatedPersons = persons.slice(0, halfLength);
+        markdown = formatDisabilityCompanyListMarkdown(truncatedPersons, total, skip, take);
+        markdown += `\n---\n⚠️ **Response truncated**: Showing ${halfLength} of ${persons.length} results. Use pagination to see more.\n`;
+      }
+
+      textContent = markdown;
+    }
+
+    return {
+      content: [{ type: 'text', text: textContent }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to query disability company data'}`
+      }]
+    };
+  }
+};
+
+// Export tool registration configs
+export const disabilityCompanyTools = {
+  queryDisabilityCompany: {
+    name: 'admin_query_disability_company',
+    schema: DisabilityCompanyQueryInputSchema,
+    handler: disabilityCompanyQueryTool
+  }
+};

+ 333 - 0
packages/admin-mcp-server/src/tools/disability-tools.ts

@@ -0,0 +1,333 @@
+/**
+ * Disabled Person Management Tools
+ *
+ * MCP tools for managing disabled persons in the admin system.
+ * Uses custom routes with skip/take pagination.
+ */
+
+import { getApiClient } from '../services/api-client.js';
+import {
+  DisabledPersonListInputSchema,
+  DisabledPersonGetInputSchema,
+  DisabledPersonCreateInputSchema,
+  DisabledPersonUpdateInputSchema,
+  DisabledPersonDeleteInputSchema
+} from '../schemas/index.js';
+import type {
+  DisabledPersonListInput,
+  DisabledPersonGetInput,
+  DisabledPersonCreateInput,
+  DisabledPersonUpdateInput,
+  DisabledPersonDeleteInput
+} from '../schemas/index.js';
+import { CHARACTER_LIMIT, ResponseFormat } from '../constants.js';
+import type { DisabledPerson } from '../types.js';
+
+/**
+ * Format disabled person data for markdown output
+ */
+function formatDisabledPersonMarkdown(person: DisabledPerson): string {
+  const lines = [
+    `## Disabled Person: ${person.name} (ID: ${person.id})`,
+    '',
+    `**Name**: ${person.name}`,
+    `**ID Card**: ${person.idCard}`,
+    `**Disability Cert No**: ${person.disabilityCertNo}`,
+    person.disabilityType ? `**Disability Type**: ${person.disabilityType}` : null,
+    person.disabilityLevel ? `**Disability Level**: ${person.disabilityLevel}` : null,
+    person.gender ? `**Gender**: ${person.gender}` : null,
+    person.phone ? `**Phone**: ${person.phone}` : null,
+    person.birthday ? `**Birthday**: ${new Date(person.birthday).toLocaleDateString('zh-CN')}` : null,
+    person.address ? `**Address**: ${person.address}` : null,
+    person.city ? `**City**: ${person.city}` : null,
+    person.district ? `**District**: ${person.district}` : null,
+    person.company ? `**Company**: ${person.company.companyName} (ID: ${person.companyId})` : null,
+    person.platformId ? `**Platform ID**: ${person.platformId}` : null,
+    person.status !== undefined ? `**Status**: ${person.status === 1 ? 'Enabled' : 'Disabled'}` : null,
+    person.createTime ? `**Created At**: ${new Date(person.createTime).toLocaleString('zh-CN')}` : null,
+    ''
+  ].filter(Boolean);
+
+  return lines.join('\n');
+}
+
+/**
+ * Format disabled person list for markdown output
+ */
+function formatDisabledPersonListMarkdown(persons: DisabledPerson[], total: number, skip: number, take: number): string {
+  const lines = [
+    `# Disabled Person List`,
+    '',
+    `Total: ${total} persons | Skip: ${skip} | Take: ${take}`,
+    ''
+  ];
+
+  for (const person of persons) {
+    lines.push(formatDisabledPersonMarkdown(person));
+  }
+
+  return lines.join('\n');
+}
+
+/**
+ * List disabled persons tool
+ */
+export const disabledPersonListTool = async (args: DisabledPersonListInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { skip = 0, take = 20, response_format } = args;
+
+    const params: Record<string, unknown> = {
+      skip: skip.toString(),
+      take: take.toString()
+    };
+
+    // Custom route uses getAllDisabledPersons endpoint
+    const response = await apiClient.get<{ data: DisabledPerson[]; total: number }>('/api/v1/disability/getAllDisabledPersons', params);
+
+    const persons = response.data || [];
+    const total = response.total || 0;
+
+    const structuredOutput = {
+      total,
+      count: persons.length,
+      skip,
+      take,
+      persons: persons.map((p: DisabledPerson) => ({
+        id: p.id,
+        name: p.name,
+        idCard: p.idCard,
+        disabilityCertNo: p.disabilityCertNo,
+        disabilityType: p.disabilityType,
+        disabilityLevel: p.disabilityLevel,
+        phone: p.phone,
+        gender: p.gender,
+        city: p.city,
+        district: p.district,
+        companyId: p.companyId,
+        companyName: p.company?.companyName,
+        platformId: p.platformId,
+        status: p.status
+      })),
+      hasMore: skip + take < total
+    };
+
+    let textContent: string;
+    if (response_format === ResponseFormat.JSON) {
+      textContent = JSON.stringify(structuredOutput, null, 2);
+    } else {
+      let markdown = formatDisabledPersonListMarkdown(persons, total, skip, take);
+
+      // Check character limit
+      if (markdown.length > CHARACTER_LIMIT) {
+        const halfLength = Math.floor(persons.length / 2);
+        const truncatedPersons = persons.slice(0, halfLength);
+        markdown = formatDisabledPersonListMarkdown(truncatedPersons, total, skip, take);
+        markdown += `\n---\n⚠️ **Response truncated**: Showing ${halfLength} of ${persons.length} results. Use pagination to see more.\n`;
+      }
+
+      textContent = markdown;
+    }
+
+    return {
+      content: [{ type: 'text', text: textContent }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to list disabled persons'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Get single disabled person tool
+ */
+export const disabledPersonGetTool = async (args: DisabledPersonGetInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    const response = await apiClient.get<DisabledPerson>(`/api/v1/disability/${id}`);
+
+    const person = response;
+
+    const structuredOutput = {
+      id: person.id,
+      name: person.name,
+      idCard: person.idCard,
+      disabilityCertNo: person.disabilityCertNo,
+      disabilityType: person.disabilityType,
+      disabilityLevel: person.disabilityLevel,
+      phone: person.phone,
+      gender: person.gender,
+      birthday: person.birthday,
+      address: person.address,
+      city: person.city,
+      district: person.district,
+      companyId: person.companyId,
+      companyName: person.company?.companyName,
+      platformId: person.platformId,
+      status: person.status
+    };
+
+    const markdown = formatDisabledPersonMarkdown(person);
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to get disabled person'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Create disabled person tool
+ */
+export const disabledPersonCreateTool = async (args: DisabledPersonCreateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const response = await apiClient.post<DisabledPerson>('/api/v1/disability/createDisabledPerson', args);
+
+    const person = response;
+
+    const structuredOutput = {
+      id: person.id,
+      name: person.name,
+      idCard: person.idCard,
+      disabilityCertNo: person.disabilityCertNo,
+      disabilityType: person.disabilityType,
+      disabilityLevel: person.disabilityLevel,
+      phone: person.phone,
+      companyId: person.companyId,
+      platformId: person.platformId,
+      status: person.status
+    };
+
+    const markdown = `✅ **Disabled Person Created Successfully**\n\n${formatDisabledPersonMarkdown(person)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to create disabled person'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Update disabled person tool
+ */
+export const disabledPersonUpdateTool = async (args: DisabledPersonUpdateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id, ...updateData } = args;
+    const response = await apiClient.post<DisabledPerson>('/api/v1/disability/updateDisabledPerson', { id, ...updateData });
+
+    const person = response;
+
+    const structuredOutput = {
+      id: person.id,
+      name: person.name,
+      idCard: person.idCard,
+      disabilityCertNo: person.disabilityCertNo,
+      disabilityType: person.disabilityType,
+      disabilityLevel: person.disabilityLevel,
+      phone: person.phone,
+      companyId: person.companyId,
+      platformId: person.platformId,
+      status: person.status
+    };
+
+    const markdown = `✅ **Disabled Person Updated Successfully**\n\n${formatDisabledPersonMarkdown(person)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to update disabled person'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Delete disabled person tool
+ */
+export const disabledPersonDeleteTool = async (args: DisabledPersonDeleteInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    await apiClient.post<{ success: boolean }>('/api/v1/disability/deleteDisabledPerson', { id });
+
+    const markdown = `✅ **Disabled Person Deleted Successfully**\n\nDisabled Person ID ${id} has been deleted.`;
+
+    const structuredOutput = {
+      success: true,
+      deletedPersonId: id
+    };
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to delete disabled person'}`
+      }]
+    };
+  }
+};
+
+// Export tool registration configs
+export const disabilityTools = {
+  disabledPersonList: {
+    name: 'admin_list_disabled_persons',
+    schema: DisabledPersonListInputSchema,
+    handler: disabledPersonListTool
+  },
+  disabledPersonGet: {
+    name: 'admin_get_disabled_person',
+    schema: DisabledPersonGetInputSchema,
+    handler: disabledPersonGetTool
+  },
+  disabledPersonCreate: {
+    name: 'admin_create_disabled_person',
+    schema: DisabledPersonCreateInputSchema,
+    handler: disabledPersonCreateTool
+  },
+  disabledPersonUpdate: {
+    name: 'admin_update_disabled_person',
+    schema: DisabledPersonUpdateInputSchema,
+    handler: disabledPersonUpdateTool
+  },
+  disabledPersonDelete: {
+    name: 'admin_delete_disabled_person',
+    schema: DisabledPersonDeleteInputSchema,
+    handler: disabledPersonDeleteTool
+  }
+};

+ 220 - 0
packages/admin-mcp-server/src/tools/file-tools.ts

@@ -0,0 +1,220 @@
+/**
+ * File Management Tools
+ *
+ * MCP tools for managing files in the admin system.
+ * Note: Only metadata management is supported, binary upload is not available.
+ */
+
+import { getApiClient } from '../services/api-client.js';
+import {
+  FileListInputSchema,
+  FileGetInputSchema,
+  FileDeleteInputSchema
+} from '../schemas/index.js';
+import type {
+  FileListInput,
+  FileGetInput,
+  FileDeleteInput
+} from '../schemas/index.js';
+import { CHARACTER_LIMIT, ResponseFormat } from '../constants.js';
+import type { File, PaginatedResponse } from '../types.js';
+
+/**
+ * Format file data for markdown output
+ */
+function formatFileMarkdown(file: File): string {
+  const lines = [
+    `## File: ${file.fileName} (ID: ${file.id})`,
+    '',
+    `**File Name**: ${file.fileName}`,
+    `**File Size**: ${(file.fileSize / 1024).toFixed(2)} KB`,
+    `**MIME Type**: ${file.mimeType}`,
+    `**File Path**: ${file.filePath}`,
+    file.uploadUser ? `**Uploaded By**: ${file.uploadUser.username} (ID: ${file.uploadUserId})` : `**Uploaded By ID**: ${file.uploadUserId}`,
+    `**Created At**: ${new Date(file.createdAt).toLocaleString('zh-CN')}`,
+    ''
+  ];
+
+  return lines.join('\n');
+}
+
+/**
+ * Format file list for markdown output
+ */
+function formatFileListMarkdown(files: File[], total: number, current: number, pageSize: number): string {
+  const lines = [
+    `# File List`,
+    '',
+    `Total: ${total} files | Page: ${current} | Page Size: ${pageSize}`,
+    ''
+  ];
+
+  for (const file of files) {
+    lines.push(formatFileMarkdown(file));
+  }
+
+  return lines.join('\n');
+}
+
+/**
+ * List files tool
+ */
+export const fileListTool = async (args: FileListInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { page, pageSize, keyword, sortBy, sortOrder, filters, response_format } = args;
+
+    const params: Record<string, unknown> = {
+      page: page || 1,
+      pageSize: pageSize || 20
+    };
+
+    if (keyword) params.keyword = keyword;
+    if (sortBy) params.sortBy = sortBy;
+    if (sortOrder) params.sortOrder = sortOrder;
+    if (filters) params.filters = filters;
+
+    const response = await apiClient.get<PaginatedResponse<File>>('/api/v1/files', params);
+
+    const files = response.data || [];
+    const total = response.pagination?.total || 0;
+
+    const structuredOutput = {
+      total,
+      count: files.length,
+      current: page || 1,
+      pageSize: pageSize || 20,
+      files: files.map((f: File) => ({
+        id: f.id,
+        fileName: f.fileName,
+        fileSize: f.fileSize,
+        mimeType: f.mimeType,
+        filePath: f.filePath,
+        uploadUserId: f.uploadUserId,
+        uploadUserName: f.uploadUser?.username,
+        createdAt: f.createdAt
+      })),
+      hasMore: total > (page || 1) * (pageSize || 20)
+    };
+
+    let textContent: string;
+    if (response_format === ResponseFormat.JSON) {
+      textContent = JSON.stringify(structuredOutput, null, 2);
+    } else {
+      let markdown = formatFileListMarkdown(files, total, page || 1, pageSize || 20);
+
+      // Check character limit
+      if (markdown.length > CHARACTER_LIMIT) {
+        const halfLength = Math.floor(files.length / 2);
+        const truncatedFiles = files.slice(0, halfLength);
+        markdown = formatFileListMarkdown(truncatedFiles, total, page || 1, pageSize || 20);
+        markdown += `\n---\n⚠️ **Response truncated**: Showing ${halfLength} of ${files.length} results. Use pagination to see more.\n`;
+      }
+
+      textContent = markdown;
+    }
+
+    return {
+      content: [{ type: 'text', text: textContent }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to list files'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Get single file tool
+ */
+export const fileGetTool = async (args: FileGetInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    const response = await apiClient.get<File>(`/api/v1/files/${id}`);
+
+    const file = response;
+
+    const structuredOutput = {
+      id: file.id,
+      fileName: file.fileName,
+      fileSize: file.fileSize,
+      mimeType: file.mimeType,
+      filePath: file.filePath,
+      uploadUserId: file.uploadUserId,
+      uploadUserName: file.uploadUser?.username,
+      createdAt: file.createdAt,
+      updatedAt: file.updatedAt
+    };
+
+    const markdown = formatFileMarkdown(file);
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to get file'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Delete file tool
+ */
+export const fileDeleteTool = async (args: FileDeleteInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    await apiClient.delete<{ success: boolean }>(`/api/v1/files/${id}`);
+
+    const markdown = `✅ **File Deleted Successfully**\n\nFile ID ${id} has been deleted.`;
+
+    const structuredOutput = {
+      success: true,
+      deletedFileId: id
+    };
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to delete file'}`
+      }]
+    };
+  }
+};
+
+// Export tool registration configs
+export const fileTools = {
+  fileList: {
+    name: 'admin_list_files',
+    schema: FileListInputSchema,
+    handler: fileListTool
+  },
+  fileGet: {
+    name: 'admin_get_file',
+    schema: FileGetInputSchema,
+    handler: fileGetTool
+  },
+  fileDelete: {
+    name: 'admin_delete_file',
+    schema: FileDeleteInputSchema,
+    handler: fileDeleteTool
+  }
+};

+ 130 - 7
packages/admin-mcp-server/src/tools/index.ts

@@ -9,6 +9,15 @@ import { userTools } from './user-tools.js';
 import { roleTools } from './role-tools.js';
 import { systemConfigTools } from './system-config-tools.js';
 import { orderTools } from './order-tools.js';
+import { areaTools } from './area-tools.js';
+import { companyTools } from './company-tools.js';
+import { fileTools } from './file-tools.js';
+import { bankNameTools } from './bank-name-tools.js';
+import { channelTools } from './channel-tools.js';
+import { disabilityTools } from './disability-tools.js';
+import { disabilityCompanyTools } from './disability-company-tools.js';
+import { platformTools } from './platform-tools.js';
+import { salaryTools } from './salary-tools.js';
 
 // Export all tool collections
 export const allTools = {
@@ -16,14 +25,21 @@ export const allTools = {
   ...userTools,
   ...roleTools,
   ...systemConfigTools,
-  ...orderTools
+  ...orderTools,
+  ...areaTools,
+  ...companyTools,
+  ...fileTools,
+  ...bankNameTools,
+  ...channelTools,
+  ...disabilityTools,
+  ...disabilityCompanyTools,
+  ...platformTools,
+  ...salaryTools
 };
 
 // Export tool names for easy reference
 export const toolNames = {
   // Auth tools
-  login: 'admin_login',
-  logout: 'admin_logout',
   getCurrentUser: 'admin_get_current_user',
 
   // User tools
@@ -49,7 +65,69 @@ export const toolNames = {
 
   // Order tools
   orderList: 'admin_list_orders',
-  orderGet: 'admin_get_order'
+  orderGet: 'admin_get_order',
+  orderCreate: 'admin_create_order',
+  orderUpdate: 'admin_update_order',
+  orderDelete: 'admin_delete_order',
+
+  // Area tools
+  areaList: 'admin_list_areas',
+  areaGet: 'admin_get_area',
+  areaGetTree: 'admin_get_area_tree',
+  areaCreate: 'admin_create_area',
+  areaUpdate: 'admin_update_area',
+  areaDelete: 'admin_delete_area',
+
+  // Company tools
+  companyList: 'admin_list_companies',
+  companyGet: 'admin_get_company',
+  companyCreate: 'admin_create_company',
+  companyUpdate: 'admin_update_company',
+  companyDelete: 'admin_delete_company',
+
+  // File tools
+  fileList: 'admin_list_files',
+  fileGet: 'admin_get_file',
+  fileDelete: 'admin_delete_file',
+
+  // Bank name tools
+  bankNameList: 'admin_list_bank_names',
+  bankNameGet: 'admin_get_bank_name',
+  bankNameCreate: 'admin_create_bank_name',
+  bankNameUpdate: 'admin_update_bank_name',
+  bankNameDelete: 'admin_delete_bank_name',
+
+  // Channel tools
+  channelList: 'admin_list_channels',
+  channelGet: 'admin_get_channel',
+  channelCreate: 'admin_create_channel',
+  channelUpdate: 'admin_update_channel',
+  channelDelete: 'admin_delete_channel',
+
+  // Disabled person tools
+  disabledPersonList: 'admin_list_disabled_persons',
+  disabledPersonGet: 'admin_get_disabled_person',
+  disabledPersonCreate: 'admin_create_disabled_person',
+  disabledPersonUpdate: 'admin_update_disabled_person',
+  disabledPersonDelete: 'admin_delete_disabled_person',
+
+  // Disability company query tools
+  queryDisabilityCompany: 'admin_query_disability_company',
+
+  // Platform tools
+  platformList: 'admin_list_platforms',
+  platformGet: 'admin_get_platform',
+  platformCreate: 'admin_create_platform',
+  platformUpdate: 'admin_update_platform',
+  platformDelete: 'admin_delete_platform',
+  platformToggleStatus: 'admin_toggle_platform_status',
+
+  // Salary tools
+  salaryList: 'admin_list_salaries',
+  salaryGet: 'admin_get_salary',
+  salaryCreate: 'admin_create_salary',
+  salaryUpdate: 'admin_update_salary',
+  salaryDelete: 'admin_delete_salary'
 };
 
 // Export tool categories for documentation
@@ -57,7 +135,7 @@ export const toolCategories = {
   auth: {
     name: 'Authentication',
     description: 'Tools for admin authentication',
-    tools: [toolNames.login, toolNames.logout, toolNames.getCurrentUser]
+    tools: [toolNames.getCurrentUser]
   },
   users: {
     name: 'User Management',
@@ -76,7 +154,52 @@ export const toolCategories = {
   },
   orders: {
     name: 'Order Management',
-    description: 'Tools for viewing orders',
-    tools: [toolNames.orderList, toolNames.orderGet]
+    description: 'Tools for managing orders',
+    tools: [toolNames.orderList, toolNames.orderGet, toolNames.orderCreate, toolNames.orderUpdate, toolNames.orderDelete]
+  },
+  areas: {
+    name: 'Geographic Area Management',
+    description: 'Tools for managing provinces, cities, and districts',
+    tools: [toolNames.areaList, toolNames.areaGet, toolNames.areaGetTree, toolNames.areaCreate, toolNames.areaUpdate, toolNames.areaDelete]
+  },
+  companies: {
+    name: 'Company Management',
+    description: 'Tools for managing companies',
+    tools: [toolNames.companyList, toolNames.companyGet, toolNames.companyCreate, toolNames.companyUpdate, toolNames.companyDelete]
+  },
+  files: {
+    name: 'File Management',
+    description: 'Tools for managing files',
+    tools: [toolNames.fileList, toolNames.fileGet, toolNames.fileDelete]
+  },
+  bankNames: {
+    name: 'Bank Name Management',
+    description: 'Tools for managing bank names',
+    tools: [toolNames.bankNameList, toolNames.bankNameGet, toolNames.bankNameCreate, toolNames.bankNameUpdate, toolNames.bankNameDelete]
+  },
+  channels: {
+    name: 'Channel Management',
+    description: 'Tools for managing channels',
+    tools: [toolNames.channelList, toolNames.channelGet, toolNames.channelCreate, toolNames.channelUpdate, toolNames.channelDelete]
+  },
+  disability: {
+    name: 'Disabled Person Management',
+    description: 'Tools for managing disabled persons',
+    tools: [toolNames.disabledPersonList, toolNames.disabledPersonGet, toolNames.disabledPersonCreate, toolNames.disabledPersonUpdate, toolNames.disabledPersonDelete]
+  },
+  disabilityCompany: {
+    name: 'Disability Company Query',
+    description: 'Tools for querying disabled persons with company information',
+    tools: [toolNames.queryDisabilityCompany]
+  },
+  platforms: {
+    name: 'Platform Management',
+    description: 'Tools for managing platforms',
+    tools: [toolNames.platformList, toolNames.platformGet, toolNames.platformCreate, toolNames.platformUpdate, toolNames.platformDelete, toolNames.platformToggleStatus]
+  },
+  salaries: {
+    name: 'Salary Level Management',
+    description: 'Tools for managing salary levels',
+    tools: [toolNames.salaryList, toolNames.salaryGet, toolNames.salaryCreate, toolNames.salaryUpdate, toolNames.salaryDelete]
   }
 };

+ 137 - 2
packages/admin-mcp-server/src/tools/order-tools.ts

@@ -5,8 +5,20 @@
  */
 
 import { getApiClient } from '../services/api-client.js';
-import { OrderListInputSchema, OrderGetInputSchema } from '../schemas/index.js';
-import type { OrderListInput, OrderGetInput } from '../schemas/index.js';
+import {
+  OrderListInputSchema,
+  OrderGetInputSchema,
+  OrderCreateInputSchema,
+  OrderUpdateInputSchema,
+  OrderDeleteInputSchema
+} from '../schemas/index.js';
+import type {
+  OrderListInput,
+  OrderGetInput,
+  OrderCreateInput,
+  OrderUpdateInput,
+  OrderDeleteInput
+} from '../schemas/index.js';
 import { ResponseFormat } from '../constants.js';
 import type { Order, PaginatedResponse } from '../types.js';
 
@@ -167,6 +179,114 @@ export const orderGetTool = async (args: OrderGetInput) => {
   }
 };
 
+/**
+ * Create order tool
+ */
+export const orderCreateTool = async (args: OrderCreateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const response = await apiClient.post<Order>('/api/v1/orders/createOrder', args);
+
+    const order = response;
+
+    const structuredOutput = {
+      id: order.id,
+      orderNo: order.orderNo,
+      userId: order.userId,
+      companyId: args.companyId,
+      platformId: args.platformId,
+      orderAmount: args.orderAmount,
+      status: order.status,
+      createdAt: order.createdAt
+    };
+
+    const markdown = `✅ **Order Created Successfully**\n\n${formatOrderMarkdown(order)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to create order'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Update order tool
+ */
+export const orderUpdateTool = async (args: OrderUpdateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id, ...updateData } = args;
+    const response = await apiClient.post<Order>('/api/v1/orders/updateOrder', { id, ...updateData });
+
+    const order = response;
+
+    const structuredOutput = {
+      id: order.id,
+      orderNo: order.orderNo,
+      userId: order.userId,
+      companyId: args.companyId,
+      platformId: args.platformId,
+      orderAmount: args.orderAmount,
+      status: order.status,
+      updatedAt: order.updatedAt
+    };
+
+    const markdown = `✅ **Order Updated Successfully**\n\n${formatOrderMarkdown(order)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to update order'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Delete order tool
+ */
+export const orderDeleteTool = async (args: OrderDeleteInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    await apiClient.post<{ success: boolean }>('/api/v1/orders/deleteOrder', { id });
+
+    const markdown = `✅ **Order Deleted Successfully**\n\nOrder ID ${id} has been deleted.`;
+
+    const structuredOutput = {
+      success: true,
+      deletedOrderId: id
+    };
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to delete order'}`
+      }]
+    };
+  }
+};
+
 // Export tool registration configs
 export const orderTools = {
   orderList: {
@@ -178,5 +298,20 @@ export const orderTools = {
     name: 'admin_get_order',
     schema: OrderGetInputSchema,
     handler: orderGetTool
+  },
+  orderCreate: {
+    name: 'admin_create_order',
+    schema: OrderCreateInputSchema,
+    handler: orderCreateTool
+  },
+  orderUpdate: {
+    name: 'admin_update_order',
+    schema: OrderUpdateInputSchema,
+    handler: orderUpdateTool
+  },
+  orderDelete: {
+    name: 'admin_delete_order',
+    schema: OrderDeleteInputSchema,
+    handler: orderDeleteTool
   }
 };

+ 345 - 0
packages/admin-mcp-server/src/tools/platform-tools.ts

@@ -0,0 +1,345 @@
+/**
+ * Platform Management Tools
+ *
+ * MCP tools for managing platforms in the admin system.
+ * Uses custom routes with skip/take pagination.
+ */
+
+import { getApiClient } from '../services/api-client.js';
+import {
+  PlatformListInputSchema,
+  PlatformGetInputSchema,
+  PlatformCreateInputSchema,
+  PlatformUpdateInputSchema,
+  PlatformDeleteInputSchema,
+  PlatformToggleStatusInputSchema
+} from '../schemas/index.js';
+import type {
+  PlatformListInput,
+  PlatformGetInput,
+  PlatformCreateInput,
+  PlatformUpdateInput,
+  PlatformDeleteInput,
+  PlatformToggleStatusInput
+} from '../schemas/index.js';
+import { CHARACTER_LIMIT, ResponseFormat } from '../constants.js';
+import type { Platform } from '../types.js';
+
+/**
+ * Format platform data for markdown output
+ */
+function formatPlatformMarkdown(platform: Platform): string {
+  const lines = [
+    `## Platform: ${platform.platformName} (ID: ${platform.id})`,
+    '',
+    `**Platform Name**: ${platform.platformName}`,
+    platform.contactPerson ? `**Contact Person**: ${platform.contactPerson}` : null,
+    platform.contactPhone ? `**Contact Phone**: ${platform.contactPhone}` : null,
+    platform.contactEmail ? `**Contact Email**: ${platform.contactEmail}` : null,
+    `**Status**: ${platform.status === 1 ? 'Enabled' : 'Disabled'}`,
+    `**Created At**: ${new Date(platform.createTime).toLocaleString('zh-CN')}`,
+    ''
+  ].filter(Boolean);
+
+  return lines.join('\n');
+}
+
+/**
+ * Format platform list for markdown output
+ */
+function formatPlatformListMarkdown(platforms: Platform[], total: number, skip: number, take: number): string {
+  const lines = [
+    `# Platform List`,
+    '',
+    `Total: ${total} platforms | Skip: ${skip} | Take: ${take}`,
+    ''
+  ];
+
+  for (const platform of platforms) {
+    lines.push(formatPlatformMarkdown(platform));
+  }
+
+  return lines.join('\n');
+}
+
+/**
+ * List platforms tool
+ */
+export const platformListTool = async (args: PlatformListInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { skip = 0, take = 20, response_format } = args;
+
+    const params: Record<string, unknown> = {
+      skip: skip.toString(),
+      take: take.toString()
+    };
+
+    // Custom route uses getAllPlatforms endpoint
+    const response = await apiClient.get<{ data: Platform[]; total: number }>('/api/v1/platforms/getAllPlatforms', params);
+
+    const platforms = response.data || [];
+    const total = response.total || 0;
+
+    const structuredOutput = {
+      total,
+      count: platforms.length,
+      skip,
+      take,
+      platforms: platforms.map((p: Platform) => ({
+        id: p.id,
+        platformName: p.platformName,
+        contactPerson: p.contactPerson,
+        contactPhone: p.contactPhone,
+        contactEmail: p.contactEmail,
+        status: p.status,
+        createTime: p.createTime
+      })),
+      hasMore: skip + take < total
+    };
+
+    let textContent: string;
+    if (response_format === ResponseFormat.JSON) {
+      textContent = JSON.stringify(structuredOutput, null, 2);
+    } else {
+      let markdown = formatPlatformListMarkdown(platforms, total, skip, take);
+
+      // Check character limit
+      if (markdown.length > CHARACTER_LIMIT) {
+        const halfLength = Math.floor(platforms.length / 2);
+        const truncatedPlatforms = platforms.slice(0, halfLength);
+        markdown = formatPlatformListMarkdown(truncatedPlatforms, total, skip, take);
+        markdown += `\n---\n⚠️ **Response truncated**: Showing ${halfLength} of ${platforms.length} results. Use pagination to see more.\n`;
+      }
+
+      textContent = markdown;
+    }
+
+    return {
+      content: [{ type: 'text', text: textContent }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to list platforms'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Get single platform tool
+ */
+export const platformGetTool = async (args: PlatformGetInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    const response = await apiClient.get<Platform>(`/api/v1/platforms/getPlatform/${id}`);
+
+    const platform = response;
+
+    const structuredOutput = {
+      id: platform.id,
+      platformName: platform.platformName,
+      contactPerson: platform.contactPerson,
+      contactPhone: platform.contactPhone,
+      contactEmail: platform.contactEmail,
+      status: platform.status,
+      createTime: platform.createTime,
+      updateTime: platform.updateTime
+    };
+
+    const markdown = formatPlatformMarkdown(platform);
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to get platform'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Create platform tool
+ */
+export const platformCreateTool = async (args: PlatformCreateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const response = await apiClient.post<Platform>('/api/v1/platforms/createPlatform', args);
+
+    const platform = response;
+
+    const structuredOutput = {
+      id: platform.id,
+      platformName: platform.platformName,
+      contactPerson: platform.contactPerson,
+      contactPhone: platform.contactPhone,
+      contactEmail: platform.contactEmail,
+      status: platform.status,
+      createTime: platform.createTime
+    };
+
+    const markdown = `✅ **Platform Created Successfully**\n\n${formatPlatformMarkdown(platform)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to create platform'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Update platform tool
+ */
+export const platformUpdateTool = async (args: PlatformUpdateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id, ...updateData } = args;
+    const response = await apiClient.post<Platform>('/api/v1/platforms/updatePlatform', { id, ...updateData });
+
+    const platform = response;
+
+    const structuredOutput = {
+      id: platform.id,
+      platformName: platform.platformName,
+      contactPerson: platform.contactPerson,
+      contactPhone: platform.contactPhone,
+      contactEmail: platform.contactEmail,
+      status: platform.status,
+      updateTime: platform.updateTime
+    };
+
+    const markdown = `✅ **Platform Updated Successfully**\n\n${formatPlatformMarkdown(platform)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to update platform'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Delete platform tool
+ */
+export const platformDeleteTool = async (args: PlatformDeleteInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    await apiClient.post<{ success: boolean }>('/api/v1/platforms/deletePlatform', { id });
+
+    const markdown = `✅ **Platform Deleted Successfully**\n\nPlatform ID ${id} has been deleted.`;
+
+    const structuredOutput = {
+      success: true,
+      deletedPlatformId: id
+    };
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to delete platform'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Toggle platform status tool
+ */
+export const platformToggleStatusTool = async (args: PlatformToggleStatusInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    const response = await apiClient.post<Platform>('/api/v1/platforms/togglePlatformStatus', { id });
+
+    const platform = response;
+
+    const structuredOutput = {
+      id: platform.id,
+      platformName: platform.platformName,
+      status: platform.status,
+      newStatus: platform.status === 1 ? 'Enabled' : 'Disabled'
+    };
+
+    const markdown = `✅ **Platform Status Toggled Successfully**\n\n**Platform**: ${platform.platformName} (ID: ${id})\n**New Status**: ${platform.status === 1 ? 'Enabled' : 'Disabled'}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to toggle platform status'}`
+      }]
+    };
+  }
+};
+
+// Export tool registration configs
+export const platformTools = {
+  platformList: {
+    name: 'admin_list_platforms',
+    schema: PlatformListInputSchema,
+    handler: platformListTool
+  },
+  platformGet: {
+    name: 'admin_get_platform',
+    schema: PlatformGetInputSchema,
+    handler: platformGetTool
+  },
+  platformCreate: {
+    name: 'admin_create_platform',
+    schema: PlatformCreateInputSchema,
+    handler: platformCreateTool
+  },
+  platformUpdate: {
+    name: 'admin_update_platform',
+    schema: PlatformUpdateInputSchema,
+    handler: platformUpdateTool
+  },
+  platformDelete: {
+    name: 'admin_delete_platform',
+    schema: PlatformDeleteInputSchema,
+    handler: platformDeleteTool
+  },
+  platformToggleStatus: {
+    name: 'admin_toggle_platform_status',
+    schema: PlatformToggleStatusInputSchema,
+    handler: platformToggleStatusTool
+  }
+};

+ 317 - 0
packages/admin-mcp-server/src/tools/salary-tools.ts

@@ -0,0 +1,317 @@
+/**
+ * Salary Level Management Tools
+ *
+ * MCP tools for managing salary levels in the admin system.
+ * Uses custom routes with skip/take pagination.
+ */
+
+import { getApiClient } from '../services/api-client.js';
+import {
+  SalaryListInputSchema,
+  SalaryGetInputSchema,
+  SalaryCreateInputSchema,
+  SalaryUpdateInputSchema,
+  SalaryDeleteInputSchema
+} from '../schemas/index.js';
+import type {
+  SalaryListInput,
+  SalaryGetInput,
+  SalaryCreateInput,
+  SalaryUpdateInput,
+  SalaryDeleteInput
+} from '../schemas/index.js';
+import { CHARACTER_LIMIT, ResponseFormat } from '../constants.js';
+import type { SalaryLevel } from '../types.js';
+
+/**
+ * Format salary level data for markdown output
+ */
+function formatSalaryMarkdown(salary: SalaryLevel): string {
+  const lines = [
+    `## Salary Level (ID: ${salary.id})`,
+    '',
+    salary.provinceId ? `**Province ID**: ${salary.provinceId}` : null,
+    salary.cityId ? `**City ID**: ${salary.cityId}` : null,
+    salary.districtId ? `**District ID**: ${salary.districtId}` : null,
+    salary.baseSalary !== null && salary.baseSalary !== undefined ? `**Base Salary**: ¥${salary.baseSalary.toFixed(2)}` : null,
+    salary.allowance !== null && salary.allowance !== undefined ? `**Allowance**: ¥${salary.allowance.toFixed(2)}` : null,
+    salary.insurance !== null && salary.insurance !== undefined ? `**Insurance**: ¥${salary.insurance.toFixed(2)}` : null,
+    salary.providentFund !== null && salary.providentFund !== undefined ? `**Provident Fund**: ¥${salary.providentFund.toFixed(2)}` : null,
+    salary.totalSalary !== null && salary.totalSalary !== undefined ? `**Total Salary**: ¥${salary.totalSalary.toFixed(2)}` : null,
+    `**Updated At**: ${new Date(salary.updateTime).toLocaleString('zh-CN')}`,
+    ''
+  ].filter(Boolean);
+
+  return lines.join('\n');
+}
+
+/**
+ * Format salary level list for markdown output
+ */
+function formatSalaryListMarkdown(salaries: SalaryLevel[], total: number, skip: number, take: number): string {
+  const lines = [
+    `# Salary Level List`,
+    '',
+    `Total: ${total} levels | Skip: ${skip} | Take: ${take}`,
+    ''
+  ];
+
+  for (const salary of salaries) {
+    lines.push(formatSalaryMarkdown(salary));
+  }
+
+  return lines.join('\n');
+}
+
+/**
+ * List salary levels tool
+ */
+export const salaryListTool = async (args: SalaryListInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { skip = 0, take = 20, response_format } = args;
+
+    const params: Record<string, unknown> = {
+      skip: skip.toString(),
+      take: take.toString()
+    };
+
+    // Custom route uses getAllSalaries endpoint
+    const response = await apiClient.get<{ data: SalaryLevel[]; total: number }>('/api/v1/salaries/getAllSalaries', params);
+
+    const salaries = response.data || [];
+    const total = response.total || 0;
+
+    const structuredOutput = {
+      total,
+      count: salaries.length,
+      skip,
+      take,
+      salaries: salaries.map((s: SalaryLevel) => ({
+        id: s.id,
+        provinceId: s.provinceId,
+        cityId: s.cityId,
+        districtId: s.districtId,
+        baseSalary: s.baseSalary,
+        allowance: s.allowance,
+        insurance: s.insurance,
+        providentFund: s.providentFund,
+        totalSalary: s.totalSalary,
+        updateTime: s.updateTime
+      })),
+      hasMore: skip + take < total
+    };
+
+    let textContent: string;
+    if (response_format === ResponseFormat.JSON) {
+      textContent = JSON.stringify(structuredOutput, null, 2);
+    } else {
+      let markdown = formatSalaryListMarkdown(salaries, total, skip, take);
+
+      // Check character limit
+      if (markdown.length > CHARACTER_LIMIT) {
+        const halfLength = Math.floor(salaries.length / 2);
+        const truncatedSalaries = salaries.slice(0, halfLength);
+        markdown = formatSalaryListMarkdown(truncatedSalaries, total, skip, take);
+        markdown += `\n---\n⚠️ **Response truncated**: Showing ${halfLength} of ${salaries.length} results. Use pagination to see more.\n`;
+      }
+
+      textContent = markdown;
+    }
+
+    return {
+      content: [{ type: 'text', text: textContent }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to list salary levels'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Get single salary level tool
+ */
+export const salaryGetTool = async (args: SalaryGetInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    const response = await apiClient.get<SalaryLevel>(`/api/v1/salaries/${id}`);
+
+    const salary = response;
+
+    const structuredOutput = {
+      id: salary.id,
+      provinceId: salary.provinceId,
+      cityId: salary.cityId,
+      districtId: salary.districtId,
+      baseSalary: salary.baseSalary,
+      allowance: salary.allowance,
+      insurance: salary.insurance,
+      providentFund: salary.providentFund,
+      totalSalary: salary.totalSalary,
+      updateTime: salary.updateTime
+    };
+
+    const markdown = formatSalaryMarkdown(salary);
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to get salary level'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Create salary level tool
+ */
+export const salaryCreateTool = async (args: SalaryCreateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const response = await apiClient.post<SalaryLevel>('/api/v1/salaries/createSalary', args);
+
+    const salary = response;
+
+    const structuredOutput = {
+      id: salary.id,
+      provinceId: salary.provinceId,
+      cityId: salary.cityId,
+      districtId: salary.districtId,
+      baseSalary: salary.baseSalary,
+      allowance: salary.allowance,
+      insurance: salary.insurance,
+      providentFund: salary.providentFund,
+      totalSalary: salary.totalSalary,
+      updateTime: salary.updateTime
+    };
+
+    const markdown = `✅ **Salary Level Created Successfully**\n\n${formatSalaryMarkdown(salary)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to create salary level'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Update salary level tool
+ */
+export const salaryUpdateTool = async (args: SalaryUpdateInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id, ...updateData } = args;
+    const response = await apiClient.post<SalaryLevel>('/api/v1/salaries/updateSalary', { id, ...updateData });
+
+    const salary = response;
+
+    const structuredOutput = {
+      id: salary.id,
+      provinceId: salary.provinceId,
+      cityId: salary.cityId,
+      districtId: salary.districtId,
+      baseSalary: salary.baseSalary,
+      allowance: salary.allowance,
+      insurance: salary.insurance,
+      providentFund: salary.providentFund,
+      totalSalary: salary.totalSalary,
+      updateTime: salary.updateTime
+    };
+
+    const markdown = `✅ **Salary Level Updated Successfully**\n\n${formatSalaryMarkdown(salary)}`;
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to update salary level'}`
+      }]
+    };
+  }
+};
+
+/**
+ * Delete salary level tool
+ */
+export const salaryDeleteTool = async (args: SalaryDeleteInput) => {
+  const apiClient = getApiClient();
+
+  try {
+    const { id } = args;
+    await apiClient.post<{ success: boolean }>('/api/v1/salaries/deleteSalary', { id });
+
+    const markdown = `✅ **Salary Level Deleted Successfully**\n\nSalary Level ID ${id} has been deleted.`;
+
+    const structuredOutput = {
+      success: true,
+      deletedSalaryId: id
+    };
+
+    return {
+      content: [{ type: 'text', text: markdown }],
+      structuredContent: structuredOutput
+    };
+  } catch (error) {
+    return {
+      content: [{
+        type: 'text',
+        text: `Error: ${error instanceof Error ? error.message : 'Failed to delete salary level'}`
+      }]
+    };
+  }
+};
+
+// Export tool registration configs
+export const salaryTools = {
+  salaryList: {
+    name: 'admin_list_salaries',
+    schema: SalaryListInputSchema,
+    handler: salaryListTool
+  },
+  salaryGet: {
+    name: 'admin_get_salary',
+    schema: SalaryGetInputSchema,
+    handler: salaryGetTool
+  },
+  salaryCreate: {
+    name: 'admin_create_salary',
+    schema: SalaryCreateInputSchema,
+    handler: salaryCreateTool
+  },
+  salaryUpdate: {
+    name: 'admin_update_salary',
+    schema: SalaryUpdateInputSchema,
+    handler: salaryUpdateTool
+  },
+  salaryDelete: {
+    name: 'admin_delete_salary',
+    schema: SalaryDeleteInputSchema,
+    handler: salaryDeleteTool
+  }
+};

+ 90 - 3
packages/admin-mcp-server/src/types.ts

@@ -227,10 +227,13 @@ export interface Company {
  */
 export interface Platform {
   id: number;
-  name: string;
+  platformName: string;
+  contactPerson?: string | null;
+  contactPhone?: string | null;
+  contactEmail?: string | null;
   status: number;
-  createdAt: Date;
-  updatedAt: Date;
+  createTime: Date;
+  updateTime: Date;
 }
 
 // ============================================================================
@@ -249,6 +252,7 @@ export interface File {
   uploadUserId: number;
   uploadUser?: User;
   createdAt: Date;
+  updatedAt?: Date;
 }
 
 // ============================================================================
@@ -311,6 +315,89 @@ export interface TokenResponse {
   user?: User;
 }
 
+// ============================================================================
+// Bank Name Types
+// ============================================================================
+
+/**
+ * Bank name entity
+ */
+export interface BankName {
+  id: number;
+  name: string;
+  code: string;
+  status: number;
+  createdAt: Date;
+  updatedAt: Date;
+}
+
+// ============================================================================
+// Channel Types
+// ============================================================================
+
+/**
+ * Channel entity
+ */
+export interface Channel {
+  id: number;
+  channelName: string;
+  channelType: string;
+  contactPerson?: string | null;
+  contactPhone?: string | null;
+  description?: string | null;
+  status: number;
+  createTime: Date;
+  updateTime: Date;
+}
+
+// ============================================================================
+// Disabled Person Types
+// ============================================================================
+
+/**
+ * Disabled person entity
+ */
+export interface DisabledPerson {
+  id: number;
+  name: string;
+  idCard: string;
+  disabilityCertNo: string;
+  disabilityType?: string | null;
+  disabilityLevel?: string | null;
+  phone?: string | null;
+  gender?: string | null;
+  birthday?: Date | null;
+  address?: string | null;
+  city?: string | null;
+  district?: string | null;
+  companyId?: number | null;
+  company?: Company;
+  platformId?: number | null;
+  status?: number;
+  createTime?: Date;
+  updateTime?: Date;
+}
+
+// ============================================================================
+// Salary Level Types
+// ============================================================================
+
+/**
+ * Salary level entity
+ */
+export interface SalaryLevel {
+  id: number;
+  provinceId?: number | null;
+  cityId?: number | null;
+  districtId?: number | null;
+  baseSalary?: number | null;
+  allowance?: number | null;
+  insurance?: number | null;
+  providentFund?: number | null;
+  totalSalary?: number | null;
+  updateTime: Date;
+}
+
 // ============================================================================
 // Query/Filter Types
 // ============================================================================