mcp-remote将仅支持本地(stdio)服务器的MCP客户端连接到远程MCP服务器,并支持身份验证:
注意:这是一个工作的概念证明,但应被视为实验性。
目前,大多数野外的MCP服务器都是本地安装的,使用stdio传输。这有一些好处:客户端和服务器可以隐式信任彼此,因为用户已经授予它们运行的权限。添加如API密钥之类的秘密可以通过环境变量完成,并且永远不会离开您的机器。基于npx和uvx构建允许用户避免显式的安装步骤。
但是,大多数可以移动到网络上的软件确实都移动到了网络上:当您可以通过一次部署更新所有用户的软件时,查找和修复错误及迭代新功能要容易得多。
随着最新的MCP 授权规范,我们现在有了一个安全的方法来与世界分享我们的MCP服务器,而无需在用户的笔记本电脑上运行代码。至少,在所有的流行MCP客户端都支持它之前是这样。大多数客户端只支持stdio,那些确实支持HTTP+SSE的客户端还不支持所需的OAuth流程。
这就是mcp-remote的作用所在。一旦您选择的MCP客户端支持远程授权服务器,就可以移除它。在此之前,您可以使用这一行代码并根据您想要的MCP客户端进行配置!
所有最流行的MCP客户端(Claude Desktop、Cursor 和 Windsurf)使用以下配置格式:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse"
]
}
}
}
为了绕过认证或向所有请求到远程服务器的请求发出自定义头部,请传递--header CLI参数:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--header",
"Authorization: Bearer ${AUTH_TOKEN}"
],
"env": {
"AUTH_TOKEN": "..."
}
},
}
}
注意: Cursor 和 Claude Desktop(Windows)有一个bug,即在调用npx时,args中的空格不会被转义,这会导致这些值被破坏。您可以使用以下方式解决:
{
// 配置的其余部分...
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--header",
"Authorization:${AUTH_HEADER}" // 注意':'周围没有空格
],
"env": {
"AUTH_HEADER": "Bearer <auth-token>" // 环境变量中的空格是可以接受的
}
},
npx产生错误,请考虑将-y作为第一个参数添加以自动接受mcp-remote包的安装。 "command": "npx",
"args": [
"-y"
"mcp-remote",
"https://remote.mcp.server/sse"
]
npx始终检查mcp-remote的最新版本,请添加@latest标志: "args": [
"mcp-remote@latest",
"https://remote.mcp.server/sse"
]
mcp-remote监听OAuth重定向的端口(默认为3334),请在服务器URL之后添加额外的参数。请注意,无论指定哪个端口,如果该端口不可用,则会随机选择一个可用端口。 "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"9696"
]
mcp-remote注册为OAuth回调URL的主机(默认为localhost),请添加--host标志。 "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--host",
"127.0.0.1"
]
--allow-http标志。请注意:这应该仅在无法拦截流量的安全私有网络中使用。 "args": [
"mcp-remote",
"http://internal-service.vpc/sse",
"--allow-http"
]
--debug标志。这将在~/.mcp-auth/{server_hash}_debug.log中写入详细的日志,包括时间戳和关于认证过程、连接和令牌刷新的详细信息。 "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--debug"
]
mcp-remote启用出站HTTP(S)代理,请添加--enable-proxy标志。启用后,mcp-remote将使用常见的环境变量设置(例如HTTP_PROXY、HTTPS_PROXY和NO_PROXY)中的代理设置。 "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--enable-proxy"
],
"env": {
"HTTPS_PROXY": "http://127.0.0.1:3128",
"NO_PROXY": "localhost,127.0.0.1"
}
--ignore-tool标志。这将过滤掉匹配指定模式的工具,从tools/list响应中排除,并阻止tools/call请求。支持使用*的通配符模式。 "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--ignore-tool",
"delete*",
"--ignore-tool",
"remove*"
]
您可以指定多个--ignore-tool标志以忽略不同的模式。示例:
delete* - 忽略所有以“delete”开头的工具(例如,deleteTask,deleteUser)*account - 忽略所有以“account”结尾的工具(例如,getAccount,updateAccount)exactTool - 仅忽略名为“exactTool”的工具30秒),请添加--auth-timeout标志并指定秒数。这对于服务器端认证过程耗时较长的情况很有用。 "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--auth-timeout",
"60"
]
MCP Remote支持在连接到MCP服务器时使用不同的传输策略。这允许您控制是否使用Server-Sent Events (SSE) 或 HTTP传输,以及尝试它们的顺序。
通过--transport标志指定传输策略:
npx mcp-remote https://example.remote/server --transport sse-only
可用策略:
http-first(默认):首先尝试HTTP传输,如果HTTP返回404错误则回退到SSEsse-first:首先尝试SSE传输,如果SSE返回405错误则回退到HTTPhttp-only:仅使用HTTP传输,如果服务器不支持则失败sse-only:仅使用SSE传输,如果服务器不支持则失败MCP Remote支持提供静态OAuth客户端元数据而不是使用mcp-remote默认值。 这在连接到期望特定客户端/软件ID或范围的OAuth服务器时非常有用。
通过--static-oauth-client-metadata标志提供客户端元数据,可以是JSON字符串或以@前缀的文件路径:
npx mcp-remote https://example.remote/server --static-oauth-client-metadata '{ "scope": "space separated scopes" }'
# 使用node读取文件,所以如果您不确定当前工作目录是什么,最好使用绝对路径
npx mcp-remote https://example.remote/server --static-oauth-client-metadata '@/Users/username/Library/Application Support/Claude/oauth_client_metadata.json'
根据规范,服务器鼓励但不要求支持OAuth动态客户端注册。
对于这些服务器,MCP Remote支持提供静态OAuth客户端信息。 这在连接到需要预注册客户端的OAuth服务器时非常有用。
通过--static-oauth-client-info标志提供客户端元数据,可以是JSON字符串或以@前缀的文件路径:
export MCP_REMOTE_CLIENT_ID=xxx
export MCP_REMOTE_CLIENT_SECRET=yyy
npx mcp-remote https://example.remote/server --static-oauth-client-info "{ \"client_id\": \"$MCP_REMOTE_CLIENT_ID\", \"client_secret\": \"$MCP_REMOTE_CLIENT_SECRET\" }"
# 使用node读取文件,所以如果您不确定当前工作目录是什么,最好使用绝对路径
npx mcp-remote https://example.remote/server --static-oauth-client-info '@/Users/username/Library/Application Support/Claude/oauth_client_info.json'
要在Claude Desktop中添加MCP服务器,您需要编辑位于以下位置的配置文件:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json如果尚未存在,您可能需要在设置>开发者中启用它。
重启Claude Desktop以应用配置文件中的更改。 重启后,您应在输入框右下角看到锤子图标。
官方文档。配置文件位于~/.cursor/mcp.json。
从版本0.48.0开始,Cursor直接支持未认证的SSE服务器。如果您的MCP服务器使用官方的MCP OAuth认证协议,您仍然需要添加一个**"command"**服务器并调用mcp-remote。
官方文档。配置文件位于~/.codeium/windsurf/mcp_config.json。
有关构建和部署远程MCP服务器的说明,包括作为有效的OAuth客户端,参见以下资源:
特别是:
agents框架定义一个McpAgent有关测试这些服务器的更多信息,还请参阅:
知道更多您想分享的资源吗?请将其添加到此Readme并发送PR!
~/.mcp-auth目录mcp-remote将所有凭证信息存储在~/.mcp-auth(或MCP_REMOTE_CONFIG_DIR指向的位置)。如果您遇到持续问题,可以尝试运行:
rm -rf ~/.mcp-auth
然后重新启动您的MCP客户端。
确保您已安装的Node版本是18或更高版本。即使您在其他地方安装了较新的版本,Claude Desktop也会使用系统版本的Node。
修改claude_desktop_config.json时,完全重启Claude可能会有所帮助。
如果您处于VPN后面,可能会遇到问题,您可以尝试设置NODE_EXTRA_CA_CERTS环境变量指向CA证书文件。如果使用claude_desktop_config.json,这可能看起来像这样:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse"
],
"env": {
"NODE_EXTRA_CA_CERTS": "{your CA certificate file path}.pem"
}
}
}
}
tail -n 20 -F ~/Library/Logs/Claude/mcp*.logtail -n 20 -f "C:\Users\YourUsername\AppData\Local\Claude\Logs\mcp.log"Get-Content "C:\Users\YourUsername\AppData\Local\Claude\Logs\mcp.log" -Wait -Tail 20对于复杂问题的故障排除,尤其是与令牌刷新或认证问题相关的问题,使用--debug标志:
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--debug"
]
这会在~/.mcp-auth/{server_hash}_debug.log中创建详细的日志,带有时间戳和关于连接和认证过程每一步的完整信息。当您发现令牌刷新、笔记本电脑睡眠/恢复问题或认证问题时,提供这些日志寻求支持。
如果您遇到以下错误,由/callback URL返回:
认证错误
令牌交换失败:HTTP 400
您可以运行rm -rf ~/.mcp-auth来清除任何本地存储的状态和令牌。
在命令行上运行以下内容(不是从MCP服务器):
npx -p mcp-remote@latest mcp-remote-client https://remote.mcp.server/sse
这将执行整个授权流程并尝试列出远程URL上的工具和资源。在运行rm -rf ~/.mcp-auth后尝试此操作,看看过期的凭据是否是问题所在,否则希望这些问题在这些日志中比在您的MCP客户端中更明显。