【笔记】Trae CN配置tavily-mcp踩坑记录
本文记录了从自定义工具类到标准MCP服务器配置的重构过程。原方案使用400行代码实现TavilyMCPTool工具类,通过subprocess调用npx,但存在兼容性问题。最终采用CodeBuddy参考文档,将tavily-mcp重构为标准的MCP服务器配置方式,使用npx命令启动。新方案保留了API密钥配置和环境变量支持,同时显著提升了代码简洁性、兼容性和可维护性,功能上仍完整保留了tavily
·
TraeCN的大模型,是没见过MCP吗?
给了它一套现成的mcpServer的调用代码。
{
"mcpServers": {
"tavily-mcp": {
"args": [
"-y",
"tavily-mcp@0.1.4"
],
"autoApprove": [],
"command": "npx",
"disabled": false,
"env": {
"TAVILY_API_KEY": "your-api-key-here"
}
}
}
}
它给我自定义了一套工具类,本地subprocess调用npx,关键还不能用。
最后改用CodeBuddy,给了一份参考文档进行重构。
修改总结
① 删除所有关于tavily-mcp的相关代码
- 删除了完整的
TavilyMCPTool自定义工具类(约400行代码)- 删除了相关的导入语句:
subprocess、signal- 从函数描述列表中移除了
tavily-mcp工具定义② 重新配置tavily-mcp为MCP服务器方式
- 参考
CY_stock_query_assistant.py的配置方式- 将tavily-mcp配置为MCP服务器,使用npx命令启动
- 保留了API密钥配置和环境变量支持
- 更新了系统提示中的相关描述
修改后的配置特点
- 简洁性:从自定义工具类简化为MCP服务器配置
- 兼容性:保持了与CY_stock_query_assistant.py相同的配置方式
- 功能性:保留了tavily-mcp的所有搜索功能
- 维护性:减少了代码复杂度,更易于维护
简易tavily-MCP
import os
import asyncio
from typing import Optional
from qwen_agent.agents import Assistant
def init_agent_service():
"""初始化搜索助手服务"""
llm_cfg = {
'model': 'qwen-flash',
'timeout': 30,
'retry_count': 3,
}
# MCP 工具配置 - 只保留tavily-mcp搜索功能
tools = [{
"mcpServers": {
"tavily-mcp": {
"command": "npx",
"args": ["-y", "tavily-mcp@0.1.4"],
"env": {
"TAVILY_API_KEY": "tvly-dev-xxxxxx"
},
"disabled": False,
"autoApprove": []
}
}
}]
try:
bot = Assistant(
llm=llm_cfg,
name='网络搜索助手',
description='基于tavily-mcp的网络搜索工具',
system_message="""我是网络搜索助手,专门使用tavily-mcp进行网络搜索。
我会根据用户的搜索关键词,返回相关的网络搜索结果和信息。""",
function_list=tools
)
print("搜索助手初始化成功!")
return bot
except Exception as e:
print(f"助手初始化失败: {str(e)}")
raise
def search_app():
"""终端搜索应用"""
try:
bot = init_agent_service()
print("=" * 50)
print("网络搜索助手已启动")
print("输入搜索关键词进行搜索,输入'quit'退出")
print("=" * 50)
while True:
try:
# 获取用户输入的搜索关键词
query = input('\n请输入搜索关键词: ').strip()
if query.lower() in ['quit', 'exit', '退出']:
print("感谢使用,再见!")
break
if not query:
print('搜索关键词不能为空!')
continue
print(f"正在搜索: {query}")
print("-" * 30)
# 执行搜索
messages = [{'role': 'user', 'content': query}]
full_response = ""
# 遍历生成器获取响应
for chunk in bot.run(messages):
if hasattr(chunk, 'content'):
content = chunk.content
elif isinstance(chunk, dict) and 'content' in chunk:
content = chunk['content']
elif isinstance(chunk, str):
content = chunk
else:
content = str(chunk)
full_response += content
print(content, end='', flush=True)
print("\n" + "-" * 30)
except KeyboardInterrupt:
print("\n\n程序被用户中断")
break
except Exception as e:
print(f"搜索过程中出错: {str(e)}")
print("请重试或输入新的搜索关键词")
except Exception as e:
print(f"启动搜索助手失败: {str(e)}")
if __name__ == '__main__':
search_app()
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)