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

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 工具扩展 - 添加缺失的管理后台功能'
 title: 'Admin MCP 工具扩展 - 添加缺失的管理后台功能'
 slug: 'admin-mcp-tools-extension'
 slug: 'admin-mcp-tools-extension'
 created: '2026-03-17'
 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']
 tech_stack: ['TypeScript', 'Zod', 'Hono', 'Express', 'Node.js']
 files_to_modify: [
 files_to_modify: [
   'packages/admin-mcp-server/src/index.ts',
   '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 { areaTools } from './tools/area-tools.js';
 import { companyTools } from './tools/company-tools.js';
 import { companyTools } from './tools/company-tools.js';
 import { authTools } from './tools/auth-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';
 import { getApiClient } from './services/api-client.js';
 
 
 // ============================================================================
 // ============================================================================
@@ -58,55 +65,7 @@ function createMcpServer(): McpServer {
  */
  */
 function registerAllTools(targetServer: McpServer): void {
 function registerAllTools(targetServer: McpServer): void {
   // Authentication tools
   // 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(
   registerToolWithAnnotations(
     authTools.getCurrentUser,
     authTools.getCurrentUser,
     { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
     { 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,
 This tool returns details about the user that is currently logged in,
 including their roles, permissions, and profile information.
 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:
 Args:
   - None
   - None
 
 
@@ -127,7 +89,7 @@ Examples:
   - Use when: "Check my admin permissions"
   - Use when: "Check my admin permissions"
 
 
 Error Handling:
 Error Handling:
-  - Returns "Error: Authentication failed" if not logged in`,
+  - Returns "Error: Authentication failed" if token is invalid`,
     targetServer
     targetServer
   );
   );
 
 
@@ -572,6 +534,74 @@ Returns:
 Examples:
 Examples:
   - Use when: "Get order with ID 12345" -> params with id=12345
   - 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:
 Error Handling:
   - Returns "Error: Resource not found" if order ID doesn't exist`,
   - Returns "Error: Resource not found" if order ID doesn't exist`,
     targetServer
     targetServer
@@ -849,6 +879,744 @@ Error Handling:
   - Returns "Error: Resource not found" if company ID doesn't exist`,
   - Returns "Error: Resource not found" if company ID doesn't exist`,
     targetServer
     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;
 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
 // Export all schema types
 // ============================================================================
 // ============================================================================
@@ -683,6 +1510,9 @@ export type SystemConfigUpdateInput = z.infer<typeof SystemConfigUpdateInputSche
 export type SystemConfigDeleteInput = z.infer<typeof SystemConfigDeleteInputSchema>;
 export type SystemConfigDeleteInput = z.infer<typeof SystemConfigDeleteInputSchema>;
 export type OrderListInput = z.infer<typeof OrderListInputSchema>;
 export type OrderListInput = z.infer<typeof OrderListInputSchema>;
 export type OrderGetInput = z.infer<typeof OrderGetInputSchema>;
 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 AreaListInput = z.infer<typeof AreaListInputSchema>;
 export type AreaGetInput = z.infer<typeof AreaGetInputSchema>;
 export type AreaGetInput = z.infer<typeof AreaGetInputSchema>;
 export type AreaCreateInput = z.infer<typeof AreaCreateInputSchema>;
 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 CompanyCreateInput = z.infer<typeof CompanyCreateInputSchema>;
 export type CompanyUpdateInput = z.infer<typeof CompanyUpdateInputSchema>;
 export type CompanyUpdateInput = z.infer<typeof CompanyUpdateInputSchema>;
 export type CompanyDeleteInput = z.infer<typeof CompanyDeleteInputSchema>;
 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
  * Authentication Tools
  *
  *
  * MCP tools for admin authentication.
  * 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 { 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
  * Get current user tool - returns current authenticated user info
@@ -153,17 +70,8 @@ export const getCurrentUserTool = async () => {
 };
 };
 
 
 // Export tool registration configs
 // Export tool registration configs
+// Note: Only getCurrentUser is exported as login/logout are handled via Authorization header
 export const authTools = {
 export const authTools = {
-  login: {
-    name: 'admin_login',
-    schema: LoginInputSchema,
-    handler: loginTool
-  },
-  logout: {
-    name: 'admin_logout',
-    schema: undefined, // No input schema needed
-    handler: logoutTool
-  },
   getCurrentUser: {
   getCurrentUser: {
     name: 'admin_get_current_user',
     name: 'admin_get_current_user',
     schema: undefined, // No input schema needed
     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.contactPhone ? `**Contact Phone**: ${company.contactPhone}` : null,
     company.contactEmail ? `**Contact Email**: ${company.contactEmail}` : null,
     company.contactEmail ? `**Contact Email**: ${company.contactEmail}` : null,
     company.address ? `**Address**: ${company.address}` : 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'}`,
     `**Status**: ${company.status === 1 ? 'Enabled' : 'Disabled'}`,
     `**Created At**: ${new Date(company.createTime).toLocaleString('zh-CN')}`,
     `**Created At**: ${new Date(company.createTime).toLocaleString('zh-CN')}`,
     ''
     ''
@@ -98,7 +98,7 @@ export const companyListTool = async (args: CompanyListInput) => {
         contactEmail: c.contactEmail,
         contactEmail: c.contactEmail,
         address: c.address,
         address: c.address,
         platformId: c.platformId,
         platformId: c.platformId,
-        platformName: c.platform?.name,
+        platformName: c.platform?.platformName,
         status: c.status,
         status: c.status,
         createTime: c.createTime
         createTime: c.createTime
       })),
       })),
@@ -156,7 +156,7 @@ export const companyGetTool = async (args: CompanyGetInput) => {
       contactEmail: company.contactEmail,
       contactEmail: company.contactEmail,
       address: company.address,
       address: company.address,
       platformId: company.platformId,
       platformId: company.platformId,
-      platformName: company.platform?.name,
+      platformName: company.platform?.platformName,
       status: company.status,
       status: company.status,
       createTime: company.createTime,
       createTime: company.createTime,
       updateTime: company.updateTime
       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 { roleTools } from './role-tools.js';
 import { systemConfigTools } from './system-config-tools.js';
 import { systemConfigTools } from './system-config-tools.js';
 import { orderTools } from './order-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 all tool collections
 export const allTools = {
 export const allTools = {
@@ -16,14 +25,21 @@ export const allTools = {
   ...userTools,
   ...userTools,
   ...roleTools,
   ...roleTools,
   ...systemConfigTools,
   ...systemConfigTools,
-  ...orderTools
+  ...orderTools,
+  ...areaTools,
+  ...companyTools,
+  ...fileTools,
+  ...bankNameTools,
+  ...channelTools,
+  ...disabilityTools,
+  ...disabilityCompanyTools,
+  ...platformTools,
+  ...salaryTools
 };
 };
 
 
 // Export tool names for easy reference
 // Export tool names for easy reference
 export const toolNames = {
 export const toolNames = {
   // Auth tools
   // Auth tools
-  login: 'admin_login',
-  logout: 'admin_logout',
   getCurrentUser: 'admin_get_current_user',
   getCurrentUser: 'admin_get_current_user',
 
 
   // User tools
   // User tools
@@ -49,7 +65,69 @@ export const toolNames = {
 
 
   // Order tools
   // Order tools
   orderList: 'admin_list_orders',
   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
 // Export tool categories for documentation
@@ -57,7 +135,7 @@ export const toolCategories = {
   auth: {
   auth: {
     name: 'Authentication',
     name: 'Authentication',
     description: 'Tools for admin authentication',
     description: 'Tools for admin authentication',
-    tools: [toolNames.login, toolNames.logout, toolNames.getCurrentUser]
+    tools: [toolNames.getCurrentUser]
   },
   },
   users: {
   users: {
     name: 'User Management',
     name: 'User Management',
@@ -76,7 +154,52 @@ export const toolCategories = {
   },
   },
   orders: {
   orders: {
     name: 'Order Management',
     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 { 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 { ResponseFormat } from '../constants.js';
 import type { Order, PaginatedResponse } from '../types.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 tool registration configs
 export const orderTools = {
 export const orderTools = {
   orderList: {
   orderList: {
@@ -178,5 +298,20 @@ export const orderTools = {
     name: 'admin_get_order',
     name: 'admin_get_order',
     schema: OrderGetInputSchema,
     schema: OrderGetInputSchema,
     handler: orderGetTool
     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 {
 export interface Platform {
   id: number;
   id: number;
-  name: string;
+  platformName: string;
+  contactPerson?: string | null;
+  contactPhone?: string | null;
+  contactEmail?: string | null;
   status: number;
   status: number;
-  createdAt: Date;
-  updatedAt: Date;
+  createTime: Date;
+  updateTime: Date;
 }
 }
 
 
 // ============================================================================
 // ============================================================================
@@ -249,6 +252,7 @@ export interface File {
   uploadUserId: number;
   uploadUserId: number;
   uploadUser?: User;
   uploadUser?: User;
   createdAt: Date;
   createdAt: Date;
+  updatedAt?: Date;
 }
 }
 
 
 // ============================================================================
 // ============================================================================
@@ -311,6 +315,89 @@ export interface TokenResponse {
   user?: User;
   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
 // Query/Filter Types
 // ============================================================================
 // ============================================================================