Spaces:
Sleeping
Sleeping
#!/usr/bin/env python3 | |
import asyncio | |
import os | |
import sys | |
from pathlib import Path | |
# Add current directory to path for imports | |
sys.path.append(str(Path(__file__).parent)) | |
from mcp_integration import MCPBrainClient, create_final_answer_tool, add_filesystem_tool | |
async def demo_filesystem_tool(): | |
"""演示文件系统工具的基本功能""" | |
print("🔍 文件系统工具演示") | |
print("=" * 50) | |
try: | |
async with MCPBrainClient() as client: | |
print("✓ 初始化 MCP 客户端") | |
# 添加文件系统工具 | |
try: | |
await add_filesystem_tool(client, workspace_paths=[ | |
"/Users/femtozheng/workspace", | |
"/Users/femtozheng/python-project/minion-agent" | |
]) | |
print("✓ 文件系统工具添加成功") | |
# 获取所有工具 | |
tools = client.get_tools_for_brain() | |
print(f"✓ 总共可用工具: {len(tools)}") | |
# 筛选文件系统相关工具 | |
fs_tools = [t for t in tools if any(keyword in t.name.lower() | |
for keyword in ['file', 'read', 'write', 'list', 'directory'])] | |
if fs_tools: | |
print(f"\n📁 发现 {len(fs_tools)} 个文件系统工具:") | |
for i, tool in enumerate(fs_tools, 1): | |
print(f" {i}. {tool.name}") | |
print(f" 描述: {tool.description}") | |
if hasattr(tool, 'parameters') and tool.parameters: | |
props = tool.parameters.get('properties', {}) | |
if props: | |
print(f" 参数: {', '.join(props.keys())}") | |
print() | |
# 演示如何在 brain.step 中使用 | |
print("💡 在 brain.step 中使用示例:") | |
print("```python") | |
print("# 添加最终答案工具") | |
print("final_tool = create_final_answer_tool()") | |
print("all_tools = fs_tools + [final_tool]") | |
print() | |
print("# 在 brain.step 中使用") | |
print("obs, score, *_ = await brain.step(") | |
print(" query='请读取 README.md 文件的内容',") | |
print(" route='raw',") | |
print(" check=False,") | |
print(" tools=all_tools") | |
print(")") | |
print("```") | |
# 模拟 brain.step 调用 | |
print("\n🧠 模拟 brain.step 集成:") | |
final_tool = create_final_answer_tool() | |
all_tools = fs_tools + [final_tool] | |
tool_specs = [tool.to_function_spec() for tool in all_tools] | |
print(f"✓ 生成了 {len(tool_specs)} 个工具规格") | |
print("✓ 工具已准备好供 brain.step 使用") | |
# 展示工具规格格式 | |
if fs_tools: | |
sample_tool = fs_tools[0] | |
print(f"\n📋 示例工具规格 ({sample_tool.name}):") | |
spec = sample_tool.to_function_spec() | |
print(f" 类型: {spec.get('type', 'N/A')}") | |
print(f" 函数名: {spec.get('function', {}).get('name', 'N/A')}") | |
print(f" 描述: {spec.get('function', {}).get('description', 'N/A')}") | |
else: | |
print("⚠ 没有发现文件系统相关工具") | |
print("可能的原因:") | |
print("- @modelcontextprotocol/server-filesystem 未正确安装") | |
print("- Node.js/npx 环境问题") | |
print("- 工具名称不包含预期的关键词") | |
except Exception as e: | |
print(f"❌ 添加文件系统工具失败: {e}") | |
print("\n故障排除:") | |
print("1. 确保安装了 Node.js 和 npx") | |
print("2. 运行: npx @modelcontextprotocol/server-filesystem --help") | |
print("3. 检查网络连接") | |
print("4. 确保指定的路径存在且可访问") | |
except Exception as e: | |
print(f"❌ 演示失败: {e}") | |
async def test_filesystem_paths(): | |
"""测试不同的文件系统路径配置""" | |
print("\n🛠 测试自定义路径配置") | |
print("=" * 50) | |
# 测试不同的路径组合 | |
test_paths = [ | |
["/Users/femtozheng/workspace"], | |
["/Users/femtozheng/python-project/minion-agent"], | |
["/Users/femtozheng/workspace", "/Users/femtozheng/python-project/minion-agent"], | |
[".", str(Path.home() / "Documents")] # 相对路径和绝对路径混合 | |
] | |
for i, paths in enumerate(test_paths, 1): | |
print(f"\n📁 测试配置 {i}: {paths}") | |
try: | |
# 检查路径是否存在 | |
existing_paths = [] | |
for path in paths: | |
if Path(path).exists(): | |
existing_paths.append(path) | |
print(f" ✓ 路径存在: {path}") | |
else: | |
print(f" ⚠ 路径不存在: {path}") | |
if existing_paths: | |
async with MCPBrainClient() as client: | |
await add_filesystem_tool(client, workspace_paths=existing_paths) | |
tools = client.get_tools_for_brain() | |
fs_tools = [t for t in tools if any(keyword in t.name.lower() | |
for keyword in ['file', 'read', 'write', 'list'])] | |
print(f" ✓ 配置成功,发现 {len(fs_tools)} 个文件系统工具") | |
else: | |
print(" ⚠ 跳过测试(没有有效路径)") | |
except Exception as e: | |
print(f" ❌ 配置失败: {e}") | |
async def show_integration_example(): | |
"""展示完整的集成示例""" | |
print("\n🚀 完整集成示例") | |
print("=" * 50) | |
print(""" | |
这里是如何在实际项目中使用文件系统工具的示例: | |
```python | |
from mcp_integration import MCPBrainClient, add_filesystem_tool, create_final_answer_tool | |
from minion.main.brain import Brain | |
from minion.main import LocalPythonEnv | |
from minion.providers import create_llm_provider | |
async def use_filesystem_in_brain(): | |
# 1. 设置 MCP 客户端和文件系统工具 | |
async with MCPBrainClient() as mcp_client: | |
await add_filesystem_tool(mcp_client, workspace_paths=[ | |
"/Users/femtozheng/workspace", | |
"/Users/femtozheng/python-project/minion-agent" | |
]) | |
# 2. 获取所有工具 | |
mcp_tools = mcp_client.get_tools_for_brain() | |
final_tool = create_final_answer_tool() | |
all_tools = mcp_tools + [final_tool] | |
# 3. 创建 brain 实例 | |
llm = create_llm_provider(your_config) | |
python_env = LocalPythonEnv(verbose=False) | |
brain = Brain(python_env=python_env, llm=llm) | |
# 4. 使用 brain.step 处理文件操作 | |
obs, score, *_ = await brain.step( | |
query="请读取项目根目录的 README.md 文件并总结其内容", | |
route="raw", | |
check=False, | |
tools=all_tools | |
) | |
print(f"Brain 响应: {obs}") | |
# 其他用例: | |
# - "列出 workspace 目录下的所有 Python 文件" | |
# - "读取 config.json 文件并解析其配置" | |
# - "在指定目录创建一个新的文档文件" | |
# - "搜索包含特定关键词的文件" | |
``` | |
🎯 主要优势: | |
- 🔒 安全: 只能访问预先配置的路径 | |
- 🔄 异步: 所有文件操作都是异步的 | |
- 🧠 智能: AI 可以理解文件内容并进行推理 | |
- 🛠 灵活: 支持读取、写入、列表等多种操作 | |
""") | |
async def main(): | |
"""运行所有演示""" | |
print("📁 MCP 文件系统工具集成演示") | |
print("=" * 80) | |
await demo_filesystem_tool() | |
await test_filesystem_paths() | |
await show_integration_example() | |
print("\n✅ 演示完成!") | |
print("\n📝 下一步:") | |
print("1. 运行: python app_with_mcp.py") | |
print("2. 在界面中启用 'MCP Tools'") | |
print("3. 测试文件相关查询,如: '读取当前目录的文件列表'") | |
print("4. 或者直接在代码中使用文件系统工具") | |
if __name__ == "__main__": | |
asyncio.run(main()) |