github_repo_commits
Retrieve commit history from GitHub repositories to analyze development activity and track changes for security research and OSINT investigations.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| owner | Yes | Repository owner | |
| repo | Yes | Repository name |
Implementation Reference
- src/tools/github.ts:79-103 (handler)The logic implementation of the github_repo_commits tool, fetching commit data and extracting unique emails.
async getRepoCommits(owner: string, repo: string): Promise<string[]> { try { const commits = await this.fetch<any[]>(`repos/${owner}/${repo}/commits`, { method: "GET", headers: this.getHeaders(), }, { per_page: 50 }); const emails = new Set<string>(); commits.forEach((c: any) => { if (c.commit?.author?.email && !c.commit.author.email.includes("noreply")) { emails.add(c.commit.author.email); } if (c.commit?.committer?.email && !c.commit.committer.email.includes("noreply")) { emails.add(c.commit.committer.email); } }); return Array.from(emails); } catch (error) { if (error instanceof McpError) throw error; throw new McpError(ErrorCode.InternalError, `GitHub Repo Commits error: ${(error as Error).message}`); } } - src/index.ts:386-398 (registration)The registration of the 'github_repo_commits' tool in the MCP server instance, mapping input parameters to the handler method.
server.tool( "github_repo_commits", { owner: z.string().describe("Repository owner"), repo: z.string().describe("Repository name"), }, async ({ owner, repo }) => { const result = await ghClient.getRepoCommits(owner, repo); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }], }; } );