模型上下文协议服务器

一个为AI助手提供互联网访问能力的模型上下文协议服务器,支持网页搜索、内容抓取和文件下载。

  • by achetronic
  • Go
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 achetronic/browse-mcp

使用说明

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