はじめに
先日同僚がClaude + MCPでCisco Support APIsを使用する手順を記事にまとめていました。
私もこれを試してみたところ、かなり便利に使える事が分かりました。
特にBug Searchは不具合を探す時にどのようなキーワードで探すと良いかいつも悩ましかったのが、LLMに任せると自然言語で質問すればLLMが色々とキーワードを考えて調べてくれるのでとても楽です。
沢山出てくる候補の中から影響しそうなものを見つけ出すのも、数百件の不具合が並んだExcelと睨めっこしなくてもLLMが一瞬で候補を絞り込んでくれます。
しかし私はM365 Copilotアプリをメインに使っており、できればここから使えるようにしたい。
というわけで、今回はM365 Copilotアプリ + MCPでCisco Support APIsを使用できるようにしてみたので、手順などを共有したいと思います!
想定構成
まずM365 Copilotアプリは直接MCPを使用する事はできず、Copilot Studioによるエージェントの作成が必要です。
また、このエージェントはクラウド上で動作するので、MCPサーバーもそこから触れる形に作る必要があります。
そこで今回はAzure上でApp Serviceを使ってMCPサーバーを作ることにしました。
Cisco Support MCP ServerはDocker Deployment Guideの手順が提供されているので、これを利用すれば容易に構築が可能です。
通常Azure上でのMCP Server構築はContainer Appsを使う事が多いとは思いますが、App Serviceならリソースプロバイダの登録が不要で共同作成者(Contributor)ロールの一般ユーザーでも作りやすいので、今回はこちらを選択しました。
App Serviceを使うにあたり、Container Appsは使用量に応じて費用が発生しますが、App Serviceは使用状況にかかわらず一定の費用が発生するという点に注意が必要です。
なおCisco Support APIsを使用するには事前にAPIの利用登録が必要で、これはCiscoアカウントに紐づきます。
今回は私個人のCiscoアカウントでAPIの利用登録を実施しているので、作成したMCPサーバーも私だけが使うことを想定しています。
APIの利用登録方法については上記Claudeの記事と全く同じ内容になるので省略し、本記事ではAzureでの作業から記載していきます。
Azure CLIの操作
Azureでの作業は再現しやすいようCloud ShellのBashでAzure CLIを使って実施します。
1. 変数の設定
作業をシンプルにするため、まずは以降の作業で使用するパラメータを変数として定義しておきます。
RG="<リソースグループ名>"
LOCATION="japaneast"
# 任意の名前(グローバルユニーク)
PLAN="plan-mcp-cisco"
APP="app-mcp-cisco-$RANDOM"
# MCPサーバーのFQDNは次のようになる: <APP>.azurewebsites.net
URL="https://${APP}.azurewebsites.net"
# Docker Deployment Guideに書かれているコンテナの場所
IMAGE="ghcr.io/sieteunoseis/mcp-cisco-support:latest"
# Cisco API クレデンシャル
CISCO_CLIENT_ID="<Cisco API Consoleで取得したKEY>"
CISCO_CLIENT_SECRET="<Cisco API Consoleで取得したClient Secret>"
# Bearer Token(Copilot Studio からの認証に使用)
# 今回アクセス制御にはBearer Tokenを利用する事にします。
# 64文字のランダム値を生成
MCP_BEARER_TOKEN=$(openssl rand -hex 32)
echo "$MCP_BEARER_TOKEN" # ↓ 出力を控えておく
# 有効化する Cisco API(必要に応じて変更)
SUPPORT_API="bug,case,eox,psirt,product,software"
※ $MCP_BEARER_TOKENの値は後でCopilot Studioでの設定時に必要となるので控えておいてください
2. リソースグループの作成
リソースグループの用意が無い場合、新規に作成します。
※ 今回は作成済のリソースグループを使用したのでこの手順は実施していません。
az group create \
--name "$RG" \
--location "$LOCATION"
3. App Service Plan (Linux) を作成
App Service Planを作成し、料金プランを決めます。
SKUの選択は Free/Shared だと後述の Always On が有効にできないので、今回はAlways Onが有効化できる最低ラインのB1を選択します(B1は東日本リージョンLinuxで概ね3円/時程度(執筆時点))。
az appservice plan create \
--name "$PLAN" \
--resource-group "$RG" \
--location "$LOCATION" \
--is-linux \
--sku B1 #always onにしたいのでB1を選択
お試しでの検証用途であれば一旦Freeでも構いません(その場合は後述のAlways Onの有効化はスキップ)。
お試し環境をB1で作る場合、試し終わったら忘れずApp Service Planを削除しておきましょう。
Web Appを停止しただけでは課金は止まらないのでご注意ください。
4. Web App for Containers を作成
先ほど作成したApp Service Plan上に、Web Appを作成します。
コンテナイメージは常にlatestを使うよう$IMAGEで指定しているので、Web Appをリスタートするとコンテナとして都度最新のイメージがpullされて起動できるようになります。
az webapp create \
--resource-group "$RG" \
--plan "$PLAN" \
--name "$APP" \
--container-image-name "$IMAGE"
5. アプリケーション設定(環境変数)
APIのクレデンシャル、有効化するAPI、Bearerトークン等を設定します。
コンテナは3000番ポートでリッスンしているので、WEBリクエストは3000番ポートに転送します。
az webapp config appsettings set \
--resource-group "$RG" \
--name "$APP" \
--settings \
WEBSITES_PORT=3000 \
CISCO_CLIENT_ID="$CISCO_CLIENT_ID" \
CISCO_CLIENT_SECRET="$CISCO_CLIENT_SECRET" \
SUPPORT_API="$SUPPORT_API" \
MCP_BEARER_TOKEN="$MCP_BEARER_TOKEN" \
NODE_ENV=production
6. Always Onを有効化
App Serviceはデフォルトだと20分間リクエストが無ければ自動的にアンロードされてしまいます。
お試しであればそれでも良いのですが、日々の業務利用で使うたびにApp Serviceのロードを待つのは煩わしいのでAlways Onを有効化し、いつでもすぐ使えるようにしておきます。
App Service PlanのB1は固定料金なので、B1を選択している状態ではAlways Onを有効化してもコスト的なデメリットはありません。
az webapp config set \
--resource-group "$RG" \
--name "$APP" \
--always-on true
7. コンテナの起動確認
# ログをストリーミング
az webapp log tail --resource-group "$RG" --name "$APP"
上記コマンドを実行してしばらくするとコンテナ起動時のログ出力が得られるので、State: Startedの出力が確認出来たらCtrl+Cで抜けます。以下が実行例です。
satoshi_osuga [ ~ ]$ az webapp log tail --resource-group "$RG" --name "$APP"
2026-08-10T01:08:15 Welcome, you are now connected to log-streaming service.
Starting Log Tail -n 10 of existing logs ----
(中略)
2026-08-10T01:07:36.0134312Z Site started.
2026-08-10T01:07:36.0140287Z State: Started, Action: None, LastError: , LastErrorTimestamp: 01/01/0001 00:00:00, LastErrorDetails: , Details: Site started at 08/10/2026 01:07:36 (UTC), DetailsLevel: INFO
^C
satoshi_osuga [ ~ ]$
次にcurlで/healthにアクセスし、statusがhealthy、HTTPステータスコードが200である事を確認します。
satoshi_osuga [ ~ ]$ curl -w '\nHTTP status: %{http_code}\n' "$URL/health"
{"status":"healthy","timestamp":"2026-08-10T01:09:01.061Z","activeTransports":0,"server":"mcp-cisco-support-sse"}
HTTP status: 200
※ 応答で"server":"mcp-cisco-support-sse"となっていますが、Copilot Studioは2025年8月以降MCPでSSEトランスポートをサポートしなくなったので、Copilotとの連携には Streamable HTTP エンドポイント(/mcp)を使用します
8. MCP Inspectorでツール一覧が取得できるか確認
これでツールの一覧が得られれば、MCPサーバーは問題なく動作していると判断できます。
npx @modelcontextprotocol/inspector --cli \
${URL}/mcp \
--transport http \
--header "Authorization: Bearer $MCP_BEARER_TOKEN" \
--method tools/list
Copilot Studioでのエージェント作成
ここまでの作業でMCPサーバーの構築は完了です。
次はCopilot Studioでエージェントを作成し、このMCPサーバーと接続します。
1. エージェントの作成とMCPサーバーの接続
エージェント作成画面で任意の名前を付け、ツールの追加で『モデル コンテキスト プロトコル』を追加します。

MCPサーバーの名前や記述は任意で、サーバーURLは先ほど作ったMCPサーバーのエンドポイントを入力します。

認証は今回Bearerトークンなので『APIキー』を選択し、『ヘッダー名』を『Authorization』とします。
下の入力欄にメモしてあったBearerトークンを入れるのですが、入力方法に注意してください。
『Bearer XXXXXXXXXXXX』のような形で、先頭にBearer を付ける必要があります。

接続された事を確認出来たら、『追加と構成』を実行します。

2. エージェントのモデル選択
私の環境ではデフォルトだとエージェントのモデルがClaude Sonnetになっていたのですが、あまり期待する結果が得られなかったのでOpusに変更します。

3. 使用する資格情報の選択
M365 Copilotアプリから呼び出す際に毎回接続を求められるのを避けるため、『ツール』の設定で『使用する資格情報』は『作成者提供の資格情報』にしておきます。

4. チャネルの追加
M365 Copilotアプリから使うため、『チャネル』で『Microsoft 365 と Microsoft Teams』を追加し、『公開』を実行します。

一旦チャネルの詳細を閉じて、改めて『Microsoft 365 と Microsoft Teams』を開くと『Microsoft 365 でエージェントを表示する』が有効になっているので実行します。

ここで『追加』を実行する事で、M365 Copilotアプリからも利用可能になります。

M365 Copilotアプリで実行
以上で構築作業は完了です。
M365 Copilotアプリを起動してみると、エージェントの選択肢に今回作成したエージェントが追加されているはずです。

もし追加されていない場合は『その他のエージェント』で検索してみてください。
試しに不具合を調べてみると、以下のようにBug Searchで調べて回答してくれました。

このCisco Support MCP ServerはEOL情報の検索など他にも幾つかの機能を持っているので、このエージェント一つで様々な事を調べる事が出来ます。

まとめ
本記事ではCisco Support MCP ServerがM365 Copilotアプリでも利用可能な事を具体的な手法と併せて紹介させていただきました。
多くのメーカーで、必要な情報はサイトにログインしないと得られない仕組みになっている事が多いので、このようにAPIで情報が取得可能になっておりMCP化できているのは大変助かります。
AI連携が当たり前になっている昨今、サポート関連だけでなくより多くのコンテンツがAPI対応していっていただけることを期待しています!
