MCPサーバーをローカルのコンテナで立ち上げて使用する（slack / atlassian / github）


## はじめに

AIエージェントが自律的にコードを書き、これまで外部ツールを使用する際は人間がコピペなどの作業をしていましたが、MCP（Model Context Protocol）」によって、いよいよ人間は指示をするだけになってきましね。

とはいえMCPサーバーの環境作るのが怠かったりで、チーム全員が使うのにはハードルありそうだな〜と思ったので、この記事ではdocker-composeで全員が同じMCPサーバーを構築する方法を記載します。


---

## MCPとは？なぜ注目されるのか？

MCP（Model Context Protocol）は、LLM（大規模言語モデル）と外部ツール（GitHubやSlackなど）をつなぐ**共通プロトコル**です。  
MCPサーバーを立てることで、AIが以下のようなアクションを実行できるようになります：

- GitHubのPRを取得
- JiraのIssueを検索
- Confluenceページを取得
- Slackのスレッドのやり取りを取得

---

## MCPサーバーをローカルのDockerコンテナで構築する理由

| なぜDockerコンテナで？ | 理由 |
|------------------------|------|
| ✅ 再現性 | チーム全員が同じ環境をすぐに使える（全員がuvx環境を構築するのは手間） |
| ✅ 手早く検証 | MCPサーバーをみんなが共有できるような環境構築して〜が初期としては重い |

要は手早く、チーム全員にMCPを使ってみてほしいな〜という動機です。

---

## MCP構成図（ローカルDocker運用）

以下のようにローカルのLLMクライアントからコンテナ内のMCPサーバーを利用するようにします。

```
+------------------+
|  LLMクライアント  |（例：Cursor, Cline, LM Studioなど）
+------------------+
         |
   MCPプロトコル
         ▼
+-------------------------+
|  MCPサーバー群 (Docker) |
|  ├─ GitHub              |
|  ├─ Jira/Confluence     |
|  └─ Slack               |
+-------------------------+
```

---

## docker-composeでMCPサーバーを構築する

今回 atlassian/Github/SlackのMCPサーバーとの連携を試してみます。
以下のようなdocker-compose.ymlを作成します。

```yaml
version: '3.8'
services:
  mcp-atlassian:
    image: ghcr.io/sooperset/mcp-atlassian:latest
    environment:
      - CONFLUENCE_URL=${CONFLUENCE_URL}
      - CONFLUENCE_API_TOKEN=${CONFLUENCE_API_TOKEN}
      - JIRA_URL=${JIRA_URL}
      - JIRA_API_TOKEN=${JIRA_API_TOKEN}
      - ENABLED_TOOLS=confluence_search,jira_search,...

  mcp-github:
    image: ghcr.io/github/github-mcp-server:latest
    environment:
      - GITHUB_PERSONAL_ACCESS_TOKEN=${GITHUB_PERSONAL_ACCESS_TOKEN}

  mcp-slack:
    image: mcp/slack
    environment:
      - SLACK_TEAM_ID=${SLACK_TEAM_ID}
      - SLACK_CHANNEL_IDS=${SLACK_CHANNEL_IDS}
      - SLACK_BOT_TOKEN=${SLACK_BOT_TOKEN}
```

`.env`ファイルに機密情報を保存し、Gitで共有しないよう `.gitignore` に追加しておきましょう。

---

## 任意のLLMクライアントとmcpServersで連携

今回はRooCodeで構築したMCPサーバーを使ってみます。
RooCodeの「MCPサーバー」アイコンから設定を開き、グローバルMCP or プロジェクトMCPに以下のような設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/93c4a1f9-d7cb-4da3-a58d-0fec706f8728.png)


```json
{
  "mcpServers": {
    "mcp-atlassian": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "--net=host",
        "-e",
        "CONFLUENCE_URL=https://sample.atlassian.net/wiki",
        "-e",
        "CONFLUENCE_USERNAME=sample@xxx.yyy.zzz",
        "-e",
        "CONFLUENCE_API_TOKEN=ATATXXXXXXXXXX",
        "ghcr.io/sooperset/mcp-atlassian:latest"
      ],
      "alwaysAllow": [
        "confluence_get_page_children",
        "confluence_get_comments",
        "confluence_get_labels",
        "confluence_get_page",
        "confluence_add_comment"
      ]
    },
    "github": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "GITHUB_PERSONAL_ACCESS_TOKEN=ghp_XXXXXXXXXXX",
        "ghcr.io/github/github-mcp-server:latest"
      ],
      "alwaysAllow": [
        "add_issue_comment",
        "add_pull_request_review_comment_to_pending_review",
        "create_branch",
        "create_issue",
        "create_pending_pull_request_review",
        "create_pull_request",
        "get_code_scanning_alert",
        "get_commit",
        "get_file_contents",
        "get_issue",
        "get_issue_comments",
        "get_me",
        "get_notification_details",
        "get_pull_request",
        "get_pull_request_comments",
        "get_pull_request_diff",
        "get_pull_request_files",
        "get_pull_request_reviews",
        "get_pull_request_status",
        "get_secret_scanning_alert",
        "get_tag",
        "list_branches",
        "list_code_scanning_alerts",
        "list_commits",
        "list_issues",
        "list_notifications",
        "list_pull_requests",
        "list_secret_scanning_alerts",
        "list_tags",
        "search_code",
        "search_issues",
        "search_repositories",
        "search_users"
      ]
    },
    "mcp-slack": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "SLACK_TEAM_ID",
        "-e",
        "SLACK_CHANNEL_IDS",
        "-e",
        "SLACK_BOT_TOKEN",
        "mcp/slack"
      ],
      "env": {
        "SLACK_TEAM_ID": "T123456789",
        "SLACK_CHANNEL_IDS": "XXXXXXXXXXX, YYYYYYYYYYY, ZZZZZZZZZZ",
        "SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}"
      }
    }
  }
}

```

- `alwaysAllow` はユーザーに確認を求めず直接実行できるツールを定義します

- トークンなどは適宜書き換えてください

- Cursorも同じMCPの設定で動作します

- 勢いで作ったので、MCPの設定に冗長な部分がありそうですが、一旦スルーでお願いしますmm


正しく設定できると`docker-compose up`した後、以下のようにMCPの一覧に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/9aaae4e0-9309-4fa7-a964-7a7061c5e83c.png)


## 実際にMCPサーバーを使ってみる

### atlassian

次にコンフルエンスのページを要約させてみましたが、うまくいってそうです！
設計書からの実装もできそうですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/3ca513ce-73ff-4e7a-bc11-e8694d1783d6.png)


### Github

試しにPRの内容を取得！
isuueも取得できるので、そこから修正や、PRのコメントから修正もできそうですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/0c6f6955-9c68-4435-83f4-129b0fbdd482.png)

### Slack

最後にSlackでもスレッドの要約をさせてみました！うまくいってそう！
こちらも技術的なやり取りが行われているものからコードの修正ができれば嬉しい場面はありそうです！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/08835cc7-d67a-4104-bb03-fb1547685ba3.png)



---

## 商用利用・ライセンスの観点から見る構成の選択肢

大体同じことがDocker Desktop Toolkitでもできます。
チームの状況によっては使い分けても良さそうです！

| 比較項目 | Docker Desktop Toolkit | docker-compose + 自作構成 |
|----------|------------------------|-----------------------------|
| 商用利用制限 | **あり**（[有償ライセンス](https://www.docker.com/pricing)が必要な場合あり） | **なし**（OSSツールベース） |
| ライセンス自由度 | △ Docker Desktop拡張に依存 | ◎ Apache/MIT ライセンスのMCP実装が多い |
| CI/CD対応 | × GUI前提で難しい | ◎ CLI構成のため自動化しやすい |
| MCP導入の手軽さ | ◎ GUIでポチポチするだけ | △ 使い方を調べてdocker-compose.ymlや.Dockerfileに記載 |

---

## おわりに

今回はMCPをローカルのコンテナに立ち上げて使ってみました。

- フットワーク軽くチームでMCPの導入をしてみる
- 環境構築を簡単にする
- ライセンス回避

の観点を考えるとアリかな〜と思ってます。
今回の使い方は動作確認っぽい内容ですが、コミュニケーションなどの内容を実装に反映したい場合は多いので、
今後も手軽にチームにMCPを触れる環境を提供し、AI開発の価値を高めていきたいな〜と思います！