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);
        });
      }
    );

Tool Definition Quality

Score is being calculated. Check back soon.

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