这是一个实现 Model Context Protocol (MCP) 协议的服务器,能让 AI 代理搜索和导航 Microsoft OneDrive 中的文件与文件夹。它基于 Spring Boot 和 Spring AI 构建,为用户提供便捷的 OneDrive 访问体验。
在使用本服务器之前,你需要完成一些准备工作,包括获取访问令牌和进行相关配置。具体步骤请参考后续的“获取 Microsoft OneDrive 访问令牌”和“配置”章节。
.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=&grant_type=authorization_code"
access_token 字段中提取访问令牌。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"
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
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 服务器提供的 API 的简单示例:
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 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 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 response = client.send(request,HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
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))
在 OneDrive 中搜索文件,可选文件夹过滤:
public String searchFiles(String fileName, String folder)
导航和搜索文件夹结构:
public String searchFolderPath(String folderName)
列出特定文件夹路径下的所有文件和文件夹:
public String listFolderContents(String folderPath)
返回一个 JSON 数组,包含文件和文件夹的信息。
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: 列出指定路径下的文件夹内容搜索文件:
GET /api/search/files?name=
返回指定文件名的所有匹配项。
搜索文件夹:
GET /api/search/folders?name=
mvn clean install
mvn spring-boot:run
java -jar onedrive-mcp-server-0.0.1.jar
建议集成以下工具来监控和日志记录:
无法启动 MCP 服务器
无法访问 OneDrive 资源
API 请求失败
⚠️ 重要提示
- 权限管理:确保您的应用程序具有适当的权限来访问 OneDrive 资源。
- 错误处理:在生产环境中,建议添加适当的错误处理机制和日志记录。
- 安全性:不要在代码中明文存储敏感信息(如客户端密钥)。建议使用环境变量或安全的配置管理工具。