Skip to main content
Glama

get_assignment_statistics

Analyze bug assignment statistics in Mantis Bug Tracker to track user-specific issue distributions, filter by status, and include unassigned issues for comprehensive insights.

Instructions

獲取 Mantis 問題分派統計數據,分析不同用戶的問題分派情況

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
includeUnassignedNo是否包含未分派問題
projectIdNo專案 ID
statusFilterNo狀態過濾器,只計算特定狀態的問題

Implementation Reference

  • Handler function that implements the core logic of get_assignment_statistics: fetches issues, filters by status, gathers handler users, computes per-user statistics (total, open, closed issues), handles unassigned issues.
    async (params) => {
      return withMantisConfigured("get_assignment_statistics", async () => {
        // 獲取問題
        const issues = await mantisApi.getIssues({
          projectId: params.projectId,
          pageSize: 1000 // 獲取大量數據用於統計
        });
    
        // 過濾問題
        let filteredIssues = issues;
        if (params.statusFilter?.length) {
          filteredIssues = issues.filter(issue =>
            params.statusFilter?.includes(issue.status.id)
          );
        }
    
        // 建立用戶問題統計
        const userMap = new Map<number, {
          id: number;
          name: string;
          email: string;
          issueCount: number;
          openIssues: number;
          closedIssues: number;
          issues: number[];
        }>();
    
        // 從問題中收集所有處理人ID
        const handlerIds = new Set<number>();
        filteredIssues.forEach(issue => {
          if (issue.handler?.id) {
            handlerIds.add(issue.handler.id);
          }
        });
    
        // 查詢每個處理人的詳細資訊並初始化統計
        for (const handlerId of handlerIds) {
          const user = await mantisApi.getUser(handlerId);
          userMap.set(user.id, {
            id: user.id,
            name: user.name,
            email: user.email || '',
            issueCount: 0,
            openIssues: 0,
            closedIssues: 0,
            issues: []
          });
        }
    
        // 未分派問題統計
        let unassignedCount = 0;
        let unassignedIssues: number[] = [];
    
        // 計算統計
        filteredIssues.forEach(issue => {
          if (issue.handler && issue.handler.id) {
            const userStat = userMap.get(issue.handler.id);
            if (userStat) {
              userStat.issueCount++;
              userStat.issues.push(issue.id);
    
              // 根據狀態判斷是否為關閉狀態
              if (issue.status.name.toLowerCase().includes('closed') ||
                issue.status.name.toLowerCase().includes('resolved')) {
                userStat.closedIssues++;
              } else {
                userStat.openIssues++;
              }
            }
          } else if (params.includeUnassigned) {
            unassignedCount++;
            unassignedIssues.push(issue.id);
          }
        });
    
        // 構建結果
        const statistics = {
          totalIssues: filteredIssues.length,
          assignedIssues: filteredIssues.length - unassignedCount,
          unassignedIssues: unassignedCount,
          userStatistics: Array.from(userMap.values())
            .filter(stat => stat.issueCount > 0)
            .sort((a, b) => b.issueCount - a.issueCount)
        };
    
        if (params.includeUnassigned && unassignedCount > 0) {
          statistics.userStatistics.push({
            id: 0,
            name: "未分派",
            email: "",
            issueCount: unassignedCount,
            openIssues: unassignedCount,
            closedIssues: 0,
            issues: unassignedIssues
          });
        }
    
        return JSON.stringify(statistics, null, 2);
      });
    }
  • Zod schema defining input parameters for the get_assignment_statistics tool.
    {
      projectId: z.number().optional().describe("專案 ID"),
      includeUnassigned: z.boolean().default(true).describe("是否包含未分派問題"),
      statusFilter: z.array(z.number()).optional().describe("狀態過濾器,只計算特定狀態的問題"),
    },
  • src/server.ts:293-401 (registration)
    Registration of the get_assignment_statistics tool on the MCP server.
    server.tool(
      "get_assignment_statistics",
      "獲取 Mantis 問題分派統計數據,分析不同用戶的問題分派情況",
      {
        projectId: z.number().optional().describe("專案 ID"),
        includeUnassigned: z.boolean().default(true).describe("是否包含未分派問題"),
        statusFilter: z.array(z.number()).optional().describe("狀態過濾器,只計算特定狀態的問題"),
      },
      async (params) => {
        return withMantisConfigured("get_assignment_statistics", async () => {
          // 獲取問題
          const issues = await mantisApi.getIssues({
            projectId: params.projectId,
            pageSize: 1000 // 獲取大量數據用於統計
          });
    
          // 過濾問題
          let filteredIssues = issues;
          if (params.statusFilter?.length) {
            filteredIssues = issues.filter(issue =>
              params.statusFilter?.includes(issue.status.id)
            );
          }
    
          // 建立用戶問題統計
          const userMap = new Map<number, {
            id: number;
            name: string;
            email: string;
            issueCount: number;
            openIssues: number;
            closedIssues: number;
            issues: number[];
          }>();
    
          // 從問題中收集所有處理人ID
          const handlerIds = new Set<number>();
          filteredIssues.forEach(issue => {
            if (issue.handler?.id) {
              handlerIds.add(issue.handler.id);
            }
          });
    
          // 查詢每個處理人的詳細資訊並初始化統計
          for (const handlerId of handlerIds) {
            const user = await mantisApi.getUser(handlerId);
            userMap.set(user.id, {
              id: user.id,
              name: user.name,
              email: user.email || '',
              issueCount: 0,
              openIssues: 0,
              closedIssues: 0,
              issues: []
            });
          }
    
          // 未分派問題統計
          let unassignedCount = 0;
          let unassignedIssues: number[] = [];
    
          // 計算統計
          filteredIssues.forEach(issue => {
            if (issue.handler && issue.handler.id) {
              const userStat = userMap.get(issue.handler.id);
              if (userStat) {
                userStat.issueCount++;
                userStat.issues.push(issue.id);
    
                // 根據狀態判斷是否為關閉狀態
                if (issue.status.name.toLowerCase().includes('closed') ||
                  issue.status.name.toLowerCase().includes('resolved')) {
                  userStat.closedIssues++;
                } else {
                  userStat.openIssues++;
                }
              }
            } else if (params.includeUnassigned) {
              unassignedCount++;
              unassignedIssues.push(issue.id);
            }
          });
    
          // 構建結果
          const statistics = {
            totalIssues: filteredIssues.length,
            assignedIssues: filteredIssues.length - unassignedCount,
            unassignedIssues: unassignedCount,
            userStatistics: Array.from(userMap.values())
              .filter(stat => stat.issueCount > 0)
              .sort((a, b) => b.issueCount - a.issueCount)
          };
    
          if (params.includeUnassigned && unassignedCount > 0) {
            statistics.userStatistics.push({
              id: 0,
              name: "未分派",
              email: "",
              issueCount: unassignedCount,
              openIssues: unassignedCount,
              closedIssues: 0,
              issues: unassignedIssues
            });
          }
    
          return JSON.stringify(statistics, null, 2);
        });
      }
    );
Install Server

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kfnzero/mantis-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server