2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【re:Invent 2025 アップデート】Amazon Connect が MCPのサポートを開始しました!

Last updated at Posted at 2025-12-10

はじめに

AWS re:Invent 2025期間中のWhat's newより、Amazon ConnectがModel Context Protocol(MCP)のサポートを開始したことが発表されました。

 本記事では、執筆時点(2025年12月9日時点)で確認できているAmazon ConnectでサポートしているMCPツールの種類と適用方法を紹介します。
さらに例として、標準で提供されているMCPツール(Out-of-the-box-tools)を利用したAIエージェントを作成し、簡易的な動作検証を行います。

本記事の情報は2025年12月時点のものです。
最新情報については公式ドキュメントをご確認ください。

この記事のゴール

  • Amazon ConnectがサポートするModel Context Protocol(MCP)ツールの種類と適用方法を理解する

  • 標準で提供されているMCPツール(Out-of-the-box-tools)を利用したAIエージェントの作成方法を理解する

ターゲット

  • Amazon Connectの基礎的な知見や利用経験のある方
  • Amazon ConnectにおけるAIエージェントの拡張機能、特にMCPの導入に関心がある方

目次

  1. 発表内容
  2. 用語解説:Model Context Protocol(MCP)とは
  3. Amazon ConnectでサポートされるMCPツール
  4. 実践:Out-of-the-boxツールを利用したAIエージェントの作成
  5. 動作確認
  6. まとめ

1. 発表内容

(日本語訳) 
Amazon ConnectでModel Context Protocol(MCP)のサポートが開始され、エンドカスタマーのセルフサービスや従業員支援のためのAIエージェントが、標準化されたツールを使用して情報を取得したりアクションを実行したりできるようになりました。今回のリリースにより、企業はAIエージェントを拡張可能なツール機能で強化し、問題解決を改善できます。たとえば、AIエージェントは、セルフサービスのやり取り中に、人間の介入を必要とせずに、注文ステータスを自動的に確認し、払い戻しを処理し、顧客レコードを更新できます。
今回のリリースにより、Amazon Connectは、連絡先属性の更新やケース情報の取得などの一般的なタスクにすぐに使用できるMCPツールを提供します。フローモジュールをMCPツールとして使用して、確定的AIワークフローと生成的AIワークフローの両方で同じビジネスロジックを再利用することもできます。さらに、フローモジュールまたはAmazon Bedrock AgentCoreゲートウェイを介して、カスタムツールやサードパーティのサービスを統合することもできます。

2. 用語解説:Model Context Protocol(MCP)とは

MCPは、AIエージェントが情報を取得したり、アクションを実行したりするための標準化されたプロトコルです。
これは、大規模言語モデル(LLM)やAIエージェントが「推論」だけでなく、外部ツールへのアクセスを伴う「行動」を定義されたルールに沿って自律的に実行できるようにするための仕組みです。

MCPの具体的な構成要素

  • MCPホスト
    • LLMやAI機能を実行するアプリケーション本体
  • MCPクライアント
    • MCPホストに内包されており、MCPホストがリクエストを処理する際に外部ツールの利用が必要と判断した場合、MCPサーバーとの通信を仲介するコンポーネント
  • MCPサーバー
    • エージェントからのリクエストを受けて適切な処理を実行するサーバー(以下構成要素)
      • Tools
        • AIが呼び出す実行可能なアクションや関数(API呼び出しなど)
      • Resources
        • AIが参照できるデータソース(ファイル、DBテーブルなど)
      • Prompts
        • ユーザーの選択により呼び出される定型的な指示

MCPの概念についてより深く理解したい方は、以下の記事が体系的に整理されており参考になるため、興味のある方はご参照ください。

3. Amazon ConnectでサポートされるMCPツール

Amazon Connectでは、MCPサーバーとして以下の3つのパターンがサポートされています。

1. Out-of-the-box tools(標準提供ツール)

Amazon Connectが標準で提供する、追加の設定が不要ですぐに使えるツール群です。
執筆時点(2025年12月9日時点)で提供されているツールは以下17種です。

標準提供されているMCPツール一覧

MCP Tool名 説明(日本語訳)
customerprofiles_ListProfileObjects Amazon Connect Customer Profilesの顧客プロファイルに紐づく、特定のオブジェクトタイプ(注文履歴、ケース、アセットなど)のリストを取得します。
connect_DescribeContactFlow 指定したコンタクトフローの定義や構成詳細(JSONデータ、ステータス、バージョン、メタデータなど)を取得します。フローロジックの確認や、フローが公開済みであるかの検証に使用します。
connect_StartTaskContact 新しい「タスク」を作成します。これはリアルタイムの通話やチャットではなく、後処理やコールバックなど、エージェントやキューに割り当てて非同期に処理すべき作業を表します。
customerprofiles_GetProfileInsights 特定の顧客プロファイルに対して生成されたインサイト(推奨アクション、商品レコメンデーション、機械学習モデルによる予測など)を取得し、顧客対応に活用します。
connectcases_ListTemplates Amazon Connect Casesドメイン内に存在するすべてのケーステンプレートを一覧表示します。ケース作成時に利用可能なテンプレート名やIDを確認するために使用します。
customerprofiles_ListRecommenders ドメインに関連付けられているレコメンダー(機械学習モデル)の一覧を取得します。「ネクストベストアクション」や「商品推奨」などの予測を行うために利用可能なモデル設定を確認できます。
connect_GetTaskTemplate 指定したタスクテンプレートの完全な定義を取得します。設定されているフィールド、初期値、制約事項、および関連付けられているコンタクトフローなどの詳細を確認できます。
connect_ListTaskTemplates インスタンス内で利用可能なすべてのタスクテンプレートを一覧表示します。StartTaskContact APIを実行する際に必要なtemplateIdを特定するのに役立ちます。
connectcases_UpdateCase 既存のケース情報を更新します。新しい情報の追加、ステータスの変更、またはケースの進行に伴うフィールド値の修正を行います。
connectcases_CreateCase 新しいカスタマーサポートケースを作成します。顧客からの問い合わせや問題報告、または後続の対応が必要な事象を管理するために使用します。システムフィールドやカスタムフィールドの値を設定可能です。
connect_SearchContactFlows インスタンス内のコンタクトフローを検索します。名前、説明、タイプ、ステータス、タグなどの条件でフィルタリングし、特定のフローを特定するために使用します。
QueryAssistant ナレッジベース(Amazon Q in Connectなど)を検索し、エージェントや顧客の質問に対する回答を生成します。検索結果に基づいた回答、要約、または解決策の提示を行います
connectcases_SearchCases 指定したフィルタ条件に基づいてCasesドメイン内のケースを検索します。重複ケースの確認、過去の履歴照会、特定のステータスや日付範囲による絞り込みに使用します。
Retrieve ナレッジベースを検索し、関連する記事やコンテンツの抜粋(チャンク)を直接返します。
connect_DescribeContact 特定のコンタクトに関する詳細情報(メタデータ)を取得します。エージェント情報、開始・終了時刻、チャネル、関連する録音データ、切断理由などを事後分析やトラブルシューティングに活用できます。
customerprofiles_ListAccountIntegrations 顧客プロファイルにデータを供給している外部システム連携(統合)の一覧を表示します。データソース、オブジェクトタイプ、イベントトリガーの設定確認などに使用します。
connect_GetContactAttributes 特定のコンタクトに保存されている「コンタクト属性」(キーと値のペア)のみを取得します。顧客の会員ランク、注文番号、フロー内で一時的に保持されたコンテキストデータなどを参照するために使用します。

2. Flow modules tools(フローモジュールツール)

Amazon Connectの「フローモジュール」をもとにMCPツールを作成することで、通常のコンタクトフロー内と、AIエージェントの両方で、同じビジネスロジックを再利用できるようになります。

3. Third-party MCP tools(カスタムツール)

Amazon Bedrock AgentCoreゲートウェイを介してサードパーティ製のMCPが利用できるようになります。
Amazon Connectにサードパーティ製アプリケーションを登録する方法と同じ手順で、AgentCore Gatewayを登録することで、リモートMCPサーバーを含む、サーバー内で利用可能な全てのツールにアクセスできます。

  • 「Amazon Connectコンソール」 > 「サードパーティのアプリケーション」 > 「基本情報」より、「アプリケーションタイプ」でMCPサーバーを選択することで統合可能です(本記事では紹介に留めます。)

image.png


4. 実践:Out-of-the-boxツールを利用したAIエージェントの作成

ここからは、実際に標準ツールである「Retrieve(関連するナレッジの取得)」と「connect_GetContactAttributes(コンタクト属性の取得)」を利用して、顧客との通話中にAIエージェントが適切なデータ(ナレッジソース・コンタクト属性値)を取得できるか検証します。

動作環境

本記事で使用する環境は以下のとおりです。

  • AWSリージョン:オレゴン(us-west-2)

執筆時点(2025年12月9日時点)では、本機能は東京リージョン(ap-northeast-1)では提供されておりませんでした。そのため、本検証はオレゴンリージョン(us-west-2)で実施しております。
実際の利用可能なリージョンについては公式ドキュメントをご確認ください。

前提条件

本記事では以下を前提とします。

  • Amazon Connectインスタンスの初期設定(受架電可能な状態)が完了していること
  • 対象のインスタンスでAmazon Q in Connectが有効化されていること
    • こちらの資料を参考に、 ナレッジベースの作成 までの初期設定が完了していること

    • 今回は、生成AIを用いて作成した架空の家電カタログ表をナレッジベース用のS3にアップロードしています

構築方法

以下の流れで検証用のAIエージェントおよびコンタクトフローを作成します。

  1. 検証用AIエージェントの作成
  2. Default AI Agent Configurationsの更新
  3. 検証用コンタクトフローの作成

1. 検証用AIエージェントの作成

「Amazon Connect管理者ワークスペース」 > 「AIエージェントデザイナー」 > 「AIエージェント」より、「AIエージェントを作成」をクリックします。
image.png

  • AIエージェントの初期設定

    • 名前:有効な文字からなる任意の文字列
    • AIエージェントタイプ:Orchestration
    • Copy from existing(コピー元のAIエージェント):AgentAssistanceOrchestrator
    • 説明:オプション
      上記設定後、「作成」をクリックします。
      image.png
  • AIエージェントの詳細設定

    • 説明:オプション
    • ロケール:English(US)から Japanese(JP) へ変更
    • セキュリティプロファイル:Admin
      image.png
  • Tools設定

    • GenerateNotesを取り除く
      • 「GenerateNotes」のラジオボタンをクリックし「Remove」をクリック
        image.png
    • connect_GetContactAttributesを追加する
      • 「Add tool」> 「Add existing AI Tool」をクリック
      • 「Namespace」 > 「Amazon Connect」 をクリック
      • 「connect_GetContactAttributes」をクリックし、他の設定値は変えずに「Add」をクリック
        image.png
    • Retrieveを編集する
      • 「Retrieve」のラジオボタンをクリックし「Edit」をクリック
        image.png
      • 「Assistant Association」をクリックし、ナレッジベースを関連づける
        image.png
      • 上記変更後、画面下部の「update」をクリック
        image.png

以上でAIエージェントの設定は完了です。 画面右上の「保存」と「公開」をクリックします。
image.png

2. Default AI Agent Configurationsの更新

「AIエージェントデザイナー」 > 「AIエージェント」>「Default AI Agent Configurations」より、「Agent Assistance」の「Name」列をクリックします。
image.png

2.検証用AIエージェントの作成で作成したAIエージェントを選択し、セレクトボックス右側のチェックマークをクリックし、デフォルトのAIエージェントを更新します。

image.png

image.png

上図のように画面上部にAIエージェントの更新に成功した旨のスナックバーが表示されていることを確認してください。AIエージェントを選択しただけでは紐づいていない場合があります。

以上でDefault AI Agent Configurationsの更新は完了です。

3. 検証用コンタクトフローの作成

「Amazon Connect管理者ワークスペース」> 「ルーティング」>「フロー」>「フローを作成」より、検証用のコンタクトフローを作成します。
image.png

以下のようなコンタクトフローを作成します。

image.png

補足:検証用コンタクトフロー(.json)
{
  "Version": "2019-10-30",
  "StartAction": "7601a083-aa47-4818-b130-f66922c5335a",
  "Metadata": {
    "entryPointPosition": {
      "x": -457.6,
      "y": 188
    },
    "ActionMetadata": {
      "7601a083-aa47-4818-b130-f66922c5335a": {
        "position": {
          "x": -304.8,
          "y": 187.2
        }
      },
      "e6f03fed-854c-48d5-a1f5-224b40f29e83": {
        "position": {
          "x": -63.2,
          "y": 191.2
        }
      },
      "baf3c1b8-217c-45dc-9a78-dff394f8a45a": {
        "position": {
          "x": 420.8,
          "y": 467.2
        },
        "parameters": {
          "QueueId": {
            "displayName": "BasicQueue"
          }
        },
        "queue": {
          "text": "BasicQueue"
        }
      },
      "a41adf72-7337-499d-b42a-910668f21fe2": {
        "position": {
          "x": 648,
          "y": 458.4
        }
      },
      "a12cd42f-f428-4366-bb8a-521516a43683": {
        "position": {
          "x": 902.4,
          "y": 304.8
        }
      },
      "コンタクト属性テスト2": {
        "position": {
          "x": 196.8,
          "y": 460
        },
        "isFriendlyName": true,
        "dynamicParams": []
      },
      "e8bad9a9-bbfe-47ce-b206-76acc20bdc15": {
        "position": {
          "x": 189.6,
          "y": 188.8
        },
        "children": [
          "ddd5aa16-1931-4292-a63f-1ff8755f6810"
        ],
        "parameters": {
          "TextToSpeechVoice": {
            "languageCode": "ja-JP"
          }
        },
        "overrideConsoleVoice": true,
        "fragments": {
          "SetContactData": "ddd5aa16-1931-4292-a63f-1ff8755f6810"
        },
        "overrideLanguageAttribute": true
      },
      "ddd5aa16-1931-4292-a63f-1ff8755f6810": {
        "position": {
          "x": 189.6,
          "y": 188.8
        },
        "dynamicParams": []
      },
      "e4194c78-a41a-459d-b01b-42e0fd148f2f": {
        "position": {
          "x": -48.8,
          "y": 460
        },
        "children": [
          "69593493-31e6-4f47-81e1-13d8c2ca4ba8"
        ],
        "parameters": {
          "OrchestrationAIAgentConfiguration": {
            "AgentAssistanceAgentVersionArn": {
              "useAIAgentDropdown": true,
              "aiAgentName": "suzuki-mcp-tool-test"
            }
          }
        },
        "fragments": {
          "SetContactData": "69593493-31e6-4f47-81e1-13d8c2ca4ba8"
        },
        "useAIAgentDropdown": true,
        "aiAgentName": "suzuki-mcp-tool-test"
      },
      "69593493-31e6-4f47-81e1-13d8c2ca4ba8": {
        "position": {
          "x": -48.8,
          "y": 460
        },
        "dynamicParams": []
      },
      "コンタクト属性テスト1": {
        "position": {
          "x": -281.6,
          "y": 469.6
        },
        "isFriendlyName": true,
        "dynamicParams": []
      }
    },
    "Annotations": [],
    "name": "mcp-tool-test",
    "description": "",
    "type": "contactFlow",
    "status": "PUBLISHED",
    "hash": {}
  },
  "Actions": [
    {
      "Parameters": {
        "FlowLoggingBehavior": "Enabled"
      },
      "Identifier": "7601a083-aa47-4818-b130-f66922c5335a",
      "Type": "UpdateFlowLoggingBehavior",
      "Transitions": {
        "NextAction": "e6f03fed-854c-48d5-a1f5-224b40f29e83"
      }
    },
    {
      "Parameters": {
        "RecordingBehavior": {
          "RecordedParticipants": [
            "Agent",
            "Customer"
          ],
          "IVRRecordingBehavior": "Disabled"
        },
        "AnalyticsBehavior": {
          "Enabled": "True",
          "AnalyticsLanguage": "ja-JP",
          "AnalyticsRedactionBehavior": "Disabled",
          "AnalyticsRedactionResults": "None",
          "ChannelConfiguration": {
            "Chat": {
              "AnalyticsModes": [
                "ContactLens"
              ]
            },
            "Voice": {
              "AnalyticsModes": [
                "RealTime"
              ]
            }
          },
          "SentimentConfiguration": {
            "Enabled": "True"
          }
        }
      },
      "Identifier": "e6f03fed-854c-48d5-a1f5-224b40f29e83",
      "Type": "UpdateContactRecordingBehavior",
      "Transitions": {
        "NextAction": "e8bad9a9-bbfe-47ce-b206-76acc20bdc15"
      }
    },
    {
      "Parameters": {
        "QueueId": "arn:aws:connect:us-west-2:000000000000:instance/00000000-0000-0000-0000-000000000000/queue/00000000-0000-0000-0000-000000000000"
      },
      "Identifier": "baf3c1b8-217c-45dc-9a78-dff394f8a45a",
      "Type": "UpdateContactTargetQueue",
      "Transitions": {
        "NextAction": "a41adf72-7337-499d-b42a-910668f21fe2",
        "Errors": [
          {
            "NextAction": "a41adf72-7337-499d-b42a-910668f21fe2",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {},
      "Identifier": "a41adf72-7337-499d-b42a-910668f21fe2",
      "Type": "TransferContactToQueue",
      "Transitions": {
        "NextAction": "a12cd42f-f428-4366-bb8a-521516a43683",
        "Errors": [
          {
            "NextAction": "a12cd42f-f428-4366-bb8a-521516a43683",
            "ErrorType": "QueueAtCapacity"
          },
          {
            "NextAction": "a12cd42f-f428-4366-bb8a-521516a43683",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {},
      "Identifier": "a12cd42f-f428-4366-bb8a-521516a43683",
      "Type": "DisconnectParticipant",
      "Transitions": {}
    },
    {
      "Parameters": {
        "Attributes": {
          "Attributes2": "Value2"
        },
        "TargetContact": "Current"
      },
      "Identifier": "コンタクト属性テスト2",
      "Type": "UpdateContactAttributes",
      "Transitions": {
        "NextAction": "baf3c1b8-217c-45dc-9a78-dff394f8a45a",
        "Errors": [
          {
            "NextAction": "baf3c1b8-217c-45dc-9a78-dff394f8a45a",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "TextToSpeechEngine": "Neural",
        "TextToSpeechStyle": "None",
        "TextToSpeechVoice": "Kazuha"
      },
      "Identifier": "e8bad9a9-bbfe-47ce-b206-76acc20bdc15",
      "Type": "UpdateContactTextToSpeechVoice",
      "Transitions": {
        "NextAction": "ddd5aa16-1931-4292-a63f-1ff8755f6810",
        "Errors": [
          {
            "NextAction": "a12cd42f-f428-4366-bb8a-521516a43683",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "LanguageCode": "ja-JP"
      },
      "Identifier": "ddd5aa16-1931-4292-a63f-1ff8755f6810",
      "Type": "UpdateContactData",
      "Transitions": {
        "NextAction": "コンタクト属性テスト1",
        "Errors": [
          {
            "NextAction": "a12cd42f-f428-4366-bb8a-521516a43683",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "WisdomAssistantArn": "arn:aws:wisdom:us-west-2:000000000000:assistant/00000000-0000-0000-0000-000000000000",
        "OrchestrationAIAgentConfiguration": {
          "AgentAssistanceAgentVersionArn": "arn:aws:wisdom:us-west-2:000000000000:ai-agent/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000:$LATEST"
        }
      },
      "Identifier": "e4194c78-a41a-459d-b01b-42e0fd148f2f",
      "Type": "CreateWisdomSession",
      "Transitions": {
        "NextAction": "69593493-31e6-4f47-81e1-13d8c2ca4ba8",
        "Errors": [
          {
            "NextAction": "コンタクト属性テスト2",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "WisdomSessionArn": "$.Wisdom.SessionArn"
      },
      "Identifier": "69593493-31e6-4f47-81e1-13d8c2ca4ba8",
      "Type": "UpdateContactData",
      "Transitions": {
        "NextAction": "コンタクト属性テスト2",
        "Errors": [
          {
            "NextAction": "コンタクト属性テスト2",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "Attributes": {
          "Attributes1": "Value1"
        },
        "TargetContact": "Current"
      },
      "Identifier": "コンタクト属性テスト1",
      "Type": "UpdateContactAttributes",
      "Transitions": {
        "NextAction": "e4194c78-a41a-459d-b01b-42e0fd148f2f",
        "Errors": [
          {
            "NextAction": "e4194c78-a41a-459d-b01b-42e0fd148f2f",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    }
  ]
}

各ブロックの設定値

  • 「ログ記録動作の設定」ブロック

    • ログ記録動作の設定:有効
      image.png
  • 「記録と分析の動作を設定」ブロック

    • エージェントとお客様の音声録音:オン

      • エージェントおよび顧客
    • 自動インタラクション通話録音:オフ

    • Contact Lens音声分析:有効

      • リアルタイムおよび通話後の分析:オン
        image.png
        image.png
    • 分析設定を構成する

      • 言語:日本語(日本)
        image.png
  • 「音声の設定」ブロック

    • 言語:日本語(日本)
    • 音声:Kazuha
    • 言語属性を設定:チェック
      image.png
      image.png
  • 「コンタクト属性の設定」ブロック

    • 「Connect assistant」ブロックの前後にそれぞれ配置します

    • 1つ目(名称:コンタクト属性テスト1)

      • 名前空間:ユーザー定義済み
      • キー:Attributes1
      • 値:Value1
        image.png
    • 2つ目(名称:コンタクト属性テスト2)

      • 名前空間:ユーザー定義済み
      • キー:Attributes2
      • 値:Value2
        image.png
  • 「Connect assistant」ブロック

    • ドメインを選択:Amazon Connectインスタンスに紐づいているAIエージェントドメイン
    • AIエージェント-エージェントアシスタンス
      • AIエージェント名:作成したAIエージェント
      • AIエージェントバージョン:$LATEST
        image.png
  • 「作業キューの設定」ブロック

    • キュー:BasicQueue(各々の環境に合わせてください)
      image.png

以上でコンタクトフローの設定は完了です。
コンタクトフローに名前をつけ、画面右上の「保存」、「公開」をクリックし、フローを公開します。
image.png

5. 動作確認

音声通話またはチャットで動作確認を行います。
Agent AssistanceタイプのAIエージェントが呼び出されるのは、通話またはチャットのアクティブなコンタクト中のみなようです。

オフラインやACWの状態では、従来通りManual SearchタイプのAIエージェントが呼び出されます。

テスト1:ナレッジの検索(Retrieveツールの利用)

通話中に、「どのような家電があるか調べて」と入力したところ、ソース付きで登録している家電カタログの情報が返ってきました。
このことから、AIエージェントが意図を汲み取り、Retrieveツールを利用してナレッジの検索を行っていることがわかります。
image.png

テスト2:コンタクト属性の取得

通話中に、「この通話に紐づくコンタクト属性を取得してきて」と入力したところ、コンタクトフロー上で設定したAttributes1,Attributes2の両方が返ってきました。
このことから、AIエージェントが意図を汲み取り、connect_GetContactAttributesツールを利用してこの問い合わせに紐づく全てのコンタクト属性を取得していることがわかります。
image.png

まとめ

本記事では、re:Invent 2025で発表された「Amazon ConnectにおけるModel Context Protocol(MCP)サポート」について、簡易的な動作検証を踏まえ紹介しました。

標準ツール(Out-of-the-box tools)でのサポートも多く、単純な自動化であればノーコードで実装できる点は、運用負荷の観点からも非常に魅力的です。今回のアップデートにより、コンタクトセンター業務をこれまで以上に柔軟かつ効率的に自動化できる可能性が広がりました。

次回は、フローモジュールを活用したMCPツールの作成や、より高度なロジックの再利用について検証していきたいと思います。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?