Skip to main content
Glama
sweta2503

GitHub Analytics MCP Server

by sweta2503

GitHub Analytics MCP サーバー

GitHub アナリティクスのための本番グレードの Model Context Protocol (MCP) 2.x サーバー

このプロジェクトは基本的な MCP チュートリアルを超えて、実運用で実際に必要となるエンジニアリングパターンを用いた MCP サーバーの構築方法を示します。

  • 非同期 HTTP

  • コネクションプーリング

  • 明示的なタイムアウト

  • TTL キャッシュ

  • GitHub レート制限への対応

  • 指数バックオフ付きリトライ

  • 構造化ロギング

  • 入力検証

  • 並列 API リクエスト

  • クリーンな MCP ライフサイクル管理

  • 実際のエンドツーエンド MCP プロトコルテスト

Agentic Data LabProduction AI Engineering シリーズの一部として構築されました。

🎥 YouTube: Agentic Data Lab


この MCP サーバーは何をするのか?

このサーバーは、GitHub リポジトリのアナリティクスを MCP ツールとして公開します。

MCP 互換の AI クライアントは、これを使って次のことができます:

  • リポジトリのメタデータを確認する

  • 最近のコミットを取得する

  • コントリビューターを分析する

  • オープン中の issue を確認する

  • コミットアクティビティを分析する

  • 2 つのリポジトリを比較する

  • GitHub API のレート制限を確認する

例:

User:
Compare pallets/flask and django/django.

Which repository looks more active?

AI クライアントは次を呼び出すことができます:

compare_repos

そして、この MCP サーバーを介してライブな GitHub データを取得できます。


アーキテクチャ

                ┌─────────────────────┐
                │   MCP Client / AI   │
                │ Claude / MCP Client │
                └──────────┬──────────┘
                           │
                           │ MCP stdio
                           ▼
                ┌─────────────────────┐
                │ GitHub Analytics    │
                │     MCP Server      │
                └──────────┬──────────┘
                           │
                 ┌─────────┴─────────┐
                 │                   │
                 ▼                   ▼
          Input Validation       TTL Cache
                                     │
                           ┌─────────┴─────────┐
                           │                   │
                      CACHE HIT          CACHE MISS
                           │                   │
                           │                   ▼
                           │          Async HTTP Client
                           │                   │
                           │          Retry + Backoff
                           │                   │
                           │                   ▼
                           │            GitHub REST API
                           │                   │
                           └───────────◄───────┘
                                       │
                                       ▼
                               Structured MCP Result

実装された 7 つの本番パターン

1. 非同期 HTTP + コネクションプーリング

サーバーは以下を使用します:

httpx.AsyncClient

同期 HTTP リクエストの代わりに。

HTTP クライアントは MCP サーバーのライフサイクル中に一度だけ作成され、ツール呼び出し間で再利用されます。

これにより以下の利点があります:

  • ノンブロッキング I/O

  • コネクションの再利用

  • より良い並行性

  • 明示的なタイムアウト制御

サーバーは以下に対して個別のタイムアウトを設定します:

connect
read
write
pool

Related MCP server: ship-it-mcp

2. TTL キャッシュ

AI クライアントは、1 つの会話中に同じ MCP ツールを複数回呼び出すことがあります。

毎回 GitHub にアクセスする代わりに、サーバーはレスポンスをメモリにキャッシュします。

例:

First request

MCP Client
    │
    ▼
MCP Server
    │
    ▼
GitHub API
    │
    ▼
Cache

2 回目のリクエスト:

MCP Client
    │
    ▼
MCP Server
    │
    ▼
CACHE HIT

追加の GitHub リクエストは必要ありません。

ツールごとに、データの変化速度に応じて異なる TTL を使用します。

ツール

キャッシュ TTL

get_repo_overview

5 分

list_recent_commits

2 分

get_contributors

10 分

list_open_issues

2 分

get_commit_activity

30 分

compare_repos

5 分

get_rate_limit_status

30 秒


3. GitHub レート制限への対応

GitHub はレスポンスヘッダーを通じてレート制限情報を公開します。

サーバーは以下を追跡します:

X-RateLimit-Limit
X-RateLimit-Used
X-RateLimit-Remaining
X-RateLimit-Reset
Retry-After

サーバーは GitHub が実際にリクエストをレート制限していることを検出し、生の例外を公開する代わりに有益な MCP ツールエラーを返すことができます。


4. リトライ + 指数バックオフ

一時的なネットワーク障害と上流の 5xx レスポンスは自動的にリトライされます。

リトライのシーケンス:

Attempt 1
   │
   └── failure
        │
        ▼
      wait 1s

Attempt 2
   │
   └── failure
        │
        ▼
      wait 2s

Attempt 3
   │
   └── final result

バックオフの計算式は次のとおりです:

2 ** (attempt - 1)

サーバーは通常の 4xx クライアントエラーを盲目的にリトライしません。


5. 構造化ロギング

MCP stdio はプロトコル通信に stdout を使用します。

そのため、運用ログは Python のロギングを通じて別途書き出されます。

例:

2026-08-27T14:14:03 | INFO | Starting GitHub Analytics MCP server
2026-08-27T14:14:04 | INFO | GET /repos/facebook/react → 200
2026-08-27T14:14:04 | INFO | CACHE HIT /repos/facebook/react

これにより、以下を簡単に確認できます:

  • API リクエスト

  • HTTP ステータス

  • レイテンシ

  • リトライ試行

  • キャッシュヒット

  • 検証エラー

  • レート制限の警告


6. 入力検証

リポジトリのオーナー名とリポジトリ名は、ネットワークリクエストを行う前に検証されます。

有効な名前に含めることができる文字:

letters
numbers
.
-
_

たとえば:

face../../book

は、GitHub API リクエストの一部になる前にローカルで拒否されます。


7. 並列 API リクエスト

compare_repos MCP ツールは、2 つの独立したリポジトリから情報を取得する必要があります。

順番に取得する代わりに:

repo_a = await get_repo_a()
repo_b = await get_repo_b()

サーバーは両方のリクエストを並行して実行します:

repo_a, repo_b = await asyncio.gather(
    get_repo_a(),
    get_repo_b(),
)

概念的に:

Sequential

Repo A ───────────────► Done
                        Repo B ───────────────► Done


Parallel

Repo A ───────────────► Done
Repo B ───────────────────► Done

これにより、リクエストが独立している場合の経過待ち時間が短縮されます。


利用可能な MCP ツール

サーバーは現在 7 つの MCP ツール を公開しています。

get_repo_overview

返す内容:

  • スター数

  • フォーク数

  • オープン中の issue 数

  • ウォッチャー数

  • 使用言語

  • トピック

  • ライセンス

  • 最終プッシュ日

  • ホームページ

  • リポジトリサイズ

例:

get_repo_overview(
    owner="facebook",
    repo="react"
)

list_recent_commits

リポジトリの最近のコミットを返します。

例:

list_recent_commits(
    owner="vuejs",
    repo="core",
    limit=5
)

get_contributors

リポジトリの上位コントリビューターを返します。

例:

get_contributors(
    owner="django",
    repo="django",
    limit=10
)

list_open_issues

プルリクエストを除外した、オープン中の GitHub issue を返します。

例:

list_open_issues(
    owner="pallets",
    repo="flask",
    limit=10
)

get_commit_activity

リポジトリのコミットアクティビティを返します。内容は次のとおりです:

  • 合計コミット数

  • 週あたりの平均コミット数

  • ピークアクティビティ

  • 最近の週次アクティビティ


compare_repos

2 つのリポジトリを並べて比較します。

例:

compare_repos(
    owner1="pallets",
    repo1="flask",
    owner2="django",
    repo2="django"
)

返されるフィールドは次のとおりです:

stars
forks
open issues
language
last push

get_rate_limit_status

GitHub API のレート制限情報と、ローカル MCP サーバーのカウンターを返します。

例:

{
  "limit": 60,
  "used": 4,
  "remaining": 56,
  "resets_in_seconds": 3599,
  "server_outbound_http_requests": 4,
  "server_cache_hits": 1
}

実際の値は、現在の GitHub API の使用状況によって異なります。


プロジェクト構成

mcp-github-analytics/
│
├── server.py
│   └── Main MCP server and GitHub tools
│
├── demo_mcp.py
│   └── Real end-to-end MCP client demo
│
├── requirements.txt
│   └── Python dependencies
│
├── .env.example
│   └── Environment variable template
│
└── .gitignore

セットアップ

1. リポジトリのクローン

git clone https://github.com/sweta2503/mcp-github-analytics.git

プロジェクトに移動します:

cd mcp-github-analytics

2. 仮想環境の作成

python -m venv .venv

macOS / Linux

source .venv/bin/activate

Windows

.venv\Scripts\activate

3. 依存関係のインストール

pip install -r requirements.txt

プロジェクトが使用するもの:

mcp[cli]==2.1.1
httpx==0.28.1
python-dotenv==1.2.3

GitHub トークンの設定

GitHub トークンは、公開リポジトリのみを扱う場合はオプションですが、推奨されます。

環境変数のサンプルファイルをコピーします:

cp .env.example .env

GitHub トークンを追加します:

GITHUB_TOKEN=your_github_token_here

実際の .env ファイルやトークンをコミットしないでください。


実際の MCP デモを実行する

実行:

python demo_mcp.py

これは実際の MCP エンドツーエンドテストです。

demo_mcp.pyserver.py の関数を単にインポートするわけではありません

その代わりに、次のことを行います:

1. Starts server.py as an MCP subprocess
2. Connects using MCP stdio
3. Negotiates the MCP protocol
4. Discovers the MCP tools
5. Calls the tools through MCP
6. Receives structured MCP responses

次のような出力が表示されるはずです:

MCP CONNECTED — discover the real server tools

Negotiated protocol: ...
Tools discovered (7):
get_repo_overview
list_recent_commits
get_contributors
list_open_issues
get_commit_activity
compare_repos
get_rate_limit_status

キャッシュをテストする

デモは次を呼び出します:

get_repo_overview(facebook/react)

を 2 回実行します。

1 回目の呼び出しは GitHub にアクセスします。

2 回目は次のように表示されるはずです:

CACHE HIT

そして、大幅に速く返ってきます。


並列リポジトリ比較をテストする

デモは次も実行します:

compare_repos(
    pallets/flask,
    django/django
)

両方の上流 GitHub リクエストは、次を通じて並行して発行されます:

asyncio.gather(...)

デモ出力とサーバーログをキャプチャする

MCP クライアントの出力とサーバーログをそれぞれ別々にキャプチャできます:

python demo_mcp.py > demo_output.txt 2> server.log

これにより以下が作成されます:

demo_output.txt

MCP クライアントのレスポンス用と:

server.log

サーバー側のログ用です。

サーバーログには、次のような有用な情報が含まれます:

GET /repos/facebook/react → 200
CACHE HIT /repos/facebook/react
GET /repos/pallets/flask → 200
GET /repos/django/django → 200

サーバーを直接実行する

MCP サーバー自体は次のコマンドで起動できます:

python server.py

サーバーは MCP stdio 上で動作します。

通常、MCP 互換クライアントがこのプロセスを自動的に起動します。


サーバーを Claude Desktop に接続する

このリポジトリ内にマシン固有の claude_desktop_config.json を置いておく必要はありません。

代わりに、ローカルの Claude Desktop 設定にサーバーを追加してください。

例:

{
  "mcpServers": {
    "github-analytics": {
      "command": "/ABSOLUTE/PATH/TO/mcp-github-analytics/.venv/bin/python",
      "args": [
        "/ABSOLUTE/PATH/TO/mcp-github-analytics/server.py"
      ],
      "env": {
        "GITHUB_TOKEN": "YOUR_GITHUB_TOKEN"
      }
    }
  }
}

次の部分を置き換えます:

/ABSOLUTE/PATH/TO/mcp-github-analytics

を、お使いのコンピューター上の実際のプロジェクトの場所に置き換えます。

実際の GitHub トークンをコミットしないでください。

Claude Desktop を再起動すると、GitHub アナリティクスツールが Claude で利用できるようになります。

プロンプトの例:

Compare pallets/flask and django/django.

Which repository appears more active?

Use the GitHub MCP tools and explain which data you used.

エンドツーエンドのリクエストフロー

User
 │
 ▼
Claude / MCP Client
 │
 │ MCP tool call
 ▼
GitHub Analytics MCP Server
 │
 ├── Validate input
 │
 ├── Check TTL cache
 │
 ├── Cache hit ──────────────► Return result
 │
 └── Cache miss
          │
          ▼
     Async HTTP
          │
     Retry / Backoff
          │
          ▼
     GitHub REST API
          │
          ▼
       Response
          │
          ▼
       TTL Cache
          │
          ▼
 Structured MCP Response
          │
          ▼
     AI / MCP Client

ローカル MCP と分散本番 MCP

このプロジェクトは、明確なローカル/stdio MCP の例として設計されているため、意図的にインメモリ TTL キャッシュを使用しています。

マルチインスタンスのリモート MCP デプロイメントでは、通常、プロセスローカルな状態を次のようなインフラストラクチャに置き換えます:

Redis
PostgreSQL
distributed rate limiting
centralized observability
authentication
tracing

このリポジトリで実証されているパターンは、その次の段階のための構成要素です。


完全版ビルドを見る

アーキテクチャ、コード、キャッシュ、リトライロジック、検証、並列リクエスト、実際の MCP デモについて、私の YouTube チャンネルで説明しています:

🎥 Agentic Data Lab

https://www.youtube.com/@agenticdatalab

このチャンネルでは次のトピックを扱っています:

  • Production AI Engineering

  • MCP

  • AI Agents

  • LangGraph

  • RAG

  • AI evaluations

  • Agent observability

  • AI system design

  • Data Engineering + AI

  • Production benchmarks and experiments

チュートリアルデモを超えた AI システムの構築に興味があるなら、チャンネル登録を検討してください。

👉 YouTube: Agentic Data Lab


コントリビューション

Issue、改善提案、プルリクエストを歓迎します。

MCP サーバーに別の便利な GitHub アナリティクスツールを追加した場合は、お気軽に PR を開いてください。


プロジェクトをサポートする

このリポジトリが役立った場合は:

  • ⭐ リポジトリにスターを付ける

  • 🍴 フォークして独自の MCP ツールを構築する

  • ▶️ Agentic Data Lab を登録する

さらなる本番 AI エンジニアリングプロジェクトがまもなく公開されます。

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables to interact with GitHub repositories directly from Claude, supporting actions like viewing repos, checking status, committing and pushing changes, and managing pull requests.
  • F
    license
    A
    quality
    D
    maintenance
    Enables Claude to access and manage GitHub repositories dynamically at runtime, including private repos, with tools for browsing files, searching code, and viewing commits, pull requests, and issues.
    11
    1

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/sweta2503/mcp-github-analytics'

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