MCP 数据获取服务器 是一个安全、隔离的服务器,通过 模型控制协议(MCP) 获取网页内容并提取数据,不执行 JavaScript。
# 克隆仓库(或复制MCPDataFetchServer.1文件夹)
git clone https://github.com/undici77/MCPDataFetchServer.git
cd MCPDataFetchServer
# 将启动脚本设为可执行
chmod +x run.sh
# 运行服务器,指向一个隔离的工作目录
./run.sh -d /path/to/working/directory
📌 三步概览
1️⃣ 脚本创建虚拟环境并安装依赖。
2️⃣ 准备项目根目录内的缓存文件夹(.fetch_cache)。
3️⃣main.py启动MCP服务器,监听stdin/stdout上的JSON-RPC请求。
| 选项 | 描述 |
|---|---|
-d, --working-dir | 指向所有文件操作被限制的隔离工作目录的路径(默认:~/.mcp_datafetch)。 |
-c, --cache-dir | 工作目录下的缓存子目录名称(默认:cache)。 |
-h, --help | 显示帮助信息并退出。 |
在你的mcp.json配置中添加一项,以便LM Studio可以自动启动服务器。
{
"mcpServers": {
"datafetch": {
"command": "/绝对路径/to/MCPDataFetchServer.1/run.sh",
"args": [
"-d",
"/绝对路径/to/工作目录"
],
"env": { "WORKING_DIR": "." }
}
}
}
📌 提示:确保
run.sh是可执行的(chmod +x ...),并且虚拟环境可以在首次启动时安装所需的Python包。
所有通信遵循JSON-RPC 2.0通过stdin/stdout进行。
initialize请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {}
}
响应包含协议版本、服务器功能和基本元数据(例如,名称 = mcp-datafetch-server,版本 = 2.1.0)。
tools/list请求:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}
响应:{ "tools": [ …工具定义… ] }。每个定义包括name、description和一个输入模式(JSON Schema)。
tools/call通用请求形状(根据需要替换<tool_name>和参数):
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "<tool_name>",
"arguments": { … }
}
}
服务器根据工具的模式验证请求,执行操作,并返回一个包含一个或多个内容块的ToolResult。
fetch_webpage| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
url | 字符串 | ✅(无默认值) | 要抓取的URL(仅限http/https)。 |
format | 字符串 | ❌(markdown) | 输出格式 – 之一markdown、text或html。 |
include_links | 布尔值 | ❌(true) | 是否追加提取的链接列表。 |
include_images | 布尔值 | ❌(false) | 是否在输出中列出图像URL。 |
remove_banners | 布尔值 | ❌(true) | 尝试剥离Cookie横幅和弹出窗口。 |
示例
{
"jsonrpc": "2.0",
"id": 10,
"method": "tools/call",
"params": {
"name": "fetch_webpage",
"arguments": {
"url": "https://example.com/article",
"format": "markdown",
"include_links": true,
"include_images": false,
"remove_banners": true
}
}
}
注意:该工具会净化HTML,移除脚本/iframe,并检查提示注入模式后才返回内容。
extract_links| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
url | 字符串 | ✅(无默认值) | 要分析的页面的URL。 |
filter | 字符串 | ❌(all) | 返回all、internal、external或resources中的一个。 |
示例
{
"jsonrpc": "2.0",
"id": 11,
"method": "tools/call",
"params": {
"name": "extract_links",
"arguments": {
"url": "https://example.com/blog",
"filter": "internal"
}
}
}
注意:链接被分类为内部(同一域名)或外部;资源链接(如图片、PDF等)可以通过resources过滤。
download_file| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
url | 字符串 | ✅(无默认值) | 文件的直接URL。 |
filename | 字符串 | ❌(自动生成) | 所需的文件名;将被净化并强制进入缓存目录。 |
示例
{
"jsonrpc": "2.0",
"id": 12,
"method": "tools/call",
"params": {
"name": "download_file",
"arguments": {
"url": "https://example.com/files/report.pdf",
"filename": "report_latest.pdf"
}
}
}
注意:服务器强制执行100 MB的下载限制,验证URL是否属于被阻止的域/扩展名,并返回工作目录内的相对路径以供跨代理访问。
get_page_metadata| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
url | 字符串 | ✅(无默认值) | 要检查的页面的URL。 |
示例
{
"jsonrpc": "2.0",
"id": 13,
"method": "tools/call",
"params": {
"name": "get_page_metadata",
"arguments": { "url": "https://example.com/product/42" }
}
}
注意:该工具返回一个格式化的文本块,其中包含标题、描述、关键词、Open Graph属性和Twitter Card字段。
check_url| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
url | 字符串 | ✅(无默认值) | 要探测的URL。 |
示例
{
"jsonrpc": "2.0",
"id": 14,
"method": "tools/call",
"params": {
"name": "check_url",
"arguments": { "url": "https://example.com/resource.zip" }
}
}
注意:响应包括重定向后的最终URL、简洁的状态总结(✅ OK 或 ⚠️ Error)以及选定的HTTP头信息,如Content-Type和Content-Length。
<script>、<iframe>、事件处理器和其他危险元素。© 2025 Undici77 – 保留所有权利。