CursorとGitHubでMCPサーバーの使い方やできることをざっくり把握する
こんにちは。スマートラウンドEMのinouehiです。
はじめに
先日は弊社の渡邊が『簡易な自作MCPサーバーをお試しで実装する方法』と題しましてサーバーの作り方を紹介しました。
一方私自身はMCPのことをまだあまりわかっていなかったので手を動かしてざっくりと理解することから始めることにしました。そこで、本日はMCPサーバーの使い方について簡単にまとめてみようと思います。CursorとGitHub MCP Serverを利用します。実行環境はMacです。
ゴールは以下の2点をざっくり理解することです。
- MCP Serverを使ってどんなことができるのか。
- MCP Serverをどのように使うのか。
MCP Serverにできること
私の体験と順番が前後しますが記事が読みやすくなると考えられるため先に説明します。(表現が厳密ではないかもしれません)
- まず前提としてLLM(今回はCursorから接続しているLLM)がMCP Host(今回はCursor)を経由してMCP Server(今回はGitHub MCP Server)を利用します。
- GitHub MCP ServerはGitHub APIを提供します。つまりGitHubにアクセスして操作を行えます。GitHub MCP Serverの
index.ts
あたりをご覧いただくと雰囲気がわかると思います。 - MCP Serverは、謂わば、LLMに対するMCP Serverの説明書のようなもの(toolsに、MCP Serverが提供する機能の一覧とその概要が示されています)と、LLMが実行できる処理を提供するものと私は理解しました。LLMはMCP Serverが提供するtoolsの中から適切なものを判断、選択して実行します。toolsは
index.ts
をご覧いただくと雰囲気がわかると思います。 - 例えば、Cursorのプロンプトから「PRの一覧を取得してください」と指示すると、数あるGitHub APIの中から適切なものを選択、実行して結果を表示してくれます。
ケーススタディの説明
私がコードレビューで受けた指摘を分類して傾向を把握し内省に活用するツールを作ってみました。MCPで実装するのが最適とも限りませんが、MCPを理解するためにとりあえずやってみました。
実装方法
-
Model Context Protocol serversをcloneします。
https://github.com/modelcontextprotocol/serversgit clone git@github.com:modelcontextprotocol/servers.git cd servers
# GitHub MCP Serverに関する部分を抜粋します servers % tree -L 3 . ├── package-lock.json ├── package.json ├── src │ └── github │ ├── Dockerfile │ ├── README.md │ ├── common │ ├── index.ts │ ├── operations │ ├── package.json │ └── tsconfig.json └── tsconfig.json
-
意図せず更新すると恐ろしいので更新系のAPIはコメントアウトしました(後にわかったのですが安全機構がありはしました)。
ちなみに結構な数がありましたが全部Cursorにやってもらえたので楽々でした。index.tsserver.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ // { // name: "create_or_update_file", // description: "Create or update a single file in a GitHub repository", // inputSchema: zodToJsonSchema(files.CreateOrUpdateFileSchema), // },
index.ts// case "create_or_update_file": { // const args = files.CreateOrUpdateFileSchema.parse(request.params.arguments); // const result = await files.createOrUpdateFile( // args.owner, // args.repo, // args.path, // args.content, // args.message, // args.branch, // args.sha // ); // return { // content: [{ type: "text", text: JSON.stringify(result, null, 2) }], // }; // }
-
GitHub ServerのDockerイメージをビルドします。
docker build -t mcp/github -f src/github/Dockerfile .
-
CursorにMCP Serverを登録します。
Cursor Settings > MCPタブ > + Add new global MCP server でエラーメッセージなくサーバーが登録されれば成功です。~/.cursor/mcp.json{ "mcpServers": { "github": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "mcp/github" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "xxxx" } } } }
-
Cursorのプロンプトから指示します。
例えば以下のような感じです。ownerはxxxx, repoはxxxxのリポジトリからauthorがinouehiのPRを10件取得してreviewerからの指摘を取得して下さい。指摘を分類し、分類ごとに件数をカウントして下さい。分類は機能要件を満たさない欠陥、セキュリティの問題、性能の問題、保守性の問題、コメントの消し忘れや指摘の対応漏れのような初歩的なミスとします。結果は、連番、指摘の分類、件数をカラムとする表をmarkdown形式で出力して下さい。
気づき
- レスポンスのサイズが大きいとエラーになるようでした。例えば、
list_pull_requests
を使うとauthorが指定できずエラーになりました。search_issues
を使うように指示することでエラーを回避できました。(search_issues
はauthorを指定してサイズを絞ることができます。) - MCP Serverが提供するtoolsの実行可否をプロンプトで指示する必要がありました。これは、例えば意図せず破壊的な操作をしないための安全装置のようなものと考えられます。コメントを取得するのに使う
git_pull_request_comments
はPRの数だけ実行するので大量にあるとポチポチするのが煩わしいです。 - 指摘の分類が不適切と感じる部分が一部ありました。(この点はMCPではなくLLMの判断のマター。ツールの実用性について留意が必要と感じました。)
以上、お読みいただきありがとうございました!
Discussion