MCP server自定义路由与Tools查询工具

一、背景
有时候,当mcp server部署在mcp host所在的机器是应用服务器上时,对sse服务端口又不允许开放,只能借助应用服务器的nginx转发时,会发现,mcp server默认的路由会有部分冲突,此时就可以借助nginx的配置实现路由转发,mcp server的源码中,虽然制定了sse、messages、mcp、root的路径配置,但是,只有root+messages的配置是起作用的,此时,当mcp server想要满足一定的服务前缀实现时,就会产生部分问题,该文档记录了简单的nginx配置转发和mcp server的路径配置,不多bb,直接上源代码。
二、目的
外部通过访问nginx服务所在的域名,加上该服务的固定前缀,实现nginx转发,通过sse流建立后,能够完成后续正常的数据请求,流程图如下:
通过访问: www.domain.com/api/prefix/sse 建立长链接通道,在nginx处转化为mcp host的/see接口(FastMCP Settings的sse_path,经过测试)
修改无效,所以通过nginx rewrite进行转发处理,sse建立链接后,会返回消息的uri地址(通过curl www.domain.com/api/prefix/sse 查询),测试案例
如下:
也就是后续地址会通过data表示的地址进行数据交互,所以,修改mcp server的服务配置信息,进行地址修改,默认配置为:/messages/。修改手段有两种:
方案一:修改message_path
方案二:修改root
和message_path
两者原理一致,最后都是通过mcp server的 _normalize_path
方法获取交互数据的路径,由mcp客户端发起POST请求实现。
三、代码实操
- MCP server端
- mcp server config yaml
1
2
3
4
5
6# 增加messages路径配置
# .env
Host=0.0.0.0
Port=9116
MessagePath="/api/prefix/sse/messages/" # rewrite message_path
Debug=True - mcp server config Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# mcp server settings
from pydantic_settings import BaseSettings
from dotenv import load_dotenv
load_dotenv()
class Settings(BaseSettings):
Host: str
Port: int
Debug: bool
MessagePath: str
class Config:
env_file = ".env"
env_file_encoding = "utf-8" - mcp server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18from mcp.server.fastmcp import FastMCP
from .tools import *
from .config import Settings
def create_mcp():
mcp = FastMCP(
name="test",
description="test",
host=settings.Host,
port=settings.Port,
message_path=settings.MessagePath,
)
# register tools or functions
mcp.add_tool(weather_tools)
return mcp
- mcp server config yaml
- Nginx配置 该配置就是实现:/api/prefix/sse -> mcp-host:port/sse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34location ~ ^/api/prefix/sse$ {
rewrite ^/api/prefix/sse$ /sse break;
proxy_pass MCP-Host:Port;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header tenant_id $http_tenant_id;
proxy_set_header user_id $http_user_id;
proxy_pass_request_headers on;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
add_header Cache-Control no-cache;
add_header Content-Type text/event-stream;
chunked_transfer_encoding off;
}
location ~ ^/api/prefix/sse/messages/?$ {
proxy_pass MCP-Host:Port;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass_request_headers on;
proxy_method POST;
}
数据接口:/api/prefix/sse/messages -> mcp-host:port/api/prefix/sse/messages
四、MCP Tools List
1 | # mcp_server_tools.py |
环境依赖:
1 | annotated-types==0.7.0 |
安装依赖:
pip install -r requirements.txt
使用方法:
python mcp_sse_tool_inspector.py –host=”http://127.0.0.1:9117/sse" –tool=”say_hello”
效果如下: