项目结构说明
项目采用标准Python服务端结构,包含核心服务代码、Docker部署配置和环境变量文件。主要实现一个基于FastMCP的HTTP服务,支持工具化接口和系统命令调用。
mcp-http/
├── mymcp-http.py # FastMCP服务端主程序
├── Dockerfile # 容器化部署配置
└──.env # 环境变量配置
环境初始化
执行以下命令创建并激活虚拟环境,确保依赖隔离。安装的依赖包含FastMCP核心库、HTTP客户端和数据库驱动。
uv init mcp-http
cd mcp-http
uv venv
.venv\Scripts\activate
uv add mcp[cli] httpx requests fastapi uvicorn jinja2 python-dotenv openai
启动服务端
cd mcp-http
.venv\Scripts\activate
uv run mymcp-http.py
核心功能实现
mymcp-http.py 包含两个主要工具:
hello()工具验证服务连通性,演示从HTTP头获取环境变量ping()工具跨平台执行系统ping命令,自动适配Windows/Linux系统
服务启动后暴露5050端口,支持streamable-http传输模式:
mcp.run(transport="streamable-http") # HTTP流模式
mymcp-http.py 完整代码:
from mcp.server.fastmcp import FastMCP, Context
from starlette.requests import Request
from dotenv import load_dotenv
import logging
import platform # 用于识别操作系统类型
import subprocess # 用于执行外部命令
import os
# 加载 .env 文件中的环境变量
load_dotenv()
# 动态获取环境变量中的配置
api_url_base = os.getenv('API_URL_BASE')
# 设置日志级别为DEBUG,以便捕捉详细信息
logging.basicConfig(level=logging.DEBUG)
# 初始化 FastMCP 实例
mcp = FastMCP(
name="SimpleServer",
port=5050,
stateless_http=False,
json_response=False,
streamable_http_path="/mcp",
host="0.0.0.0"
)
# 测试联通
@mcp.tool()
def hello(ctx: Context) -> str:
"""
测试联通
返回:
hello world 字符串
"""
# 获取上下文中的 HTTP 请求
request: Request = ctx.request_context.request
# 优先从请求头获取 DEVOPS_API_URL
devops_api_url = request.headers.get("DEVOPS_API_URL")
authorization = request.headers.get("Authorization")
# 直接返回结果
return f"Hello world! DEVOPS_API_URL from header: {devops_api_url}! Authorization from header: {authorization}"
# 定义 ping 工具
@mcp.tool()
def ping(host: str) -> dict:
"""
使用系统的 ping 命令来检查指定主机是否可达。
参数:
host (str): 要 ping 的 IP 地址或主机名
返回:
dict: 包含 'reachable'(是否可达)和 'output'(命令输出)的字典
"""
# 根据不同的操作系统调整 ping 命令参数
param = '-n' if platform.system().lower() == 'windows' else '-c'
command = ['ping', param, '1', host]
try:
# 执行 ping 命令并捕获输出
output = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 判断是否成功到达目标主机
reachable = output.returncode == 0
return {
'reachable': reachable,
'output': output.stdout if reachable else output.stderr
}
except Exception as e:
return {
'reachable': False,
'output': str(e)
}
# 主程序入口
if __name__ == "__main__":
# 示例调用(仅用于测试)
print("START")
# 增加日志输出,确认服务启动信息
logging.info("Starting FastMCP service...")
# mcp.run(transport='stdio')
mcp.run(transport="streamable-http")
容器化部署
Dockerfile采用分阶段构建优化镜像层缓存:
- 基础镜像使用Python 3.12官方镜像
- 分层安装依赖项减少重复构建
- 最后复制代码保持缓存有效性
Dockerfile内容:
# 使用 Python 镜像作为基础镜像
FROM python:3.12-ubuntu20.04-latest
# 设置工作目录
WORKDIR /app
# 1. 配置私有 pip 源并升级 pip
RUN pip install --upgrade pip
# 2. 分步安装依赖(利用Docker缓存层)
# 先安装标准库依赖
RUN pip install httpx requests
# 再安装项目特定依赖
RUN pip install mcp[cli]
# 3. 最后复制代码(避免因代码变更导致缓存失效)
COPY . .
# 4. 清理和验证
RUN rm -rf .venv && \
pip check
# 暴露 FastMCP 服务端口
EXPOSE 5050
# 启动命令(使用 python 直接运行你的入口文件)
CMD ["python", "mymcp-http.py"]
构建并运行容器:
docker build -t mcp-http .
docker run -d -p 5050:5050 --name mcp-http --env-file .env mcp-http
配置管理
.env 文件定义服务端基础API地址:
API_URL_BASE=http://10.xx.xx.xx
mcp.json 配置客户端连接参数,包含认证头和API端点:
{
"servers": {
"http-server": {
"url": "http://127.0.0.1:5050/mcp/",
"headers": {
"DEVOPS_API_URL": "http://10.xx.xx.xx",
"Authorization": "Bear xxxxx"
}
}
}
}
服务验证
测试服务可用性:
- 直接调用hello工具验证基础功能
- 通过ping工具检查网络连通性
- 检查日志输出确认服务状态
结果验证

关键设计要点
- 环境变量通过
python-dotenv动态加载,优先级:请求头 > 环境变量 - 跨平台兼容性处理体现在ping工具的系统命令适配
- 无状态HTTP服务设计支持横向扩展
- 容器镜像构建优化依赖安装顺序减少层体积
MCP 框架中的 Context 核心功能
Context 是 @mcp.tool() 装饰器修饰的函数核心输入参数,封装了请求的完整上下文信息,包括 HTTP 请求数据、身份验证、请求头、查询参数等。通过 Context,工具函数能够动态响应外部请求。
核心作用
请求信息传递
Context 包含客户端请求的原始数据,如 HTTP 请求头、查询参数、请求体等,确保工具函数能够准确获取并处理请求内容。
统一接口规范
无论请求来源是 VS Code 插件、命令行工具还是其他服务,Context 提供一致的访问方式,降低开发复杂度,提高工具函数的通用性。

1153

被折叠的 条评论
为什么被折叠?



