浏览器代理服务

一个基于Clojure的MCP服务器,为LLM提供通过w3m和lynx浏览器访问网页文本内容的功能,适用于研究、文档阅读等需要获取实时网页内容的场景。

  • by tobiasosborne
  • Clojure
  • 本地部署
  • 更新于
在 GitHub 查看 tobiasosborne/mcp-browser

使用说明

MCP浏览器服务器——clojure中的代理编码实验

这是什么东西?

这个项目是一个用clojure编写的MCP服务器,它通过MCP向LLM公开了一些工具。特别是,公开的工具允许代理通过基于文本的浏览器w3m和lynx访问URL。

将其视为赋予你的法学硕士以文本形式实际浏览网络的能力——非常适合研究、文档阅读或任何需要人工智能获取当前网络内容的任务。

警告!!!

这是通过LLM使用代理编程100%编码的vibe。我以前从未用clojure编写过项目,我几乎不理解这种语言和MCP协议。

我不应该得到这东西的钥匙;)

使用风险自负!你真的被警告了!

也就是说,它有38个测试,264个断言,全部通过。所以它是 可能 好的。可能。

特性

  • 浏览网页 -获取任何URL作为纯文本(无JavaScript,无广告,只有内容)
  • 会话管理 -创建持久浏览会话以浏览多个页面
  • 双浏览器支持 -使用w3m或lynx(由您选择,我们不评判)
  • 跨平台 -适用于Linux、macOS和Windows(通过WSL2)
  • 模拟模式 -即使未安装浏览器,也能运行测试
  • 综合录井 -看看LLM到底想要什么
  • 符合MCP标准 -适用于Claude Desktop、gptel或任何MCP客户端

可用工具

1. browse_page

获取一个网页并返回其文本内容。快速简单。

参数:

  • url (必填):要获取的URL
  • browser (可选):“w3m”或“lynx”(默认值:“w3 m”)

例子:

{
  "name": "browse_page",
  "arguments": {
    "url": "https://example.com",
    "browser": "w3m"
  }
}

2. create_session

启动浏览会话以进行多页导航。

参数:

  • browser (可选):“w3m”或“lynx”(默认值:“w3 m”)

退货: 用于其他会话命令的会话ID

3. navigate

导航到现有会话中的URL。

参数:

  • session_id (必填):create_Session中的会话ID
  • url (必填):要导航到的URL

4. get_session_info

获取浏览会话的详细信息(历史记录、正常运行时间、当前页面等)

参数:

  • session_id (必填):要查询的会话ID

5. close_session

关闭会话并清理资源。

参数:

  • session_id (必填):要关闭的会话ID

安装

先决条件

  1. 莱宁根 (Clojure构建工具)

    # Linux/WSL2
    curl https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein > ~/bin/lein
    chmod +x ~/bin/lein
    lein
    
    # macOS
    brew install leiningen
    
  2. w3m和/或猞猁 (基于文本的浏览器)

    # Ubuntu/Debian/WSL2
    sudo apt install w3m lynx
    
    # macOS
    brew install w3m lynx
    
    # Arch Linux (because of course you'd mention that)
    sudo pacman -S w3m lynx
    
  3. Java (版本8或更高版本)

    # Ubuntu/Debian
    sudo apt install openjdk-11-jdk
    
    # macOS (probably already installed)
    brew install openjdk@11
    

设置

# Clone or download this repo
cd mcp-browser

# Install dependencies
lein deps

# Run tests (because we're responsible developers... sometimes)
lein test

# Should see: "Ran 38 tests containing 264 assertions. 0 failures, 0 errors."

用法

运行服务器

服务器使用JSON-RPC 2.0通过stdin/stdout进行通信:

# Start the server
lein run

服务器将在stdin上等待JSON-RPC消息,并在stdout上响应。

手动测试

创建测试文件 test.json:

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}

然后:

cat test.json | lein run

您应该得到一个具有服务器功能的JSON响应。

与Claude Desktop一起使用

将此添加到您的Claude Desktop MCP设置中(~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):

{
  "mcpServers": {
    "browser": {
      "command": "lein",
      "args": ["run"],
      "cwd": "/path/to/mcp-browser"
    }
  }
}

重新启动Claude Desktop,浏览器工具应该会出现!

在Emacs中使用gptel

现在你只能靠自己了,但毫无疑问,我会带着一个氛围编码教程回来。我在emacs中使用gptel和mcp来使用该工具。我把它连接到双子座,它似乎按预期工作。

(翻译:我能用,但记不清具体是怎么用的。稍后会记录。也许吧。可能不会。)

与任何MCP客户端一起使用

由于这是一个标准的MCP服务器,它可以与任何支持该协议的客户端一起使用:

# Generic MCP client example
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | lein run

服务器实现:

  • initialize -MCP握手
  • tools/list -列出可用工具
  • tools/call -执行工具
  • ping -健康检查

与LLM的对话示例

人类: 你能查一下example.com上有什么吗?

克劳德(通过MCP): 让我帮你浏览一下那个页面。 [调用browse_page工具]

结果:

Example Domain

This domain is for use in documentation examples without needing permission.
Avoid use in operations.

Learn more

克劳德: 该页面显示example.com是为文档保留的域。..

项目结构

mcp-browser/
+-- project.clj                          # Leiningen project config
+-- README.md                            # This file!
+-- src/
¦   +-- mcp_browser/
¦       +-- core.clj                     # Main entry point
¦       +-- browser_management.clj       # Browser process management
¦       +-- protocol.clj                 # MCP/JSON-RPC protocol
¦       +-- tools.clj                    # Tool implementations
+-- test/
    +-- mcp_browser/
        +-- browser_management_test.clj  # Browser tests
        +-- protocol_test.clj            # Protocol tests
        +-- tools_test.clj               # Tool tests
        +-- integration_test.clj         # End-to-end tests

建筑

第1层:浏览器管理

  • 生成和管理w3m/lynx流程
  • 使用历史记录跟踪浏览会话
  • 处理流程生命周期和清理
  • 无浏览器测试的模拟模式

第二层:MCP协议

  • JSON-RPC 2.0消息处理
  • 请求路由和验证
  • 错误处理和响应
  • 工具注册和发现

第3层:工具

  • 实现5个浏览工具
  • 在MCP和浏览器层之间进行转换
  • 格式化LLM的响应

发展

运行测试

# Run all tests
lein test

# Run specific test namespace
lein test mcp-browser.protocol-test

# Run with auto-reload (requires lein-test-refresh)
lein test-refresh

REPL开发

# Start REPL
lein repl

# Load and test functions
(require '[mcp-browser.browser-management :as bm])
(bm/fetch-url :w3m "https://example.com")

# Create a session
(def session-id (bm/create-session :w3m))
(bm/navigate-session session-id "https://example.com")
(bm/get-session-stats session-id)
(bm/cleanup-session session-id)

建造Uberjar

# Create standalone JAR
lein uberjar

# Run it
java -jar target/uberjar/mcp-browser-0.1.0-SNAPSHOT-standalone.jar

故障排除

“无法运行程序'w3m'”

安装w3m或lynx。或者两者都有。越多越好。

“未找到会话”

会议是短暂的。如果重新启动服务器,所有会话都将丢失。这是设计(或懒惰编码,由您决定)。

测试失败,显示“进程未激活”

您使用的是没有WSL2的Windows,或者未安装浏览器。如果浏览器不可用,测试会自动使用模拟模式。

“打开的文件太多”

关闭一些浏览器会话。或者增加你的ulimit。或者停止浏览这么多。

它不起作用了

  1. 检查是否安装了lein和Java
  2. 确保w3m或lynx从命令行工作
  3. 跑 lein test 验证一切正常
  4. 阅读日志(它们冗长是有原因的)
  5. 记住本README顶部的警告

已知限制

  • 不支持JavaScript -w3m和lynx不运行JavaScript(这是一个特性,而不是一个bug)
  • 无图像渲染 -这只是文本(再次强调,功能不是bug)
  • 会话不会持续 -重新启动服务器,丢失所有会话
  • 不支持身份验证 -尚无法登录网站
  • 速率限制 -未实施(请善待网站)
  • robots.txt -未经检查(我们就是这样的叛逆者)

为什么存在

因为有时你只想让你的LLM阅读网页,而不需要启动整个浏览器自动化框架。此外,通过其他LLM的积极提示来学习Clojure也是一种有趣的方式。

贡献

欢迎公关,但请记住:这一切都是氛围编码的。你的公关可能会被法学硕士审查。或者我,喝了三杯咖啡后。同样不可靠。

许可证

EPL-2.0(与Clojure相同)

致谢

  • Clojure社区,创造一种即使你不理解也能正常工作的语言
  • w3m和lynx开发人员,适用于只做一件事的浏览器
  • 对于MCP和克劳德(以及耐心地回答我可怕的问题)
  • 当我点头假装理解时,写了大部分代码的LLM

支持

如果出现问题,请提交问题。或者不起作用。或者起作用但不应该。或者如果你对为什么这是一个好主意有疑问。


记得: 这是100%的代理编码。如果它坏了,那就怪人工智能。如果它奏效了,我将获得全部荣誉。这就是它的工作原理,对吧?

与克劳德一起建造,用决心测试,用希望部署。