Skip to main content
Glama
index.ts5.18 kB
import { GitHubConfig, ToolResponse } from '../../shared/types.js'; import { GitHubUtils } from '../../shared/utils.js'; export async function createIssue(config: GitHubConfig, args: any): Promise<ToolResponse> { try { GitHubUtils.validateRepoConfig(config); const response = await config.octokit.rest.issues.create({ owner: config.owner, repo: config.repo, title: args.title, body: args.body, labels: args.labels, assignees: args.assignees, milestone: args.milestone }); const issue = response.data; const resultText = `✅ **Issue created successfully!**\n\n` + `**Title:** ${issue.title}\n` + `**Number:** #${issue.number}\n` + `**State:** ${issue.state}\n` + `**Labels:** ${issue.labels.map((l: any) => l.name).join(', ') || 'None'}\n` + `**Assignees:** ${(issue.assignees || []).map((a: any) => a.login).join(', ') || 'None'}\n` + `**URL:** ${issue.html_url}`; return GitHubUtils.createSuccessResponse(resultText); } catch (error) { return GitHubUtils.createErrorResponse(new Error(`Failed to create issue: ${(error as Error).message}`)); } } export async function listIssues(config: GitHubConfig, args: any): Promise<ToolResponse> { try { GitHubUtils.validateRepoConfig(config); const response = await config.octokit.rest.issues.listForRepo({ owner: config.owner, repo: config.repo, state: args.state || 'open', labels: args.labels, assignee: args.assignee, milestone: args.milestone, per_page: 50 }); let result = `📋 **Repository Issues** - Found ${response.data.length} issues\n\n`; if (response.data.length === 0) { result += "No issues found matching the criteria."; } else { response.data.forEach(issue => { result += `**${issue.title}** (#${issue.number})\n`; result += ` 🏷️ Labels: ${issue.labels.map((l: any) => l.name).join(', ') || 'None'}\n`; result += ` 👤 Assignees: ${(issue.assignees || []).map((a: any) => a.login).join(', ') || 'None'}\n`; result += ` 📅 Created: ${new Date(issue.created_at).toLocaleDateString()}\n`; result += ` 🔗 ${issue.html_url}\n\n`; }); } return GitHubUtils.createSuccessResponse(result); } catch (error) { return GitHubUtils.createErrorResponse(new Error(`Failed to list issues: ${(error as Error).message}`)); } } export async function getIssue(config: GitHubConfig, args: any): Promise<ToolResponse> { try { GitHubUtils.validateRepoConfig(config); const response = await config.octokit.rest.issues.get({ owner: config.owner, repo: config.repo, issue_number: args.issue_number }); const issue = response.data; let result = `📝 **Issue Details: ${issue.title}**\n\n`; result += `**Number:** #${issue.number}\n`; result += `**State:** ${issue.state}\n`; result += `**Author:** ${issue.user?.login}\n`; result += `**Created:** ${new Date(issue.created_at).toLocaleDateString()}\n`; result += `**Updated:** ${new Date(issue.updated_at).toLocaleDateString()}\n`; result += `**Labels:** ${issue.labels.map((l: any) => l.name).join(', ') || 'None'}\n`; result += `**Assignees:** ${(issue.assignees || []).map((a: any) => a.login).join(', ') || 'None'}\n`; result += `**Milestone:** ${issue.milestone?.title || 'None'}\n`; result += `**Comments:** ${issue.comments}\n`; result += `**URL:** ${issue.html_url}\n\n`; if (issue.body) { result += `**Description:**\n${issue.body.length > 200 ? issue.body.substring(0, 200) + '...' : issue.body}`; } return GitHubUtils.createSuccessResponse(result); } catch (error) { return GitHubUtils.createErrorResponse(new Error(`Failed to get issue: ${(error as Error).message}`)); } } export async function updateIssue(config: GitHubConfig, args: any): Promise<ToolResponse> { try { GitHubUtils.validateRepoConfig(config); const updateData: any = { owner: config.owner, repo: config.repo, issue_number: args.issue_number }; if (args.title) updateData.title = args.title; if (args.body) updateData.body = args.body; if (args.state) updateData.state = args.state; if (args.labels) updateData.labels = args.labels; if (args.assignees) updateData.assignees = args.assignees; if (args.milestone) updateData.milestone = args.milestone; const response = await config.octokit.rest.issues.update(updateData); const issue = response.data; const resultText = `✅ **Issue updated successfully!**\n\n` + `**Title:** ${issue.title}\n` + `**Number:** #${issue.number}\n` + `**State:** ${issue.state}\n` + `**Labels:** ${issue.labels.map((l: any) => l.name).join(', ') || 'None'}\n` + `**Assignees:** ${(issue.assignees || []).map((a: any) => a.login).join(', ') || 'None'}\n` + `**URL:** ${issue.html_url}`; return GitHubUtils.createSuccessResponse(resultText); } catch (error) { return GitHubUtils.createErrorResponse(new Error(`Failed to update issue: ${(error as Error).message}`)); } }

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/Faresabdelghany/github-project-manager-mcp'

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