🚀 Microsoft OneDrive用MCPサーバー
このサーバーは、Model Context Protocol (MCP) プロトコルを実装し、AIエージェントがMicrosoft OneDrive内のファイルやフォルダを検索およびナビゲートできるようにします。Spring BootとSpring AIを使用して構築されています。
✨ 主な機能
- 🔍 OneDrive内のファイルを検索し、必要に応じてフォルダでフィルタリングできます。
- 📁 フォルダ構造を検索およびナビゲートできます。
- 🔗 ファイルやフォルダの直接のWebリンクを取得できます。
- 🤖 AIエージェントと統合可能なMCP互換インターフェースを備えています。
- 🔒 Microsoft Graph APIを使用した安全なアクセスが可能です。
📦 インストール
前提条件
- Java 21以上
- Maven 3.6以上
- Docker(コンテナ化デプロイ用、オプション)
- Microsoft OneDriveアカウントとアクセストークン
Microsoft OneDriveアクセストークンの取得
OneDriveのアクセストークンは、以下の2つの方法で取得できます。
方法一:Microsoftアカウントでログインする
- ブラウザを開き、https://onedrive.live.com にアクセスします。
- Microsoftアカウントでログインします。
- ログイン後、ブラウザのアドレスバーに
.access
で終わるリンクが表示されます。例:https://account.microsoft.com/onedrive/authorize?response_type=code&client_id=your_client_id&redirect_uri=your_redirect_uri&scope=files.readwrite
- このリンクをクリップボードにコピーします。
- ターミナルで以下のコマンドを実行し、最後に
.access
リンクを貼り付けます。curl -X POST https://login.microsoftonline.com/common/oauth2/v2.0/token -H "Content-Type: application/x-www-form-urlencoded" --data-urlencode "client_id=your_client_id&redirect_uri=your_redirect_uri&code=<paste-your-code>&grant_type=authorization_code"
- エンターキーを押すと、アクセストークンを含むJSON応答が返されます。
access_token
フィールドからアクセストークンを抽出できます。
方法二:Azureポータルでアプリケーションを作成し、トークンを取得する
- Azureポータル にアクセスします。
- Microsoftアカウントでログインします。
- 左側のメニューで 「企業アプリの登録」 を選択します。
- 指示に従って、アプリケーションの名前、説明、その他必要な情報を入力し、登録を完了します。
- 登録が完了したら、Azureポータルで作成したアプリケーションを見つけ、 「設定」 セクションに移動します。
- 「OAuth2トークンエンドポイントの承認」 の下にある、クライアントIDとクライアントシークレットを記録します。
- 以下のコマンドを使用して、クライアント資格情報でアクセストークンを取得します。
curl -X POST https://login.microsoftonline.com/common/oauth2/v2.0/token -H "Content-Type: application/x-www-form-urlencoded" --data-urlencode "client_id=your_client_id&client_secret=your_client_secret&grant_type=client_credentials"
- エンターキーを押すと、アクセストークンを含むJSON応答が返されます。
access_token
フィールドからアクセストークンを抽出できます。
設定
環境変数の設定
MCPサーバーを実行する前に、以下の環境変数を設定してください。
ONEDRIVE_CLIENT_ID
: アプリケーションのクライアントID。
ONEDRIVE_CLIENT_SECRET
: アプリケーションのクライアントシークレット。
ONEDRIVE_REDIRECT_URI
: アプリのリダイレクトURI。
テキストファイルの設定
これらの値をテキストファイル(例:.env
)に書き込むこともできます。
ONEDRIVE_CLIENT_ID=your_client_id
ONEDRIVE_CLIENT_SECRET=your_client_secret
ONEDRIVE_REDIRECT_URI=your_redirect_uri
実行
直接実行
ターミナルで以下のコマンドを実行して、MCPサーバーを起動します。
mvn spring-boot:run
Dockerでのデプロイ
- Dockerイメージをビルドします。
mvn spring-boot:build-image
- これにより、
karthik20/onedrive-mcp-server:0.0.1
という名前のイメージが作成されます。
- コンテナを実行します。
docker run -p 8080:8080 -e ONEDRIVE_ACCESS_TOKEN=your-token karthik20/onedrive-mcp-server:0.0.1
💻 使用例
MCPクライアントを使ったテスト
GitHub Copilot
- VS CodeにGitHub Copilotをインストールします。
- AI設定を構成して、MCPサーバーを使用するようにします。
{
"mcp.server.url": "http://localhost:8080"
}
Microsoftの他のツール
- Claude Desktopの設定を開きます。
- 新しいMCPサーバーを追加し、URLを
http://localhost:8080
に設定します。
- 組み込みのファイルブラウザを使用して、OneDriveのファイルにアクセスします。
利用可能なMCPツール
ファイルの検索
OneDrive内でファイルを検索し、必要に応じてフォルダでフィルタリングできます。
public String searchFiles(String fileName, String folder)
フォルダの検索
フォルダ構造をナビゲートして検索できます。
public String searchFolderPath(String folderName)
フォルダの内容をリストする
特定のフォルダパス内のすべてのファイルとフォルダをリストします。
public String listFolderContents(String folderPath)
これは、ファイルとフォルダの情報を含むJSON配列を返します。
テストコードの例
Javaの例
以下は、MCPサーバーが提供するAPIを使用する簡単なJavaの例です。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class OnedriveMcpClient {
public static void main(String[] args) {
String serverUrl = "http://localhost:8080";
try {
HttpClient client = HttpClient.newDefault();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(serverUrl + "/api/search/files?name=testfile.txt"))
.build();
HttpResponse<String> response = client.send(request,HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
} catch (Exception e) {
e.printStackTrace();
}
try {
HttpClient client = HttpClient.newDefault();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(serverUrl + "/api/search/folders?name=Documents"))
.build();
HttpResponse<String> response = client.send(request,HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
} catch (Exception e) {
e.printStackTrace();
}
try {
HttpClient client = HttpClient.newDefault();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(serverUrl + "/api/list_contents/folder?path=/"))
.build();
HttpResponse<String> response = client.send(request,HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Pythonの例
以下は、MCPサーバーが提供するAPIを使用する簡単なPythonの例です。
import requests
server_url = "http://localhost:8080"
try:
response = requests.get(f"{server_url}/api/search/files?name=testfile.txt")
print(response.json())
except Exception as e:
print(str(e))
try:
response = requests.get(f"{server_url}/api/search/folders?name=Documents")
print(response.json())
except Exception as e:
print(str(e))
try:
response = requests.get(f"{server_url}/api/list_contents/folder?path=/")
print(response.json())
except Exception as e:
print(str(e))
📚 ドキュメント
プロジェクト構造
ルートディレクトリ
src/main/java/com/example/onedrive/OAuth2TokenProvider.java
: OAuth 2.0トークンを提供する実装。
src/main/java/com/example/onedrive/OneDriveService.java
: OneDriveとのやり取りを定義する核心サービスインターフェース。
src/main/java/com/example/mcp/MCPController.java
: MCPサーバーのAPIリクエストを処理します。
リソース
/api/search/files
: ファイルを検索します。
/api/search/folders
: フォルダを検索します。
/api/list_contents/folder
: 指定されたパスのフォルダ内容をリストします。
注意事項
- 権限管理:アプリケーションがOneDriveリソースにアクセスするための適切な権限を持っていることを確認してください。
- エラー処理:本番環境では、適切なエラー処理メカニズムとログ記録を追加することをおすすめします。
- セキュリティ:コード内に機密情報(クライアントシークレットなど)を平文で保存しないでください。環境変数または安全な設定管理ツールを使用することをおすすめします。
依存関係
- Spring Boot
- Java HTTPクライアントライブラリ
- JSON処理ライブラリ
ビルドと実行
Mavenを使用する
- プロジェクトのルートディレクトリで、以下のコマンドを実行してプロジェクトをビルドします。
mvn clean install
- MCPサーバーを実行します。
mvn spring-boot:run
手動でのデプロイ
- MCPサーバーのJARファイルをターゲットサーバーにコピーします。
- ターミナルで以下のコマンドを実行します。
java -jar onedrive-mcp-server-0.0.1.jar
モニタリングとログ
以下のツールを統合して、モニタリングとログ記録を行うことをおすすめします。
- Prometheus と Grafana:メトリクスの測定と可視化に使用します。
- ELK Stack(Elasticsearch、Logstash、Kibana):ログ管理と分析に使用します。
トラブルシューティング
- MCPサーバーが起動しない場合
- ポートが使用中でないことを確認してください。デフォルトのポートは8080です。他のサービスと競合する場合は、ポートを変更してください。
- OneDriveリソースにアクセスできない場合
- アプリケーションがOneDriveリソースにアクセスするための適切な権限を持っていること、および環境変数が正しく設定されていることを確認してください。
- APIリクエストが失敗する場合
- リクエストのURLが正しいことを確認し、返されるステータスコードと応答内容を確認してください。
付録
REST APIドキュメント