| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- """搜索 MCP 服务器 - 为 Agent 提供联网搜索能力"""
- import os
- from typing import Optional
- try:
- from fastmcp import FastMCP
- except ImportError:
- print("▸️ 需要安装 fastmcp: pip install fastmcp")
- exit(1)
- # 创建 MCP 服务器
- mcp = FastMCP("search-server")
- @mcp.tool()
- def web_search(query: str, max_results: int = 3) -> str:
- """
- 联网搜索工具
-
- Args:
- query: 搜索查询词
- max_results: 返回结果数量(默认3条)
-
- Returns:
- 搜索结果摘要
- """
- print(f"▸ 执行搜索: {query}")
-
- # 尝试使用 Tavily(推荐)
- tavily_key = os.getenv("TAVILY_API_KEY")
- if tavily_key:
- try:
- from tavily import TavilyClient
- client = TavilyClient(api_key=tavily_key)
- response = client.search(query=query, max_results=max_results)
-
- result = ""
- if response.get('answer'):
- result += f"▸ AI 答案:{response['answer']}\n\n"
-
- result += "▸ 相关结果:\n"
- for i, item in enumerate(response.get('results', [])[:max_results], 1):
- result += f"[{i}] {item.get('title', '')}\n"
- result += f" {item.get('content', '')[:200]}...\n"
- result += f" 来源: {item.get('url', '')}\n\n"
-
- return result
- except Exception as e:
- print(f"▸️ Tavily 搜索失败: {e}")
-
- # 尝试使用 SerpAPI
- serpapi_key = os.getenv("SERPAPI_API_KEY")
- if serpapi_key:
- try:
- from serpapi import GoogleSearch
-
- search = GoogleSearch({
- "q": query,
- "api_key": serpapi_key,
- "num": max_results,
- "gl": "cn",
- "hl": "zh-cn"
- })
-
- results = search.get_dict()
-
- result = "▸ 搜索结果:\n"
-
- # 优先返回答案框
- if "answer_box" in results and "answer" in results["answer_box"]:
- result += f"▸ 直接答案:{results['answer_box']['answer']}\n\n"
-
- # 知识图谱
- if "knowledge_graph" in results and "description" in results["knowledge_graph"]:
- result += f"▸ 知识图谱:{results['knowledge_graph']['description']}\n\n"
-
- # 有机结果
- if "organic_results" in results:
- for i, res in enumerate(results["organic_results"][:max_results], 1):
- result += f"[{i}] {res.get('title', '')}\n"
- result += f" {res.get('snippet', '')}\n"
- result += f" {res.get('link', '')}\n\n"
-
- return result
- except Exception as e:
- print(f"▸️ SerpAPI 搜索失败: {e}")
-
- # 如果都不可用
- return """▸ 搜索功能不可用,请配置以下 API 密钥之一:
- 1. Tavily API(推荐)
- - 设置环境变量: TAVILY_API_KEY
- - 获取地址: https://tavily.com/
- - 安装: pip install tavily-python
- 2. SerpAPI
- - 设置环境变量: SERPAPI_API_KEY
- - 获取地址: https://serpapi.com/
- - 安装: pip install google-search-results
- 配置后重新启动系统。"""
- @mcp.tool()
- def search_recent_info(topic: str) -> str:
- """
- 搜索最新信息(近期新闻、技术更新等)
-
- Args:
- topic: 搜索主题
-
- Returns:
- 最新信息摘要
- """
- # 添加时间限定词
- query = f"{topic} 最新 2024"
- return web_search(query, max_results=3)
- @mcp.tool()
- def search_code_examples(technology: str, task: str) -> str:
- """
- 搜索代码示例
-
- Args:
- technology: 技术栈(如 Python、JavaScript)
- task: 任务描述(如 "异步编程"、"文件处理")
-
- Returns:
- 代码示例和说明
- """
- query = f"{technology} {task} 代码示例 教程"
- return web_search(query, max_results=3)
- @mcp.tool()
- def verify_facts(statement: str) -> str:
- """
- 验证事实准确性
-
- Args:
- statement: 需要验证的陈述
-
- Returns:
- 验证结果
- """
- query = f"{statement} 事实验证"
- return web_search(query, max_results=3)
- if __name__ == "__main__":
- # 运行 MCP 服务器
- print("▸ 启动搜索 MCP 服务器...")
- print(" 提供工具: web_search, search_recent_info, search_code_examples, verify_facts")
- mcp.run()
|