动态工具加载服务器

FastMCP服务器是一个生产就绪的容器化服务,支持从多种来源动态加载工具、资源、提示和知识库,适用于开发和生产环境。

  • by helmforgedev
  • Python
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 helmforgedev/fastmcp-server

使用说明

fastmcp服务器

生产就绪 FastMCP 服务器映像,可动态加载来自多个来源的工具、资源、提示和知识库。

在任何地方运行自己的MCP服务器——Docker、Compose、Swarm、Kubernetes或任何容器运行时。用Python定义工具,挂载它们,你的服务器就上线了。

快速开始

# Create a tool
mkdir -p tools
cat > tools/hello.py << 'EOF'
def greet(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"
EOF

# Run the server
docker run -d \
  -p 8000:8000 \
  -v $(pwd)/tools:/app/inline/tools \
  docker.io/helmforge/fastmcp-server:0.4.0

您的MCP服务器现在可以在 http://localhost:8000/mcp. 内置Web UI位于 http://localhost:8000/ui.

运作原理

服务器从工作区目录加载MCP组件(工具、资源、提示、知识)。启动时,它将一个或多个源的文件同步到工作区,向FastMCP注册所有内容,并通过HTTP公开服务器。

Sources (Inline, S3, Git)
        │
        ▼
  /app/workspace/
  ├── tools/*.py         → registered as MCP tools
  ├── resources/*.py     → registered as MCP resources
  ├── prompts/*.py       → registered as MCP prompts
  └── knowledge/*        → served as knowledge:// resources
        │
        ▼
  FastMCP Server (:8000/mcp)
  ├── /ui               → Web dashboard
  ├── /healthz          → Liveness probe
  ├── /readyz           → Readiness probe
  ├── /startupz         → Startup probe
  ├── /debug/info       → Server diagnostics
  ├── /metrics          → Prometheus metrics (opt-in)
  └── /api/*            → JSON API for UI

来源

该图像支持三个具有合并优先级的数据源(最高优先):

来源 最佳选择 限制
内联 (卷装在 /app/inline/) 快速设置,小配置 主机文件系统
第3页 (AWS S3、MinIO、Cloudflare R2) 团队、CI/CD管道、大型知识库 无限制
Git (任何HTTPS回购) 版本控制工具,协作 回购规模

所有来源都可以合并。内联总是在冲突中获胜。

使用Docker Compose运行

services:
  mcp-server:
    image: docker.io/helmforge/fastmcp-server:0.4.0
    ports:
      - "8000:8000"
    volumes:
      - ./tools:/app/inline/tools
      - ./resources:/app/inline/resources
      - ./prompts:/app/inline/prompts
      - ./knowledge:/app/inline/knowledge
    environment:
      MCP_SERVER_NAME: my-mcp-server
      MCP_AUTH_TYPE: bearer
      MCP_AUTH_TOKEN: ${MCP_AUTH_TOKEN}
    healthcheck:
      test: ["CMD", "curl", "-sf", "http://localhost:8000/healthz"]
      interval: 30s
      timeout: 5s
      retries: 3

使用S3运行(MinIO示例)

services:
  mcp-server:
    image: docker.io/helmforge/fastmcp-server:0.4.0
    ports:
      - "8000:8000"
    environment:
      SOURCE_S3_ENABLED: "true"
      SOURCE_S3_ENDPOINT: http://minio:9000
      SOURCE_S3_BUCKET: mcp-tools
      SOURCE_S3_ACCESS_KEY: minioadmin
      SOURCE_S3_SECRET_KEY: minioadmin

  minio:
    image: docker.io/minio/minio:RELEASE.2025-04-03T14-56-28Z
    command: server /data --console-address ":9001"
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin

使用Git源代码运行

docker run -d \
  -p 8000:8000 \
  -e SOURCE_GIT_ENABLED=true \
  -e SOURCE_GIT_REPOSITORY=https://github.com/myorg/mcp-tools.git \
  -e SOURCE_GIT_BRANCH=main \
  docker.io/helmforge/fastmcp-server:0.4.0

对于私有仓库,设置 SOURCE_GIT_TOKEN 使用个人访问令牌。

写作工具

创建一个 .py 归档 tools/默认情况下,该模块中定义的每个公共函数都成为MCP工具:

def get_weather(city: str) -> str:
    """Get current weather for a city."""
    import httpx
    return httpx.get(f"https://wttr.in/{city}?format=3").text

def roll_dice(sides: int = 6) -> int:
    """Roll a die with the given number of sides."""
    import random
    return random.randint(1, sides)

也支持实用模块。文件命名如下 *_helpers.py 默认情况下跳过。对于任何其他实用程序模块,将助手设置为私有(_helper)或明确禁用自动注册:

__mcp_auto_register__ = False

def evidence_true(data, *keys):
    return True

如果你想对出口进行精确控制,请申报 TOOLS 对抗主义者:

TOOLS = ["deploy"]

def deploy(service: str, version: str) -> str:
    """Deploy a service."""
    return f"Deployed {service}@{version}"

def helper() -> str:
    return "not registered"

工具元数据

添加可选模块级变量以控制工具注册:

__tags__ = {"devops", "production"}        # Categorization tags
__timeout__ = 30.0                          # Execution timeout (seconds)
__annotations_mcp__ = {                     # MCP behavior hints
    "destructiveHint": True,
    "title": "Deploy Service"
}

def deploy(service: str, version: str) -> str:
    """Deploy a service to production."""
    return f"Deployed {service}@{version}"

异步工具

两者 async def 和 def 函数工作。异步是I/O绑定操作的首选:

async def fetch_url(url: str) -> str:
    """Fetch content from a URL."""
    import httpx
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.text

结构化输出

返回 ToolResult 要完全控制响应格式:

from fastmcp.tools.tool import ToolResult

def analyze(data: str) -> ToolResult:
    """Analyze data with structured output."""
    return ToolResult(
        content="Analysis complete",
        structured_content={"word_count": len(data.split())},
        meta={"version": "1.0"}
    )

写作资源

创建一个 .py 归档 resources/ 带着一个 RESOURCE_URI 常量和处理函数:

import json

RESOURCE_URI = "config://app"

def get_config() -> str:
    """Application configuration."""
    return json.dumps({"version": "1.0", "env": "production"}, indent=2)

重要提示: 资源处理程序必须返回 str, bytes,或 list[ResourceContent].返回a dict 直接将导致序列化错误。

资源模板

使用 {param} 参数化资源URI中的占位符:

import json

RESOURCE_URI = "users://{user_id}/profile"

def get_profile(user_id: str) -> str:
    """Get user profile by ID."""
    return json.dumps({"user_id": user_id, "name": f"User {user_id}"}, indent=2)

每个文件有多个资源

使用一个 RESOURCES dict从一个文件中注册多个资源:

import json

RESOURCES = {
    "status://health": "get_health",
    "status://version": "get_version",
}

def get_health() -> str:
    return json.dumps({"status": "ok"}, indent=2)

def get_version() -> str:
    return "1.0.0"

写作提示

创建一个 .py 归档 prompts/.每个公共函数都变成MCP提示符:

def summarize(text: str) -> str:
    """Summarize the provided text."""
    return f"Please provide a concise summary of:\n\n{text}"

知识库

放置在以下位置的任何文件 knowledge/ 被用作 knowledge:// 资源。支持文本、markdown、JSON、YAML或任何UTF-8文件。

knowledge/
├── product-overview.md
├── api-reference.json
└── troubleshooting/
    ├── common-errors.md
    └── faq.md

这些可以通过以下方式访问 knowledge://product-overview.md, knowledge://troubleshooting/common-errors.md等等。

认证

类型 变量 用例
没有 MCP_AUTH_TYPE=none 发展、内部网络
持票人 MCP_AUTH_TYPE=bearer + MCP_AUTH_TOKEN API密钥、服务帐户
JWT MCP_AUTH_TYPE=jwt + MCP_AUTH_JWT_* OAuth/OIDC,企业SSO

Web用户界面

嵌入式仪表板位于 /ui 提供:

  • 仪表盘 --服务器名称、版本、正常运行时间、组件计数、源状态
  • 工具资源管理器 --所有已注册的工具,包括描述、参数、标签、超时
  • 资源浏览器 --具有URI、MIME类型的资源和模板
  • 提示浏览器 --所有带有描述的提示

每15秒自动刷新一次。禁用 MCP_UI_ENABLED=false.

可观测性

健康终点

终点 目的 200时
GET /healthz Liveness 始终(进程正在运行)
GET /readyz 准备就绪 源已同步+组件已加载
GET /startupz 启动 完全初始化完成

诊断

GET /debug/info 返回完整的服务器诊断:版本、FastMCP版本、正常运行时间、组件详细信息、源状态、身份验证类型和配置。

普罗米修斯指标

启用 MCP_METRICS_ENABLED=true.暴露在 /metrics:

  • mcp_tools_total --注册工具数量
  • mcp_resources_total --已注册资源数量
  • mcp_prompts_total --已注册的提示数
  • mcp_knowledge_total --知识文件数量
  • mcp_tool_calls_total{tool} --工具调用计数器
  • mcp_tool_duration_seconds{tool} --工具执行持续时间直方图
  • mcp_tool_errors_total{tool} --刀具错误计数器
  • mcp_sources_sync_total{source,status} --源同步操作
  • mcp_auth_requests_total{result} --身份验证尝试计数器

结构化日志记录

集 LOG_FORMAT=json 对于与Loki、ELK、CloudWatch和Datadog兼容的JSON结构化日志:

{
  "timestamp": "2026-04-05T10:30:00+00:00",
  "level": "INFO",
  "logger": "fastmcp-server.builder",
  "message": "Registered tool: greet"
}

环境变量

服务器

变量 默认值 描述
MCP_SERVER_NAME fastmcp-server 服务器显示名称
MCP_HOST 0.0.0.0 收听地址
MCP_PORT 8000 监听端口
MCP_PATH /mcp HTTP端点路径
MCP_WORKSPACE /app/workspace 工作区目录
LOG_LEVEL INFO 日志记录级别
LOG_FORMAT text 日志格式: text 或 json
MCP_MASK_ERROR_DETAILS false 向客户端隐藏内部错误详细信息
MCP_ON_DUPLICATE_TOOLS warn 重复处理: warn, error, replace, ignore
MCP_STRICT_LOADING false 如果任何工具/资源有错误,则启动失败
MCP_UI_ENABLED true 在以下位置启用内置Web UI /ui
MCP_METRICS_ENABLED false 启用Prometheus指标 /metrics
EXTRA_PIP_PACKAGES 启动时安装逗号分隔的pip包

认证

变量 默认值 描述
MCP_AUTH_TYPE none bearer, jwt,或 none
MCP_AUTH_TOKEN 承载令牌值
MCP_AUTH_JWT_ISSUER 智威汤逊发行人
MCP_AUTH_JWT_AUDIENCE 智威汤逊观众
MCP_AUTH_JWT_JWKS_URI JWKS端点URL

S3来源

变量 默认值 描述
SOURCE_S3_ENABLED false 启用S3同步
SOURCE_S3_ENDPOINT S3兼容端点URL
SOURCE_S3_BUCKET 存储桶名称
SOURCE_S3_REGION us-east-1 AWS区域
SOURCE_S3_PREFIX 关键字前缀过滤器
SOURCE_S3_ACCESS_KEY 访问密钥ID
SOURCE_S3_SECRET_KEY 秘密访问密钥

Git源代码

变量 默认值 描述
SOURCE_GIT_ENABLED false 启用Git同步
SOURCE_GIT_REPOSITORY 存储库HTTPS URL
SOURCE_GIT_BRANCH main 要克隆的分支
SOURCE_GIT_PATH 回购内的子目录
SOURCE_GIT_TOKEN 私有仓库的认证令牌

初始化容器模式

对于Kubernetes,使用以下命令将源同步与服务器启动分开 sync_only.py:

python /app/sync_only.py

此脚本运行 sync_sources() 并退出。将其用作Kubernetes init容器,在主服务器启动之前预填充工作区卷。

部署选项

方法 文档
Docker/Docker Compose/Swarm 此自述文件
Kubernetes(Helm) helmforg/carts-fastmcp服务器

连接MCP客户端

一旦您的FastMCP服务器运行并可访问,请将AI助手作为MCP服务器连接到它。

克劳德代码

将服务器添加到您的Claude Code设置中(~/.claude/settings.json 或项目 .claude/settings.json):

{
  "mcpServers": {
    "my-mcp-server": {
      "type": "streamable-http",
      "url": "https://mcp.example.com/mcp"
    }
  }
}

通过承载身份验证:

{
  "mcpServers": {
    "my-mcp-server": {
      "type": "streamable-http",
      "url": "https://mcp.example.com/mcp",
      "headers": {
        "Authorization": "Bearer <your-token>"
      }
    }
  }
}

食品法典委员会(VS代码扩展)

添加到Codex配置文件(~/.codex/config.toml):

[mcp_servers.my-mcp-server]
enabled = true
url = "https://mcp.example.com/mcp"

[mcp_servers.my-mcp-server.http_headers]
Authorization = "Bearer <your-token>"

无身份验证(开发):

[mcp_servers.my-mcp-server]
enabled = true
url = "https://mcp.example.com/mcp"

本地开发

使用Docker在本地运行时,请使用 http://localhost:8000/mcp 作为URL,如果满足以下条件,则省略身份验证标头 MCP_AUTH_TYPE=none.

许可证

Apache-2.0--参见 许可证.