GitHub MCP Server
by Jehan26
Verified
from dotenv import load_dotenv
load_dotenv()
from flask import Flask, request, jsonify
import requests
import os
import json
app = Flask(__name__)
# Your GitHub API token
GITHUB_TOKEN = os.environ.get("GITHUB_TOKEN")
@app.route("/")
def home():
"""Root endpoint to indicate server status"""
return "GitHub Assistant API is running! Try /mcp/discover"
@app.route("/mcp/discover", methods=["GET"])
def discover():
"""Endpoint for service discovery"""
return jsonify({
"name": "GitHub Assistant",
"description": "Interact with GitHub repositories, issues, and PRs",
"endpoints": [
{
"name": "search_repositories",
"description": "Search for GitHub repositories",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query string"
}
},
"required": ["query"]
}
},
{
"name": "get_repo_issues",
"description": "Get issues for a specific repository",
"parameters": {
"type": "object",
"properties": {
"owner": {
"type": "string",
"description": "Repository owner"
},
"repo": {
"type": "string",
"description": "Repository name"
}
},
"required": ["owner", "repo"]
}
}
]
})
@app.route("/mcp/execute", methods=["POST"])
def execute():
"""Endpoint for executing operations"""
data = request.json
endpoint = data.get("endpoint")
parameters = data.get("parameters", {})
if endpoint == "search_repositories":
return search_repositories(parameters)
elif endpoint == "get_repo_issues":
return get_repo_issues(parameters)
else:
return jsonify({"error": "Unknown endpoint"})
def search_repositories(parameters):
"""Search GitHub repositories"""
query = parameters.get("query")
headers = {"Authorization": f"token {GITHUB_TOKEN}"}
response = requests.get(
f"https://api.github.com/search/repositories?q={query}",
headers=headers
)
repos = response.json().get("items", [])
simplified_repos = [
{
"name": repo["full_name"],
"description": repo["description"],
"stars": repo["stargazers_count"],
"url": repo["html_url"]
}
for repo in repos[:5] # Limit to 5 results
]
return jsonify({"repositories": simplified_repos})
def get_repo_issues(parameters):
"""Get issues for a repository"""
owner = parameters.get("owner")
repo = parameters.get("repo")
headers = {"Authorization": f"token {GITHUB_TOKEN}"}
response = requests.get(
f"https://api.github.com/repos/{owner}/{repo}/issues",
headers=headers
)
issues = response.json()
simplified_issues = [
{
"title": issue["title"],
"number": issue["number"],
"state": issue["state"],
"url": issue["html_url"]
}
for issue in issues[:5] # Limit to 5 results
]
return jsonify({"issues": simplified_issues})
# Print a message when the server starts
print("Server is starting on http://127.0.0.1:8080")
print("Press Ctrl+C to stop the server")
if __name__ == "__main__":
app.run(debug=True, host="127.0.0.1", port=8080)