Skip to main content
Glama
blackgirlbytes

GitHub Calendar MCP Server

get_person_schedule

Retrieve a team member's upcoming GitHub work schedule to track tasks and manage team availability.

Instructions

Get the schedule and upcoming work for a specific team member

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
loginYesGitHub username of the team member
daysNoNumber of days to look ahead (default: 7)

Implementation Reference

  • Core handler logic: fetches GitHub issues assigned to the person, enriches with due date calculations, sorts by urgency (due date then recency), and constructs PersonSchedule object.
    async getPersonSchedule(login: string): Promise<PersonSchedule> {
      try {
        // Get open issues assigned to this person
        const issues = await this.githubClient.getIssuesByAssignee(login);
        
        // Get avatar URL from first issue
        const avatarUrl = issues[0]?.assignees.find(a => a.login === login)?.avatar_url || '';
        
        // Build upcoming issues with due date info
        const upcomingIssues = issues.map(issue => {
          const dueDate = issue.milestone?.due_on || null;
          const daysUntilDue = dueDate ? differenceInDays(parseISO(dueDate), new Date()) : null;
          
          return {
            issue,
            dueDate,
            daysUntilDue
          };
        });
    
        // Sort by due date (soonest first, then by creation date)
        upcomingIssues.sort((a, b) => {
          // Items with due dates come first
          if (a.daysUntilDue !== null && b.daysUntilDue === null) return -1;
          if (a.daysUntilDue === null && b.daysUntilDue !== null) return 1;
          
          // Both have due dates, sort by days until due
          if (a.daysUntilDue !== null && b.daysUntilDue !== null) {
            return a.daysUntilDue - b.daysUntilDue;
          }
          
          // Neither has due date, sort by creation date (newest first)
          return new Date(b.issue.created_at).getTime() - new Date(a.issue.created_at).getTime();
        });
    
        return {
          login,
          avatar_url: avatarUrl,
          upcomingIssues
        };
      } catch (error) {
        console.error(`Error getting schedule for ${login}:`, error);
        throw error;
      }
    }
  • Tool-specific handler: fetches full schedule and filters upcoming issues to those due within the requested number of days (or no due date).
    async getPersonScheduleForDateRange(login: string, days: number = 7): Promise<PersonSchedule> {
      const schedule = await this.getPersonSchedule(login);
      
      // Filter to only include issues due within the specified number of days
      const filteredIssues = schedule.upcomingIssues.filter(item => {
        if (item.daysUntilDue === null) return true; // Include items without due dates
        return item.daysUntilDue <= days; // Include items due within the range
      });
    
      return {
        ...schedule,
        upcomingIssues: filteredIssues
      };
    }
  • MCP dispatch handler: parses tool arguments, invokes PersonScheduleTool.getPersonScheduleForDateRange, formats output, and returns MCP tool response.
    case 'get_person_schedule': {
      const { login, days = 7 } = args as { login: string; days?: number };
      const schedule = await this.personScheduleTool.getPersonScheduleForDateRange(login, days);
      return {
        content: [
          {
            type: 'text',
            text: this.formatPersonSchedule(schedule, days),
          },
        ],
      };
    }
  • src/index.ts:101-119 (registration)
    Tool registration in MCP listTools handler: defines name, description, and input schema (login required, days optional).
    {
      name: 'get_person_schedule',
      description: 'Get the schedule and upcoming work for a specific team member',
      inputSchema: {
        type: 'object',
        properties: {
          login: {
            type: 'string',
            description: 'GitHub username of the team member',
          },
          days: {
            type: 'number',
            description: 'Number of days to look ahead (default: 7)',
            default: 7,
          },
        },
        required: ['login'],
      },
    },
  • Helper function to format the PersonSchedule into a human-readable markdown string, including issue titles, due status, and links.
    private formatPersonSchedule(schedule: any, days: number): string {
      const { login, upcomingIssues } = schedule;
      
      let output = `## ${login}'s Schedule (next ${days} days)\n\n`;
      
      if (upcomingIssues.length === 0) {
        output += 'No upcoming issues assigned.\n';
        return output;
      }
    
      output += '**Upcoming Work:**\n';
      for (const item of upcomingIssues) {
        const { issue, daysUntilDue } = item;
        output += `- **${issue.title}**`;
        
        if (daysUntilDue !== null) {
          if (daysUntilDue < 0) {
            output += ` (overdue by ${Math.abs(daysUntilDue)} days)`;
          } else if (daysUntilDue === 0) {
            output += ` (due today)`;
          } else {
            output += ` (due in ${daysUntilDue} days)`;
          }
        }
        
        output += `\n  - Issue #${issue.number}: ${issue.html_url}\n`;
      }
    
      return output;
    }

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/blackgirlbytes/github-calendar-mcp-server'

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