mcp-http 环境变量传递

部署运行你感兴趣的模型镜像

项目结构说明

项目采用标准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采用分阶段构建优化镜像层缓存:

  1. 基础镜像使用Python 3.12官方镜像
  2. 分层安装依赖项减少重复构建
  3. 最后复制代码保持缓存有效性

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"  
            }
        }
    }
}

服务验证

测试服务可用性:

  1. 直接调用hello工具验证基础功能
  2. 通过ping工具检查网络连通性
  3. 检查日志输出确认服务状态

结果验证

在这里插入图片描述

关键设计要点

  • 环境变量通过python-dotenv动态加载,优先级:请求头 > 环境变量
  • 跨平台兼容性处理体现在ping工具的系统命令适配
  • 无状态HTTP服务设计支持横向扩展
  • 容器镜像构建优化依赖安装顺序减少层体积

MCP 框架中的 Context 核心功能

Context 是 @mcp.tool() 装饰器修饰的函数核心输入参数,封装了请求的完整上下文信息,包括 HTTP 请求数据、身份验证、请求头、查询参数等。通过 Context,工具函数能够动态响应外部请求。

核心作用

请求信息传递
Context 包含客户端请求的原始数据,如 HTTP 请求头、查询参数、请求体等,确保工具函数能够准确获取并处理请求内容。

统一接口规范
无论请求来源是 VS Code 插件、命令行工具还是其他服务,Context 提供一致的访问方式,降低开发复杂度,提高工具函数的通用性。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值