🚀 GitHub to MCP
將任何 GitHub 倉庫在數秒內轉換為 MCP 服務器,讓 Claude、ChatGPT、Cursor、Windsurf、Cline 等所有 AI 助手能夠即時訪問任意代碼庫。
🚀 快速開始
🌐 Web UI(最簡單的方式)
訪問 github-to-mcp.vercel.app,粘貼任意 GitHub URL,點擊“生成”,然後下載你的 MCP 服務器。
💻 CLI(一鍵操作)
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 服務定義
- 支持 AsyncAPI 規範,用於事件驅動的 API
- 進行源代碼分析以提取函數
🌍 多語言支持
輸入倉庫支持的語言:
- 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)。
- 可選擇配置提取選項。
- 點擊“生成”以分析倉庫。
- 查看生成的工具和代碼。
- 下載 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) → "分析給定文本的情感。"
從 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 請求限制為每小時 60 次。使用令牌時,限制提高到每小時 5000 次。對於私有倉庫,需要具有適當訪問權限的令牌。
在 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 與 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 應用包含一個交互式遊樂場,用於測試生成的工具:
- 從倉庫生成工具後,點擊“在遊樂場中打開”。
- 從列表中選擇一個工具。
- 填寫所需參數。
- 點擊“執行”以運行工具。
- 查看 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 網頁應用
│ │ ├── 📂 app/ # Next.js 應用路由頁面
│ │ │ ├── 📂 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
🏗️ 架構概述
系統遵循管道架構:
輸入 (GitHub URL)
│
▼
┌──────────────────┐
│ GitHub 客戶端 │ 獲取倉庫元數據、文件和 README
└──────────────────┘
│
▼
┌──────────────────┐
│ 分類器 │ 確定倉庫類型和結構
└──────────────────┘
│
▼
┌──────────────────┐
│ 提取器 │ 多個提取器並行運行:
│ ├─ OpenAPI │ • 解析 API 規範
│ ├─ GraphQL │ • 解析 GraphQL 模式
│ ├─ README │ • 從文檔中提取示例
│ ├─ 代碼 │ • 分析源代碼
│ └─ MCP │ • 檢測現有的 MCP 工具
└──────────────────┘
│
▼
┌──────────────────┐
│ 去重器 │ 移除重複工具,合併相似工具
└──────────────────┘
│
▼
┌──────────────────┐
│ 驗證器 │ 驗證工具模式,添加置信度分數
└──────────────────┘
│
▼
┌──────────────────┐
│ 生成器 │ 以目標語言生成輸出代碼
└──────────────────┘
│
▼
輸出 (MCP 服務器代碼 + 配置)
每個提取器生成具有標準化模式的 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:
"""工具描述。"""
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 速率限制
- 未認證請求:每小時 60 次
- 認證請求:每小時 5000 次
- 大型倉庫可能需要多次 API 調用
提供 GITHUB_TOKEN 以提高速率限制。
📦 倉庫大小
- 非常大的倉庫(>1GB)在分析過程中可能會超時
- 包含數千個文件的倉庫可能會達到 API 限制
- 對於單體倉庫,考慮分析特定子目錄
🎯 工具提取準確性
- OpenAPI 規範生成的工具最準確
- README 提取依賴於一致的文檔格式
- 源代碼分析可能會錯過動態定義的路由
- 置信度分數表示提取的可靠性
🌍 語言支持
- TypeScript 輸出最成熟
- Python 輸出功能正常,但可能需要少量編輯
- Go 輸出處於實驗階段
🔧 故障排除
❌ "速率限制已超出" 錯誤
提供 GitHub 令牌:
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
❌ "倉庫未找到" 錯誤
- 驗證 URL 是否正確
- 對於私有倉庫,確保你的令牌具有
repo 權限範圍
- 檢查倉庫是否存在且可訪問
❌ "未提取到工具" 結果
- 驗證倉庫是否包含 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。
🔗 鏈接
由 nich 構建