使用MCP Python SDK构建的最小化容器化MCP服务器基础。
BaseMcpServer 提供了一个标准化的Docker基础镜像,用于构建模型上下文协议(MCP)服务器。它具有以下特点:
此镜像提供了MCP服务器所需的所有常见依赖项和配置,使得衍生项目可以专注于实现其特定工具和资源。
无需Docker即可进行本地开发,每个MCP服务器都包含设置脚本,用于创建和管理具有必要依赖项的Python虚拟环境。
每个MCP服务器都包含两个shell脚本,用于轻松设置和执行:
setup.sh 脚本会创建一个虚拟环境并安装所有依赖项:
# 导航到所需的MCP服务器目录
cd example/
# 运行设置脚本
./setup.sh
这将:
.venv 目录requirements.txt 安装所有必需的依赖项run.sh 脚本会激活虚拟环境并运行MCP服务器:
# 使用SSE协议启动(适用于Claude/Cline集成)
./run.sh sse
# 或者使用stdio协议启动(适用于直接的stdin/stdout通信)
./run.sh stdio
如果脚本在您的系统上无法正常工作,您可以手动设置环境:
# 导航到所需的MCP服务器目录
cd example/
# 创建虚拟环境
python3.11 -m venv .venv
# 激活虚拟环境
source .venv/bin/activate # 在Windows上:.venv\Scripts\activate
# 安装依赖项
pip install -r requirements.txt
# 设置PYTHONPATH并运行服务器
export PYTHONPATH="$PWD/src:$PYTHONPATH" # 在Windows上:set PYTHONPATH=%CD%\src;%PYTHONPATH%
cd src
python main.py sse # 或:python main.py stdio
虚拟环境方法:
基于此模板创建自定义MCP服务器时,请遵循以下最佳实践以避免常见问题:
使用正确的端口:基础镜像暴露端口 7501。始终将您的配置与此端口对齐:
.env 文件中,设置 PORT=7501docker run -p EXTERNAL_PORT:7501"url": "http://localhost:EXTERNAL_PORT/sse"一致的端口使用:保持端口号的一致性。如果您选择外部端口7777:
docker run -p 7777:7501"url": "http://localhost:7777/sse"端口冲突:如果您遇到连接错误,请检查端口冲突:lsof -i :PORT_NUMBER
挂载与复制:对于开发,您可以将 .env 文件复制到容器中:
COPY ./.env ./.env
对于生产,运行时挂载它:
docker run -p 7777:7501 --env-file .env your-image
健壮的配置加载:实现健壮的环境变量加载,包括日志记录和回退:
# 记录加载的配置值
logger.info(f"JIRA_URL: {settings.JIRA_URL}")
logger.info(f"使用的端口: {settings.port}")
验证环境:明确验证必需的环境变量,并提供清晰的错误消息
该项目现在包括一个 mcp-manager 工具,用于轻松安装和管理MCP服务器。此工具简化了设置、配置和运行MCP服务器的过程。
# 安装pipx
brew install pipx
# 直接从仓库安装
pipx install git+https://github.com/dawsonlp/BaseMcpServer.git#subdirectory=utils/mcp_manager
# 安装本地MCP服务器
mcp-manager install local example-server --source ./example
# 从Git仓库安装
mcp-manager install git jira-server --repo https://github.com/example/jira-mcp-server.git
# 列出已安装的服务器
mcp-manager list
# 配置VS Code集成
mcp-manager configure vscode
# 手动运行服务器(如有需要)
mcp-manager run server-name --transport stdio
要将您的MCP服务器连接到Claude Desktop或VS Code中的Cline:
对于使用mcp-manager安装的本地服务器:
对于手动运行的服务器:
./run.sh sse # 用于本地开发,使用HTTP+SSE传输
或
docker run -p 7501:7501 your-image # 用于Docker
对于VS Code中的Cline:
使用mcp-manager,您只需运行:
mcp-manager configure vscode
或手动编辑设置文件:
路径:~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json
示例配置:
{
"mcpServers": {
"example-mcp-server": {
"url": "http://localhost:7501/sse",
"apiKey": "example_key",
"disabled": false,
"autoApprove": []
},
"directlyruntest": {
"command": "/home/user/.mcp_servers/bin/directlyruntest.sh",
"disabled": false,
"autoApprove": []
}
}
}
注意事项:
对于Claude Desktop,转到: 设置 → 高级 → MCP服务器 → 添加MCP服务器
输入:
在更改MCP服务器配置后,完全重启VS Code
需要时重启VS Code:在安装或更新MCP服务器时,必须完全重启VS Code:
自动服务器启动:对于使用mcp-manager安装的服务器:
mcp-manager run清除连接错误:当您看到Claude中的“未连接”错误时,通常表示:
添加详细的日志记录:增强日志记录,特别是配置和初始化:
logger.info(f"正在{settings.host}:{settings.port}启动MCP服务器")
logger.info(f"是否使用API密钥:{'是' if settings.api_key else '否'}")
检查服务器日志:始终检查Docker容器日志:docker logs CONTAINER_ID
验证Docker容器:使用 docker ps 确保您的容器正在运行并且端口映射正确
更多详细的调试笔记,请参阅项目根目录下的 debugging_notes.md。
./build.sh base-mcp-server latest 7501 <your-docker-username>
参数:
base-mcp-server:镜像名称(默认)latest:标签(默认)7501:要公开的端口(默认)<your-docker-username>:必需 —— 您的Docker Hub用户名这将:
在您的Dockerfile中:
# 定义Docker Hub用户名的构建参数
ARG DOCKER_USERNAME
# 使用Docker Hub上的基础MCP服务器镜像
FROM docker.io/${DOCKER_USERNAME}/base-mcp-server:latest
# 复制您的应用程序代码
COPY ./src ./src
# 设置PYTHONPATH以包含src作为源根
ENV PYTHONPATH="/app/src:${PYTHONPATH}"
# 设置工作目录为src
WORKDIR /app/src
# 命令以运行您的MCP服务器,使用sse传输
CMD ["python", "main", "sse"]
BaseMcpServer 现在支持HTTP+SSE和stdio协议:
HTTP+SSE(服务器发送事件)是MCP协议支持的标准传输之一:
HTTP+SSE旨在用于联网环境,使其非常适合:
stdio传输使用标准输入/输出流进行通信:
此传输主要用于:
此基础镜像使用:
实现由MCP Python SDK提供:
.sse_app() 方法用于HTTP+SSErun("stdio") 模式扩展此基础镜像时,您的MCP服务器会自动通过HTTP+SSE提供服务。对于更高级的场景,您需要将其与现有的Web服务集成,可以通过挂载MCP服务器到现有的ASGI应用来实现:
from starlette.applications import Starlette
from starlette.routing import Mount, Host
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("My App")
# 将MCP服务器挂载到现有的ASGI应用
app = Starlette(
routes=[
Mount('/mcp', app=mcp.sse_app()),
]
)
# 或将其挂载为子域
app.router.routes.append(Host('mcp.example.com', app=mcp.sse_app()))
在生产环境中使用HTTP+SSE时:
镜像直接使用MCP Python SDK,抽象层极小:
基础镜像支持通过环境变量进行配置,这些环境变量可以通过多种方式传递给衍生镜像:
HOST:绑定的接口(默认:0.0.0.0)PORT:监听的端口(默认:7501)API_KEY:身份验证所需(必须提供)SERVER_NAME:您的MCP服务器的唯一标识符docker run -p 7501:7501 \
-e API_KEY=your_api_key \
-e SERVER_NAME=your-mcp-server \
yourdockerusername/your-mcp-server:latest
创建一个包含您的配置的 .env 文件:
API_KEY=your_api_key
SERVER_NAME=your-mcp-server
HOST=0.0.0.0
PORT=7501
然后运行:
docker run -p 7501:7501 --env-file .env yourdockerusername/your-mcp-server:latest
对于使用Docker Swarm的生产部署:
echo "your_api_key" | docker secret create api_key -
echo "your_server_name" | docker secret create server_name -
docker service create \
--name your-mcp-server \
--secret api_key \
--secret server_name \
--publish 7501:7501 \
yourdockerusername/your-mcp-server:latest
对于开发或测试目的,您可以将配置直接构建到衍生镜像中:
FROM docker.io/dawsonlp/base-mcp-server:latest
# 配置环境变量(仅限非敏感信息!)
ENV HOST=0.0.0.0
ENV PORT=7501
ENV SERVER_NAME=example-mcp-server
# 复制应用程序代码
COPY ./src ./src
CMD ["python", "main", "sse"]
此仓库包含:
docker/Dockerfile:基础镜像的多阶段Dockerfilebuild.sh:具有Docker Hub集成的构建脚本requirements-base.txt:基本Python依赖项