源文件:chapter4/perception-tools/README.md 感知工具 MCP 服务器 一个功能完整的 MCP(Model Context Protocol)服务器,为 AI Agent 提供多种感知与数据获取能力。 功能特性 ✨ 无需任何 API Key! 大多数功能开箱即用,依赖的是免费的开放 API。 🔍 搜索工具 网页搜索:DuckDuckGo 搜索(免费,无需 API key) 知识库搜索:在本地文档集合中检索 文件下载:从 URL 下载文件,并做安全检查 📄 多模态理解工具 网页阅读器:从网页中提取文本与链接 文档阅读器:从 PDF、DOCX、PPTX 文件中提取内容 图片解析器:解析并分析图片文件 视频解析器:从视频文件中提取元数据 📁 文件系统工具
源文件:chapter4/perception-tools/README.md
一个功能完整的 MCP(Model Context Protocol)服务器,为 AI Agent 提供多种感知与数据获取能力。
✨ 无需任何 API Key! 大多数功能开箱即用,依赖的是免费的开放 API。
cd projects/week3/perception-tools
pip install -r requirements.txt
以下功能无需任何 API key 即可立即使用:
如需集成 Google 日历,需要配置 OAuth2:
pip install google-auth-oauthlib google-auth-httplib2 google-api-python-client
按 Google Calendar API quickstart 设置 OAuth2 凭据。
.env 中添加 NOTION_API_KEYpip install notion-client
cd src python main.py
服务器以 stdio 传输运行,适合与 MCP 客户端集成。
cli.py)除了以 MCP stdio 协议对外服务,仓库根目录提供了一个统一的命令行入口cli.py,无需 MCP 客户端即可直接列出、查看、调用和演示各类感知工具。
工具按第四章「感知工具」的五类场景组织:搜索 / 多模态理解 / 文件系统 /
公开数据源 / 私有数据源(当前共 53 个工具)。
# 查看帮助(中文) python cli.py --help # 按五类列出全部感知工具(可用 --category 只看某一类) python cli.py list python cli.py list --category filesystem # 查看某个工具的参数签名与调用示例 python cli.py info weather # 直接调用某个工具,参数以 key=value 形式传入,结果为标准 ActionResponse JSON python cli.py run grep 'pattern=async def' directory=src 'file_pattern=*.py' python cli.py run currency_converter amount=100 from_currency=USD to_currency=CNY # 运行端到端演示:串联「本地资料 + 外部信息」的研究助手 Agent 感知流程 python cli.py demo # 完整演示(含联网步骤) python cli.py demo --offline # 离线演示(只跑文件系统 / 本地知识库等不联网步骤)
说明:
ActionResponse(JSON);CLI 负责运行事件list / info / 离线 demo 在缺少可选依赖(如 whisper、waybackpy)时仍可正常工作,只有真正调用相关工具时才导入对应模块。list 中标注「联网」,需要授权/API Key 的工具标注了对应说明。配置你的 MCP 客户端(例如 Claude Desktop)连接本服务器:
{ "mcpServers": { "perception-tools": { "command": "python", "args": ["/path/to/perception-tools/src/main.py"] } } }
web_search使用 DuckDuckGo 进行网页搜索(免费,无需 API key)。
参数:
query (str):搜索查询字符串num_results (int, 默认=5):返回结果数(1-10)region (str, 默认="wt-wt"):地区代码(例如 "us-en"、"uk-en","wt-wt" 表示全球)download从 URL 下载文件。
参数:
url (str):要下载的 URLoutput_path (str):本地保存路径overwrite (bool, 默认=False):是否覆盖已有文件timeout (int, 默认=180):下载超时(秒)knowledge_base_search在本地知识库目录中检索。
参数:
query (str):检索查询knowledge_base_path (str):知识库目录路径top_k (int, 默认=5):返回前 k 个结果webpage_reader读取并提取网页内容。
参数:
url (str):网页 URLextract_text (bool, 默认=True):是否提取文本extract_links (bool, 默认=False):是否提取链接document_reader读取并从文档(PDF、DOCX、PPTX)中提取内容。
参数:
file_path (str):文档文件路径或 URLextract_images (bool, 默认=False):是否提取图片image_parser解析并分析图片文件。
参数:
image_path (str):图片文件路径或 URLuse_llm (bool, 默认=True):是否用 LLM 进行分析视觉 LLM key / OpenRouter 回退:AI 图片/视频分析
(analyze_image_ai/analyze_video_ai)在设置了OPENAI_API_KEY时使用它。
若未设置但设置了OPENROUTER_API_KEY,会透明地走 OpenRouter
(base_url=https://openrouter.ai/api/v1,模型映射为provider/model形式)。
可通过PERCEPTION_VISION_MODEL覆盖模型。
(本地 Whisper 转写仍需OPENAI_API_KEY—— OpenRouter 没有音频转写 API。)
video_parser解析并从视频文件中提取元数据。
参数:
video_path (str):视频文件路径或 URLextract_frames (bool, 默认=False):是否抽取采样帧frame_interval (int, 默认=30):抽帧间隔file_reader读取文件并返回其内容。
参数:
file_path (str):文件路径encoding (str, 默认="utf-8"):文件编码max_length (int, 默认=50000):最多读取的字符数grep在文件中按模式检索(类似 grep 的功能)。
参数:
pattern (str):正则表达式模式directory (str):要检索的目录file_pattern (str, 默认="*"):文件模式(例如 *.py)recursive (bool, 默认=True):是否递归检索case_sensitive (bool, 默认=False):是否区分大小写max_results (int, 默认=100):最大结果数text_summarizer对长文本内容进行摘要。
参数:
text (str):要摘要的文本max_length (int, 默认=500):目标摘要长度use_llm (bool, 默认=True):是否用 LLM 进行摘要weather通过 Open-Meteo API 获取当前天气信息(免费,无需 API key)。
参数:
location (str):城市名(会自动进行地理编码)latitude (float, 可选):纬度坐标longitude (float, 可选):经度坐标stock_price通过 Yahoo Finance 获取股价与市场信息(免费,无需 API key)。
参数:
symbol (str):股票代码(例如 AAPL、TSLA、GOOGL)interval (str, 默认="1d"):数据时间间隔crypto_price通过 CoinGecko API 获取加密货币价格信息(免费,无需 API key)。
参数:
symbol (str):加密货币代码或 id(例如 bitcoin、ethereum、btc、eth)vs_currency (str, 默认="usd"):目标货币(usd、eur、gbp 等)currency_converter在不同货币间换算。
参数:
amount (float):要换算的金额from_currency (str):源货币代码(例如 USD)to_currency (str):目标货币代码(例如 EUR)wikipedia_search检索维基百科并获取条目摘要。
参数:
query (str):检索查询language (str, 默认="en"):维基百科语言sentences (int, 默认=5):摘要句子数arxiv_search在 ArXiv 上检索学术论文。
参数:
query (str):检索查询max_results (int, 默认=5):最大结果数sort_by (str, 默认="relevance"):排序方式wayback_search在 Wayback Machine 中检索已归档的网页。
参数:
url (str):要检索的 URLyear (int, 可选):按年份过滤limit (int, 默认=10):最大快照数location_search通过 Nominatim (OpenStreetMap) API 搜索地点(免费,无需 API key)。
参数:
query (str):地点查询(例如 "Eiffel Tower"、"New York"、"Tokyo")limit (int, 默认=5):最大结果数(1-50)country_code (str, 可选):国家代码过滤(例如 "us"、"gb"、"fr")poi_search通过 Overpass API 搜索某地点附近的兴趣点(免费,无需 API key)。
参数:
query (str):兴趣点类型(例如 "restaurant"、"cafe"、"hospital"、"atm"、"hotel")latitude (float):中心纬度坐标longitude (float):中心经度坐标radius (int, 默认=1000):检索半径(米)limit (int, 默认=10):最大结果数calendar_events从 Google 日历获取事件。
参数:
start_date (str, 可选):起始日期(ISO 格式)end_date (str, 可选):结束日期(ISO 格式)calendar_id (str, 默认="primary"):日历 IDmax_results (int, 默认=10):最大事件数notion_search在 Notion 工作区中检索。
参数:
query (str):检索查询database_id (str, 可选):指定数据库 IDpage_size (int, 默认=10):每页结果数本项目遵循 SOLID 原则,采用模块化架构:
perception-tools/ ├── src/ │ ├── main.py # MCP server entry point │ ├── base.py # Base models and utilities │ ├── search_tools.py # Search functionality │ ├── multimodal_tools.py # Document/media processing │ ├── filesystem_tools.py # File operations │ ├── public_data_tools.py # Public APIs │ └── private_data_tools.py # Private data sources ├── requirements.txt # Python dependencies ├── env.example # Environment variables template └── README.md # This file
所有工具都返回标准化的 ActionResponse 格式:
{ "success": true/false, "message": "Result data or error message", "metadata": { "additional": "context information" } }
欢迎贡献!请确保:
本项目是 AI Agent 训练营教学资料的一部分。
如有问题,请参阅主项目的文档。