这是一个Chrome扩展程序,它在网页和本地MCP服务器之间建立WebSocket连接。这允许您与网页资源交互并从您的MCP服务器执行函数。
灵感来自 playcanvas/editor-mcp-server。

该项目由两个主要组件组成:
通过这种设置,您可以:
window.editor来控制编辑器。就像playcanvas/editor-mcp-server一样。git clone https://github.com/yourusername/chrome-extension-socket-mcp.git
cd chrome-extension-socket-mcp
npm install
运行以下命令以开发模式构建扩展:
npm run debug
chrome://extensions/extension文件夹import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { Client } from "../src/client";
// 定义WebSocket连接的端口
// 这个端口应与您的Chrome扩展程序中的WebSocket连接端口匹配
const port = 54319;
const client = new Client(port);
// 建立与Chrome扩展程序的连接
await client.connect();
// 创建一个新的MCP服务器实例,带有名称和版本
const server = new McpServer({
name: "Extension-Socket-Server",
version: "1.0.0",
});
// 注册一个工具,用于在浏览器中执行window.alert函数
// 这演示了如何从服务器与浏览器API交互
server.tool(
"alert", // 工具名称
"使用window.alert", // 工具描述
{ message: z.string() }, // 使用Zod定义的工具参数模式
async ({ message }) => { // 工具实现函数
// 调用扩展程序在浏览器上下文中执行alert
const response = await client.callToolExtension("alert", { message });
return response;
}
);
// 注册一个资源,用于获取浏览器的用户代理
// 这演示了如何从服务器访问浏览器属性
server.resource(
"userAgent", // 资源名称
"useragent://chrome", // 资源URI模板
async (uri) => { // 资源处理函数
// 从浏览器获取用户代理
const { content } = await client.callResourceExtension("navigator.userAgent");
// 返回格式化的资源
return {
contents: [
{
uri: uri.href,
text: content[0].text,
},
],
};
}
);
// 为MCP服务器设置传输层
// StdioServerTransport使用标准输入/输出进行通信
const transport = new StdioServerTransport();
await server.connect(transport);
// 优雅地处理应用程序终止
process.on("SIGINT", async () => {
console.log("接收到SIGINT信号"); // 当接收到SIGINT时记录日志
await client.dispose(); // 关闭WebSocket连接
process.exit(0); // 退出进程
});
扩展默认自动连接到ws://localhost:54319。您可以在extension/content.js中修改这一点。
扩展为服务器命令提供了两个主要入口点:
mcp:resource.* - 用于访问浏览器资源和属性mcp:tool.* - 用于在浏览器上下文中执行函数new Client(port) - 创建一个新的客户端实例,连接到指定的端口connect() - 连接到MCP服务器callToolExtension(toolName, params) - 在浏览器中调用工具callResourceExtension(resourceName, params) - 从浏览器获取资源dispose() - 关闭连接扩展使用类似于JSON-RPC的简单协议:
请求:
{
"id": "唯一请求ID",
"method": "mcp:resource.navigator.userAgent",
"params": {}
}
响应:
{
"id": "唯一请求ID",
"result": "Mozilla/5.0 ..."
}