🚀 GitHub to MCP
このツールは、任意のGitHubリポジトリを数秒でMCPサーバーに変換します。Claude、ChatGPT、Cursor、Windsurf、ClineなどのAIアシスタントに、即座に任意のコードベースにアクセスさせることができます。
🚀 クイックスタート
🌐 Web UI (最も簡単)
github-to-mcp.vercel.app にアクセスし、任意のGitHub URLを貼り付けて「Generate」をクリックし、MCPサーバーをダウンロードします。
💻 CLI (1コマンド)
npx @nirholas/github-to-mcp https://github.com/stripe/stripe-node
📦 プログラム的 (自動化用)
import { generateFromGithub } from '@nirholas/github-to-mcp';
const result = await generateFromGithub('https://github.com/stripe/stripe-node');
console.log(`Generated ${result.tools.length} tools`);
await result.save('./my-mcp-server');
✨ 主な機能
🔬 リポジトリ分析
- リポジトリの自動分類 (API、ライブラリ、CLIツール、MCPサーバー、ドキュメント)
- OpenAPI/Swagger仕様の検出と解析
- GraphQLスキーマの抽出とクエリ/ミューテーションツールの生成
- gRPC/Protobufサービス定義の解析
- イベント駆動型APIのAsyncAPI仕様のサポート
- 関数抽出のためのソースコード分析
🌍 多言語サポート
入力リポジトリ:
- TypeScriptとJavaScript
- Python
- Go
- JavaとKotlin
- Rust
- Ruby
- C#とF#
出力MCPサーバー:
- TypeScript (公式MCP SDKを使用)
- Python (MCP Python SDKを使用)
- Go (コミュニティMCPライブラリを使用)
🔧 ツール抽出
- OpenAPIエンドポイントを型付きパラメーターで呼び出し可能なツールに変換
- GraphQLクエリとミューテーションを入力検証付きのツールに変換
@mcp.tool で装飾されたPython関数を保持
- READMEに記載されたCLIコマンドを実行可能なツールに変換
- 人気のあるフレームワークのHTTPルートハンドラーを検出
⚡ コード生成
- すべての依存関係を含む完全な実行可能なMCPサーバーコード
- Claude Desktop、Cursor、その他のクライアント用の設定ファイル
- Dockerデプロイメントテンプレート
- すべての生成されたツールのTypeScript型定義
📦 インストール
ソースからのインストール
リポジトリをクローンし、依存関係をインストールします。
git clone https://github.com/nirholas/github-to-mcp.git
cd github-to-mcp
pnpm install
pnpm build
Webインターフェイスを使用する場合
Webアプリケーションは github-to-mcp.vercel.app にデプロイされています。ローカルにインストールすることなく、ブラウザベースのインターフェイスを使用できます。
💻 使用例
🌐 Webインターフェイス
Webインターフェイスは、リポジトリを変換する最も簡単な方法です。
- Webアプリケーションにアクセスする
- GitHubリポジトリのURLを入力する (例:
https://github.com/owner/repo)
- 必要に応じて抽出オプションを設定する
- 「Generate」をクリックしてリポジトリを分析する
- 生成されたツールとコードを確認する
- MCPサーバーパッケージをダウンロードするか、設定をコピーする
Webインターフェイスには、ダウンロード前に生成されたツールをテストできるインタラクティブなプレイグラウンドもあります。
💻 コマンドラインインターフェイス
プロジェクトをローカルでビルドした後、CLIを使用できます。
node packages/core/dist/cli.mjs https://github.com/owner/repo
node packages/core/dist/cli.mjs https://github.com/owner/repo --output ./my-mcp-server
node packages/core/dist/cli.mjs https://github.com/owner/repo --language python
node packages/core/dist/cli.mjs https://github.com/owner/repo --sources openapi,readme
GITHUB_TOKEN=ghp_xxx node packages/core/dist/cli.mjs https://github.com/owner/repo
📦 プログラム的API
独自のTypeScriptまたはJavaScriptコードでジェネレーターをインポートします。
import { GithubToMcpGenerator } from '@nirholas/github-to-mcp';
const generator = new GithubToMcpGenerator({
githubToken: process.env.GITHUB_TOKEN,
sources: ['openapi', 'readme', 'code', 'graphql', 'grpc', 'mcp'],
outputLanguage: 'typescript'
});
const result = await generator.generate('https://github.com/owner/repo');
console.log(`Repository: ${result.name}`);
console.log(`Classification: ${result.classification.type}`);
console.log(`Generated ${result.tools.length} tools`);
console.log(result.code);
await result.save('./output-directory');
📋 ジェネレーターオプションインターフェイス
interface GithubToMcpOptions {
githubToken?: string;
sources?: Array<'openapi' | 'readme' | 'code' | 'graphql' | 'grpc' | 'mcp'>;
outputLanguage?: 'typescript' | 'python' | 'go';
includeUniversalTools?: boolean;
maxTools?: number;
branch?: string;
}
🔧 技術詳細
🏷️ リポジトリ分類
ジェネレーターは最初にリポジトリを分析し、そのタイプと構造を決定します。
- GitHub APIからリポジトリのメタデータを取得する
- READMEファイルをダウンロードして解析する
- package.json、setup.py、go.modなどのマニフェストファイルを調査する
- API仕様ファイル (openapi.json、schema.graphqlなど) をスキャンする
- リポジトリを以下のいずれかに分類する:
| 分類 |
説明 |
mcp-server |
既存のMCPサーバー実装 |
api-sdk |
APIのクライアントライブラリ |
cli-tool |
コマンドラインアプリケーション |
library |
汎用コードライブラリ |
documentation |
主にドキュメントコンテンツ |
data |
データファイルまたはデータセット |
unknown |
未分類のリポジトリ |
分類によって、どの抽出戦略を優先するか、およびツールの名前付け方法が影響を受けます。
🔍 ツール抽出
ツールは、リポジトリ内の複数のソースから抽出されます。
📄 OpenAPI/Swagger抽出
OpenAPI仕様が見つかった場合:
- 仕様を解析する (JSONまたはYAML、v2またはv3)
- 各エンドポイントを潜在的なツールとして抽出する
- パスパラメーター、クエリパラメーター、およびリクエストボディをツール入力スキーマに変換する
- 操作の要約と説明から説明を生成する
- HTTPメソッドを適切なツールセマンティクスにマッピングする
🔷 GraphQL抽出
GraphQLスキーマが見つかった場合:
.graphql または .gql スキーマファイルを解析する
- Queryタイプのフィールドを読み取り専用ツールとして抽出する
- Mutationタイプのフィールドを書き込みツールとして抽出する
- GraphQL入力タイプをJSONスキーマに変換してツールの入力とする
- ネストされたタイプとカスタムスカラーを処理する
📖 README抽出
READMEは以下の項目について分析されます:
- CLIの使用パターンを示すコードブロック
- curlまたはfetchを使用したAPIエンドポイントの例
- パラメーター付きの関数呼び出しの例
- インストールと使用方法の説明
抽出された例は、推測されたパラメータースキーマを持つツールになります。
💻 ソースコード抽出
サポートされている言語の場合、ソースコードが分析されます:
- Python:
@mcp.tool、@server.tool などで装飾された関数
- TypeScript: JSDocアノテーション付きのエクスポート関数
- Go: Gin、Echo、Chi、Fiber、Gorilla MuxからのHTTPハンドラー
- Java/Kotlin:
@GetMapping、@PostMapping などでアノテーション付きのメソッド
- Rust: Actix-web、Axum、Rocketからのルートハンドラー
🔌 MCPサーバーイントロスペクション
リポジトリが既にMCPサーバーである場合:
server.tool() 定義を検出する
- ツール名、説明、およびスキーマを抽出する
- 可能な限り既存のツール実装を保持する
🏗️ コード生成
ツールが抽出された後、ジェネレーターは以下を生成します:
- MCPプロトコルを実装するメインサーバーファイル
- 抽出された各ツールのツールハンドラー関数
- すべての入力と出力スキーマの型定義
- 必要な依存関係を含むpackage.jsonまたは同等のファイル
- 人気のあるMCPクライアント用の設定ファイル
- オプションのDockerデプロイメントファイル
生成されたコードは、修正することなく完全に実行可能です。
🛠️ 生成されたツール
🌐 汎用ツール
すべての生成されたMCPサーバーには、リポジトリを探索するための以下の基本ツールが含まれています:
| ツール |
説明 |
パラメーター |
get_readme |
リポジトリのREADMEコンテンツを取得する |
なし |
list_files |
指定されたパスのファイルとディレクトリをリストする |
path (オプション、デフォルトはルート) |
read_file |
特定のファイルの内容を読み取る |
path (必須) |
search_code |
リポジトリ全体でパターンを検索する |
query (必須)、path (オプション) |
これらのツールにより、APIや関数が検出されない場合でも、AIアシスタントはリポジトリを探索し、理解することができます。
🔧 抽出されたツール
リポジトリの内容に基づいて追加のツールが生成されます。
OpenAPI仕様から
各APIエンドポイントがツールになります。
POST /users → create_user(name: string, email: string)
GET /users/{id} → get_user(id: string)
PUT /users/{id} → update_user(id: string, name?: string, email?: string)
DELETE /users/{id} → delete_user(id: string)
GET /users → list_users(page?: number, limit?: number)
GraphQLスキーマから
クエリとミューテーションがツールになります。
type Query {
user(id: ID!): User → get_user(id: string)
users(first: Int): [User] → list_users(first?: number)
}
type Mutation {
createUser(input: CreateUserInput!): User → create_user(input: object)
}
Pythonコードから
@server.tool()
async def analyze_sentiment(text: str) -> str:
"""Analyze the sentiment of the given text."""
これは analyze_sentiment(text: string) → "Analyze the sentiment of the given text." となります。
READMEの例から
READMEに記載されたCLIコマンド:
mycli create --name myproject --template typescript
これは mycli_create(name: string, template?: string) となります。
⚙️ 設定
🔐 環境変数
| 変数 |
説明 |
必須 |
GITHUB_TOKEN |
APIアクセス用のGitHubパーソナルアクセストークン |
いいえ (推奨) |
GITHUB_API_URL |
エンタープライズ用のカスタムGitHub API URL |
いいえ |
GitHubトークン
トークンがない場合、GitHub APIリクエストは1時間に60回に制限されます。トークンを使用すると、制限は1時間に5,000回に増えます。プライベートリポジトリの場合、適切なアクセス権限を持つトークンが必要です。
トークンは https://github.com/settings/tokens で作成できます。
必要なスコープ:
repo (プライベートリポジトリ用)
public_repo (パブリックリポジトリのみ)
🎛️ ジェネレーターオプション
プログラム的APIを使用する場合、以下のように設定できます。
const generator = new GithubToMcpGenerator({
githubToken: process.env.GITHUB_TOKEN,
sources: ['openapi', 'readme', 'code', 'graphql', 'grpc', 'mcp'],
outputLanguage: 'typescript',
includeUniversalTools: true,
maxTools: 100,
branch: 'main',
});
🤖 AIアシスタントとの統合
Claude Desktop
生成されたサーバーをClaude Desktopの設定に追加します。
| プラットフォーム |
設定ファイルのパス |
| macOS |
~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows |
%APPDATA%\Claude\claude_desktop_config.json |
{
"mcpServers": {
"my-repo": {
"command": "node",
"args": ["/absolute/path/to/generated/server.mjs"],
"env": {
"GITHUB_TOKEN": "ghp_xxxx"
}
}
}
}
⚠️ 重要提示
設定を変更した後は、Claude Desktopを再起動してください。
Cursor
Cursorは設定を通じてMCPサーバーをサポートしています。CursorのMCP設定パネルにサーバーパスを追加するか、設定ファイルを直接編集します。
{
"mcp": {
"servers": {
"my-repo": {
"command": "node",
"args": ["/path/to/server.mjs"]
}
}
}
}
💻 VS Code with Continue
VS CodeのContinue拡張機能を使用する場合:
{
"models": [...],
"mcpServers": {
"my-repo": {
"command": "node",
"args": ["/path/to/server.mjs"]
}
}
}
🔌 その他のMCPクライアント
MCP互換のクライアントはすべて、生成されたサーバーを使用できます。サーバーはデフォルトでstdioを介して通信し、stdinでJSON-RPCメッセージを受け取り、stdoutで応答します。
手動で実行するには:
node server.mjs
サーバーはstdinでMCPプロトコルメッセージを待ちます。
🎮 インタラクティブプレイグラウンド
Webアプリケーションには、生成されたツールをテストするためのインタラクティブなプレイグラウンドが含まれています。
- リポジトリからツールを生成した後、「Open in Playground」をクリックする
- ツールのリストからツールを選択する
- 必要なパラメーターを入力する
- 「Execute」をクリックしてツールを実行する
- JSON応答を表示する
プレイグラウンドは、ツールをサンドボックス環境で実行し、結果をリアルタイムで表示します。
🔗 プレイグラウンドセッションの共有
生成されたツールを他の人と共有することができます。
| パラメーター |
説明 |
?code=<base64> |
Base64エンコードされたTypeScriptサーバーコード |
?gist=<id> |
サーバーコードを含むGitHub GistのID |
?name=<name> |
サーバーの表示名 |
例:
https://github-to-mcp.vercel.app/playground?gist=abc123&name=My%20API
📁 プロジェクト構造
github-to-mcp/
├── 📂 apps/
│ ├── 📂 web/ # Next.js webアプリケーション
│ │ ├── 📂 app/ # Next.js App Routerページ
│ │ │ ├── 📂 api/ # 変換用のAPIルート
│ │ │ ├── 📂 convert/ # 変換ページ
│ │ │ ├── 📂 playground/ # インタラクティブなプレイグラウンド
│ │ │ └── 📂 dashboard/ # ユーザーダッシュボード
│ │ ├── 📂 components/ # Reactコンポーネント
│ │ ├── 📂 hooks/ # カスタムReactフック
│ │ ├── 📂 lib/ # ユーティリティ関数
│ │ └── 📂 types/ # TypeScript型定義
│ └── 📂 vscode/ # VS Code拡張機能 (開発中)
│
├── 📂 packages/
│ ├── 📂 core/ # 主な変換エンジン
│ │ └── 📂 src/
│ │ ├── index.ts # GithubToMcpGeneratorクラス
│ │ ├── github-client.ts # GitHub APIクライアント
│ │ ├── readme-extractor.ts # README解析
│ │ ├── code-extractor.ts # ソースコード分析
│ │ ├── graphql-extractor.ts # GraphQLスキーマ解析
│ │ ├── mcp-introspector.ts # 既存のMCPサーバー検出
│ │ ├── python-generator.ts # Python出力生成
│ │ ├── go-generator.ts # Go出力生成
│ │ └── types.ts # 型定義
│ │
│ ├── 📂 openapi-parser/ # OpenAPI仕様パーサー
│ │ └── 📂 src/
│ │ ├── parser.ts # OpenAPI解析ロジック
│ │ ├── analyzer.ts # エンドポイント分析
│ │ ├── transformer.ts # スキーマ変換
│ │ └── generator.ts # ツール生成
│ │
│ ├── 📂 mcp-server/ # MCPサーバーユーティリティ
│ │ └── 📂 src/
│ │ ├── server.ts # 基本的なMCPサーバー実装
│ │ └── tools.ts # ツール登録ヘルパー
│ │
│ └── 📂 registry/ # ツールレジストリ管理
│ └── 📂 src/
│ └── index.ts # レジストリ操作
│
├── 📂 mkdocs/ # ドキュメントサイト (MkDocs)
│ ├── 📂 docs/ # Markdownドキュメント
│ └── mkdocs.yml # MkDocs設定
│
├── 📂 tests/ # 統合テスト
│ ├── 📂 fixtures/ # テスト用のリポジトリ
│ │ ├── 📂 express-app/ # Express.jsテストアプリ
│ │ ├── 📂 fastapi-app/ # FastAPIテストアプリ
│ │ ├── 📂 graphql/ # GraphQLテストスキーマ
│ │ └── 📂 openapi/ # OpenAPIテスト仕様
│ └── 📂 integration/ # 統合テストファイル
│
├── 📂 templates/ # コード生成テンプレート
│ ├── Dockerfile.python.template
│ └── Dockerfile.typescript.template
│
├── package.json # ルートパッケージ設定
├── pnpm-workspace.yaml # pnpmワークスペース設定
├── tsconfig.json # TypeScript設定
└── vitest.config.ts # テスト設定
🔨 開発
前提条件
| 要件 |
バージョン |
| Node.js |
22.x以降 |
| pnpm |
10.x以降 |
| Git |
2.x以降 |
ローカルセットアップ
git clone https://github.com/nirholas/github-to-mcp.git
cd github-to-mcp
pnpm install
pnpm build
pnpm dev
Webアプリケーションは http://localhost:3000 で利用できます。
ビルド
pnpm build
pnpm --filter @nirholas/github-to-mcp build
pnpm --filter @github-to-mcp/openapi-parser build
pnpm --filter web build
テスト
pnpm test
pnpm test:watch
pnpm test:coverage
pnpm test -- tests/integration/openapi-conversion.test.ts
コード品質
pnpm lint
pnpm typecheck
🏗️ アーキテクチャの概要
このシステムはパイプラインアーキテクチャに従っています。
Input (GitHub URL)
│
▼
┌──────────────────┐
│ GitHub Client │ リポジトリのメタデータ、ファイル、およびREADMEを取得する
└──────────────────┘
│
▼
┌──────────────────┐
│ Classifier │ リポジトリのタイプと構造を決定する
└──────────────────┘
│
▼
┌──────────────────┐
│ Extractors │ 複数の抽出器が並列に実行される:
│ ├─ OpenAPI │ • API仕様を解析する
│ ├─ GraphQL │ • GraphQLスキーマを解析する
│ ├─ README │ • ドキュメントから例を抽出する
│ ├─ Code │ • ソースコードを分析する
│ └─ MCP │ • 既存のMCPツールを検出する
└──────────────────┘
│
▼
┌──────────────────┐
│ Deduplicator │ 重複するツールを削除し、類似するツールを統合する
└──────────────────┘
│
▼
┌──────────────────┐
│ Validator │ ツールスキーマを検証し、信頼度スコアを追加する
└──────────────────┘
│
▼
┌──────────────────┐
│ Generator │ ターゲット言語で出力コードを生成する
└──────────────────┘
│
▼
Output (MCP Server Code + Configuration)
各抽出器は、標準化されたスキーマを持つ ExtractedTool オブジェクトのリストを生成します。重複排除器とバリデーターは、生成器が最終出力を生成する前に一貫性を確保します。
📥 サポートされている入力形式
API仕様
| 形式 |
ファイルパターン |
バージョンサポート |
| OpenAPI |
openapi.json, openapi.yaml, swagger.json, swagger.yaml, api.json, api.yaml |
2.0, 3.0.x, 3.1.x |
| GraphQL |
schema.graphql, *.gql, schema.json |
2018年6月の仕様 |
| gRPC |
*.proto |
proto3 |
| AsyncAPI |
asyncapi.json, asyncapi.yaml |
2.x |
ソースコード言語
| 言語 |
フレームワーク検出 |
| TypeScript/JavaScript |
Express, Fastify, Hono, Next.js APIルート |
| Python |
FastAPI, Flask, Django REST, MCP SDKデコレーター |
| Go |
Gin, Echo, Chi, Fiber, Gorilla Mux |
| Java |
Spring Boot, JAX-RS, Micronaut |
| Kotlin |
Ktor, Spring Boot |
| Rust |
Actix-web, Axum, Rocket |
| Ruby |
Rails, Sinatra, Grape |
📤 出力形式
TypeScriptサーバー
デフォルトの出力は、公式の @modelcontextprotocol/sdk パッケージを使用するTypeScript MCPサーバーです。
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server({
name: 'generated-server',
version: '1.0.0',
}, {
capabilities: {
tools: {},
},
});
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [],
}));
server.setRequestHandler(CallToolRequestSchema, async (request) => {
});
const transport = new StdioServerTransport();
await server.connect(transport);
Pythonサーバー
Python出力は、MCP Python SDKを使用します。
from mcp.server import Server
from mcp.server.stdio import stdio_server
server = Server("generated-server")
@server.tool()
async def example_tool(param: str) -> str:
"""Tool description."""
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
設定ファイル
各生成されたサーバーには以下が含まれます。
| ファイル |
説明 |
claude_desktop_config.json |
Claude Desktop設定スニペット |
cursor_config.json |
Cursorエディター設定 |
package.json または requirements.txt |
依存関係 |
Dockerfile (オプション) |
コンテナデプロイメント |
⚠️ 制限事項
🔄 GitHub APIのレート制限
- 認証なしのリクエスト: 1時間に60回
- 認証ありのリクエスト: 1時間に5,000回
- 大規模なリポジトリでは、複数のAPI呼び出しが必要になることがあります。
GITHUB_TOKEN を提供することで、レート制限を増やすことができます。
📦 リポジトリのサイズ
- 非常に大きなリポジトリ (>1GB) の分析中にタイムアウトすることがあります。
- 数千のファイルを持つリポジトリは、API制限に達することがあります。
- モノレポの場合は、特定のサブディレクトリを分析することを検討してください。
🎯 ツール抽出の精度
- OpenAPI仕様は最も正確なツールを生成します。
- READMEの抽出は、一貫したドキュメント形式に依存します。
- ソースコード分析では、動的に定義されたルートが見逃されることがあります。
- 信頼度スコアは、抽出の信頼性を示します。
🌍 言語サポート
- TypeScript出力が最も成熟しています。
- Python出力は機能的ですが、若干の編集が必要になることがあります。
- Go出力は実験的です。
🔧 トラブルシューティング
❌ "Rate limit exceeded" エラー
GitHubトークンを提供します。
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
❌ "Repository not found" エラー
- URLが正しいことを確認してください。
- プライベートリポジトリの場合、トークンに
repo スコープがあることを確認してください。
- リポジトリが存在し、アクセス可能であることを確認してください。
❌ "No tools extracted" 結果
- リポジトリにAPI定義またはドキュメント化されたエンドポイントが含まれていることを確認してください。
- すべての抽出ソースを有効にすることを試してください:
--sources openapi,readme,code,graphql,mcp
- 仕様ファイルが標準的な命名規則に従っていることを確認してください。
❌ 生成されたサーバーが起動できない
- Node.js 22+ がインストールされていることを確認してください。
- 生成されたディレクトリで
npm install を実行してください。
npx tsc --noEmit でTypeScriptのコンパイルエラーを確認してください。
❌ Claude Desktopがサーバーを表示しない
claude_desktop_config.json のパスが絶対パスであることを確認してください。
- 設定を変更した後、Claude Desktopを再起動してください。
- Claude Desktopのログで接続エラーを確認してください。
🤝 コントリビューション
コントリビューションは大歓迎です!詳細なガイドラインについては CONTRIBUTING.md を参照してください。
🐛 問題の報告
問題を報告する際には、以下を含めてください。
- 問題の原因となったリポジトリのURL (公開リポジトリの場合)
- エラーメッセージまたは予期しない動作
- Node.jsとpnpmのバージョン
- オペレーティングシステム
📄 ライセンス
Apache 2.0ライセンス。詳細は LICENSE を参照してください。
🔗 リンク
Built by nich