6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

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を作成します。

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

{
  "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

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

atlassian

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

image.png

Github

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

image.png

Slack

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

image.png


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

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

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

おわりに

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

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

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

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?