壁紙アプリのリリースメモを、GitHub の Issue から拾ってエージェントに下書きさせたいと考えました。そう思い立って GitHub MCP の導入手順を開いた夜、書かれているのは IDE の設定ばかりでした。
CLI 側の手順は、公式リポジトリの導入ガイドにはまだありません。実際、GitHub MCP Server のリポジトリには「Antigravity CLI の設置方法を追記してほしい」という要望の Issue が立っています。Gemini CLI から移ってきた方ほど、設定ファイルをどこに置けばいいのか分からず、手が止まりやすいところです。
最初にお伝えしたいのは、つまずきの大半が リモート接続の URL を書くキーの名前 に集中しているということです。Antigravity の MCP 設定では serverUrl が必須で、旧来の url や httpUrl は使えません。ここから先は、その 1 語を直すところから動作を確かめるところまで、順に辿っていきます。
設定ファイルの場所は 2 つあります
公式の MCP ドキュメント によると、CLI の設定は次の 2 か所に分かれています。
- グローバル:
~/.gemini/config/mcp_config.json - ワークスペース: プロジェクト直下の
.agents/mcp_config.json
ひとつ注意があります。先ほどの Issue では、グローバルの置き場所が ~/.gemini/antigravity-cli/mcp_config.json と書かれています。公式ドキュメントの記載と食い違っているのです。どちらが正しいかを私の側で断定することはできません。
ですので、パスを信じ切る前に /mcp を開いてください。CLI のプロンプトで /mcp と入力すると、MCP マネージャが開き、サーバーの接続状態をランプで確認できます。書いたサーバーがここに現れなければ、ファイルの置き場所が違っています。ファイルを開かずに足したい場合は、設定ファイルを開かずに MCP サーバーを足す — agy mcp サブコマンドで構成を持ち運ぶの方法が手堅いでしょう。
リモート接続: serverUrl と headers
GitHub が提供するリモートの MCP エンドポイントに繋ぐ場合の設定です。
{
"mcpServers": {
"github": {
"serverUrl": "https://api.githubcopilot.com/mcp/",
"headers": {
"Authorization": "Bearer YOUR_GITHUB_PAT"
}
}
}
}ここで解決しているのは「トークンを渡しながらリモートの MCP に繋ぐ」ことです。公式ドキュメントのスキーマでは、サーバーごとに command(stdio 用)か serverUrl(リモート用)のどちらかが必要と定められています。リモートなら serverUrl と、必要に応じて headers を書く。これだけです。
なぜ serverUrl なのかといえば、ドキュメントに「url や httpUrl などの旧フィールドは未対応」と明記されているからです。Gemini CLI の設定を写してきた場合、キー名だけがここで通らなくなります。
Docker 接続: ローカルでサーバーを動かす
トークンを外へ送らず、手元で動かしたい場合は stdio 接続になります。Issue で提案されていた書き方は次のとおりです。
{
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "YOUR_GITHUB_PAT"
}
}
}
}私自身は Docker 版をこの記事のために動かしてはおらず、ここは Issue の提案とドキュメントのスキーマ(command・args・env)を突き合わせて確認した範囲です。その点はご承知おきください。
| 観点 | リモート(serverUrl) | ローカル(Docker) |
|---|---|---|
| 必須のキー | serverUrl | command |
| 前提 | ネットワーク到達性とトークン | Docker が動くこと |
| 設定の短さ | 短い | 長い(引数の書き間違いが起きやすい) |
| 向いている場面 | まず繋いで動作を見たいとき | 通信先を手元に閉じたいとき |
はじめの 1 本は、短いリモート接続をお勧めします。
読み込む前に、設定を検査します
設定ファイルは JSON なので、カンマ 1 つで全体が読めなくなります。私は書き終えたら、起動する前に必ず次のスクリプトを通しています。
#!/usr/bin/env python3
"""mcp_check.py — mcp_config.json を読み込む前に、接続できない書き方を拾う。"""
import json, sys, pathlib
LEGACY = {"url": "serverUrl", "httpUrl": "serverUrl"}
def check(path):
problems = []
try:
cfg = json.loads(pathlib.Path(path).read_text(encoding="utf-8"))
except (OSError, json.JSONDecodeError) as e:
return [f"{path}: JSON として読めません ({e})"]
servers = cfg.get("mcpServers")
if not isinstance(servers, dict):
return [f"{path}: mcpServers オブジェクトがありません"]
for name, spec in servers.items():
if spec.get("disabled"):
continue
for old, new in LEGACY.items():
if old in spec:
problems.append(f"{name}: '{old}' は使えません。'{new}' に直してください")
if "command" not in spec and "serverUrl" not in spec:
problems.append(f"{name}: command か serverUrl のどちらかが必要です")
auth = spec.get("headers", {}).get("Authorization", "")
if "YOUR_" in auth:
problems.append(f"{name}: Authorization がプレースホルダのままです")
return problems
if __name__ == "__main__":
bad = 0
for p in sys.argv[1:]:
issues = check(p)
print(("NG " if issues else "OK ") + p)
for i in issues:
print(" - " + i)
bad += bool(issues)
sys.exit(1 if bad else 0)このスクリプトは、旧書式のまま写した設定、serverUrl に直した設定、末尾にカンマが残った設定の 3 つに通しました。
NG before.json
- github: 'url' は使えません。'serverUrl' に直してください
- github: command か serverUrl のどちらかが必要です
- github: Authorization がプレースホルダのままです
OK after.json
NG broken.json
- broken.json: JSON として読めません (Expecting property name enclosed in double quotes: line 1 column 78 (char 77))旧書式の設定では、url を指摘されるだけでなく「command も serverUrl も無い」とも言われます。エージェントから見れば、接続先が 1 つも書かれていないのと同じだからです。この 2 行目こそ、画面上で「繋がらない」としか見えない状況の正体なのだと思います。
トークンの置き場所と、許可の初期値
headers にトークンを書くことには、ひとつ落とし穴があります。ワークスペースの .agents/mcp_config.json はプロジェクトの中にあるため、うっかりコミットすると鍵まで一緒に載ってしまいます。
私の線引きは次のとおりです。
- トークンを含む設定は、リポジトリの外にあるグローバルの設定に置きます
- ワークスペースの設定には、鍵を含まない stdio 系だけを置きます
- トークンは必要な権限だけを付けた細粒度のものにして、まず読み取りだけで始めます
許可の面では、公式ドキュメントによれば、設定していない MCP ツールは Ask モード、つまり実行前に承認を求められます。許可は mcp(github/*) のようにサーバー単位でも、mcp(github/ツール名) のようにツール単位でも書けます。最初は 1 つも許可せず、承認画面でツール名を見ながら必要なものだけ通していく進め方が安心です。絞り込みの考え方はエージェントに渡すMCPツールを絞る — 最小権限の許可リスト設計で書き残しております。
繋がらないとき、見る順番
| 症状 | 最初に見る場所 |
|---|---|
/mcp に github が出ない | 設定ファイルの置き場所(グローバルかワークスペースか)と JSON の構文 |
| 出るが接続できない | url / httpUrl が残っていないか |
| 接続するがツールが使えない | 承認画面(Ask モード)と、トークンに付いた権限 |
| 赤い波線が並ぶ | エディタ側のスキーマ検査が先行している可能性。MCP の設定に赤い波線が並んだ夜、直す前に確かめたことも参考になります |
設定の読み込みそのものが怪しいときは、MCP サーバーが1本も起動しない原因は、起動前の 60 行足らずで特定できますの考え方が、今回のスクリプトの親にあたります。
次にやること
読み取り専用のトークンを 1 本だけ用意し、上のリモート接続の設定を書いて、mcp_check.py に通してください。/mcp で github が接続済みに変わったら、自分のリポジトリの Issue を一覧する依頼を 1 つだけ出してみていただければと思います。
鍵は手元に、設定は検査してから。 この順番だけは、新しいサーバーを足すたびに守るようにしています。