使用说明
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].返回adict直接将导致序列化错误。
资源模板
使用 {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--参见 许可证.