A Model Context Protocol server that gives AI assistants access to the internet. Search, fetch pages, download files. No API key required to get started.
What it does • Getting Started • Tools • Providers • Security • Limitations • Contributing
______________________________________________________________________
🎯 它能做什么?
此MCP为您的AI助手提供真正的互联网接入:
- 搜索 使用DuckDuckGo(无设置)、Tavily或Serper(带API密钥)的网络
- 获取 任何URL,并获取清晰可读的文本内容
- 下载 将文件从网络直接传输到磁盘
- 限制 每个用户可以根据他们的JWT声明访问哪些URL
______________________________________________________________________
🚀 入门
1.创建配置文件
在运行任何东西之前,创建一个 config.yaml传输部分定义了MCP服务器的暴露方式。
工作室 --最简单的选择,没有网络暴露。非常适合本地使用Claude Desktop或Cursor等工具。
server:
name: "browse-mcp"
version: "0.1.0"
transport:
type: "stdio"
web:
default_provider: "duckduckgo"
download_dir: "/data" # optional — restricts web_download to this directory超文本传输协议 --通过网络公开服务器。多用户设置、生产部署或需要JWT身份验证和URL策略时需要。
server:
name: "browse-mcp"
version: "0.1.0"
transport:
type: "http"
http:
host: ":8080"
middleware:
access_logs:
redacted_headers: ["Authorization"]
jwt:
enabled: true
jwks_uri: "https://your-idp.com/.well-known/jwks.json"
cache_interval: 5m
web:
default_provider: "tavily"
providers:
tavily:
api_key: "$TAVILY_API_KEY"看 docs/config-http.yaml 对于包括政策在内的完整示例。
2.运行它
二进制 --更低的开销,直接访问主机文件系统(如果您使用 web_download 在本地保存文件)。
go mod tidy
make build
./bin/browse-mcp -config config.yaml码头工人 --完全隔离,没有主机依赖关系。除非您挂载卷,否则下载的文件将进入容器。
docker build -t browse-mcp .
docker run \
-v $(pwd)/config.yaml:/config/config.yaml \
-v $(pwd)/downloads:/downloads \
browse-mcp______________________________________________________________________
🛠️ 可用工具
| 工具 | 它做什么 |
|---|---|
web_search | 搜索网络——返回每个结果的标题、URL和代码段 |
web_fetch | 获取一个URL并返回清晰可读的文本(去除HTML噪声) |
web_download | 从URL下载文件并将其保存到磁盘 |
推荐流量
1. web_search → find relevant URLs
2. web_fetch → read the full content of the best results
3. web_download → save files you need to keep______________________________________________________________________
🔍 搜索提供程序
| 提供商 | API密钥 | 注释 |
|---|---|---|
duckduckgo | 否 | 默认值。开箱即用。可能偶尔会有利率限制。 |
tavily | 是的(tavily.com) | 专为AI打造。每月免费1000学分。 |
serper | 是的(瑟珀·德夫) | 废弃谷歌。付费,基于信用。 |
通过传递按请求切换提供程序 provider 到 web_search,或在配置中设置默认值。
______________________________________________________________________
🔐 安全(HTTP模式)
在HTTP模式下运行时,Browse MCP支持完整的安全堆栈:
JWT验证
根据JWKS端点验证传入的JWT。JWKS从以下位置获取 jwks_uri 并缓存。令牌总是从 Authorization: Bearer 头球
allow_conditions 是针对JWT有效载荷评估的CEL表达式。一切都必须返回true。将这些用于粗粒度检查,如验证发卡机构。每个工具和每个URL的细粒度限制在下单独配置 policies.
middleware:
jwt:
enabled: true
jwks_uri: "https://your-idp.com/.well-known/jwks.json"
cache_interval: 5m
allow_conditions:
- expression: 'payload.iss == "https://your-idp.com"'访问日志
使用方法、URL、持续时间和标头记录每个请求。敏感标头可以被编辑或完全排除。
middleware:
access_logs:
excluded_headers: ["X-Internal-Token"]
redacted_headers: ["Authorization"]工具政策
控制每个组或索赔可以调用哪些工具。使用根据JWT有效载荷计算的CEL表达式。
policies:
tools:
- expression: 'payload.groups.exists(g, g == "admins")'
allowed_tools: ["*"]
- expression: 'payload.scope.contains("web:read")'
allowed_tools: ["web_search", "web_fetch"]支持的模式:完全匹配("web_fetch"),通配符("*"),前缀("web_*").
URL策略
控制每个组可以通过访问哪些域 web_fetch 和 web_download.CEL表达式针对JWT有效载荷,域分配表支持通配符子域。
policies:
web:
- expression: 'payload.groups.exists(g, g == "admins")'
allowed_domains: ["*"]
- expression: 'payload.groups.exists(g, g == "developers")'
allowed_domains:
- "*.github.com"
- "docs.k8s.io"
- "pkg.go.dev"
- expression: 'payload.scope.contains("web:restricted")'
allowed_domains:
- "internal.company.com"
- "*.internal.company.com"web_search URL不受设计限制——结果是片段,不获取任何内容。限制在获取/下载时适用。
______________________________________________________________________
⚠️ 局限性
提取大小 --fetcher每次请求读取高达5MB的数据。大于50KB的页面将保存到临时文件中,而不是内联返回。
JavaScript --fetcher不运行JS。完全在客户端呈现的页面将返回很少或没有内容。
鸭鸭搜 --无需钥匙即可使用,但在频繁使用时可能会受到费率限制。切换到Tavily进行生产。
协议 --仅支持HTTP和HTTPS。
下载目录 --默认情况下 web_download 接受任何路径。集 web.download_dir 将下载限制到特定目录。路径遍历尝试被拒绝。
______________________________________________________________________
🤝 贡献
人类 --问题、公关和爱情都是受欢迎的。
AI代理 --阅读 代理商.md 在触摸任何东西之前。
______________________________________________________________________
📄 许可证
Apache 2.0
