import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
import { Octokit } from '@octokit/rest';
const server = new McpServer({
name: 'github-tools',
version: '1.0.0',
});
const octokit = new Octokit({
auth: process.env.GITHUB_TOKEN,
});
server.registerTool(
'list_repos',
{
description: 'List repositories for a user or organization',
inputSchema: z.object({
owner: z.string().describe('Username or organization'),
type: z.enum(['all', 'owner', 'public', 'private'])
.optional()
.describe('Repository type'),
}).shape,
},
async ({ owner, type = 'all' }) => {
const { data } = await octokit.repos.listForUser({
username: owner,
type,
});
return {
content: [
{
type: 'text',
text: JSON.stringify(
data.map(repo => ({
name: repo.name,
description: repo.description,
stars: repo.stargazers_count,
language: repo.language,
})),
null,
2
),
},
],
};
},
);
server.registerTool(
'create_issue',
{
description: 'Create a new issue in a repository',
inputSchema: z.object({
owner: z.string().describe('Repository owner'),
repo: z.string().describe('Repository name'),
title: z.string().describe('Issue title'),
body: z.string().optional().describe('Issue description'),
labels: z.array(z.string()).optional().describe('Labels to add'),
}).shape,
},
async ({ owner, repo, title, body, labels }) => {
const { data } = await octokit.issues.create({
owner,
repo,
title,
body,
labels,
});
return {
content: [
{
type: 'text',
text: `Issue created: ${data.html_url}`,
},
],
};
},
);
server.registerTool(
'get_pr_status',
{
description: 'Get status of a pull request',
inputSchema: z.object({
owner: z.string(),
repo: z.string(),
pull_number: z.number(),
}).shape,
},
async ({ owner, repo, pull_number }) => {
const { data } = await octokit.pulls.get({
owner,
repo,
pull_number,
});
return {
content: [
{
type: 'text',
text: JSON.stringify({
title: data.title,
state: data.state,
mergeable: data.mergeable,
merged: data.merged,
comments: data.comments,
commits: data.commits,
}, null, 2),
},
],
};
},
);
const transport = new StdioServerTransport();
await server.connect(transport);