Apache 管理 MCP 服务器(SSE 传输)
一个小型的MCP兼容服务器,通过SSE+HTTP暴露Apache网站管理功能(列出、启用/禁用、测试、重新加载、重启)。包含API密钥认证以控制访问。
这个仓库托管着 apache-mcp-sse.py — 一个基于Starlette/uvicorn的ASGI应用程序,它封装了常见的Apache管理命令,并将它们作为MCP资源和工具呈现出来。
特点
- 列出网站列表
/etc/apache2/sites-available并且/etc/apache2/sites-enabled - 读取站点配置文件
- 通过(某种方式)启用/禁用站点
a2ensite/a2dissite - 测试Apache配置并重新加载/重启服务
- 用于MCP客户端连接的SSE传输
- API密钥认证(头部:
X-API-Key) - 已启用CORS(默认:允许所有来源)
先决条件
- Linux(采用Debian/Ubuntu风格的Apache布局)
- Python 3.12+(项目要求)
>=3.12) - sudo 权限以运行
a2ensite,a2dissite,apache2ctl,以及service apache2命令 - UV包管理器(不使用pip)
安装 uv(一次性操作):
# Linux/macOS (from Astral)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Verify
uv --version项目布局
apache-mcp-sse.py— MCP的主SSE + HTTP服务器apache-rest-api.py— 可选的 REST/FastAPI 版本(如果您更喜欢使用 REST 而不是 SSE)pyproject.toml— 项目元数据和依赖项(fastapi,httpx,mcp[cli]等
使用 uv 进行设置(无需 pip)
同步项目环境自 pyproject.toml:
# Create/refresh a project-local virtualenv and install dependencies
uv sync如果你计划使用SSE服务器(apache-mcp-sse.py)并且它缺少你系统中的运行时依赖项 pyproject.toml,用紫外线(一次)照射它们:
# Only if needed
uv add starlette uvicorn注:该项目已列出 mcp[cli], fastapi,以及 httpxSSE服务器使用 starlette 并且 uvicorn 在运行时。
运行服务器(uv)
设置一个API密钥(推荐)或让服务器在启动时自动生成一个。
# 1) Set a permanent API key (recommended)
export MCP_API_KEY="my-super-secret-key-12345"
# 2) Run the SSE server under uv's environment
uv run python apache-mcp-sse.py服务器启动时会打印连接信息,包括有效的API密钥(如果已生成)和终端节点。
默认绑定: http://0.0.0.0:8000
终点(或结局指标)
GET /— 服务器信息(无需认证)GET /health— 健康检查(无需认证)GET /sse— SSE传输(需要X-API-Key)POST /messages— MCP消息入口(需要X-API-Key)
🔐 API密钥认证使用
设定 MCP_API_KEY 如上文“运行服务器”部分所示(或服务器将在启动时自动生成一个)。
使用curl进行测试
# WITHOUT API key (will fail)
curl http://localhost:8000/sse
# Response: {"error":"Authentication required","message":"Missing X-API-Key header"}
# WITH API key (will work)
curl -H "X-API-Key: my-super-secret-key-12345" \
http://localhost:8000/sse
# Health check (no auth needed)
curl http://localhost:8000/healthApache 反向代理(可选)
为了让Apache转发请求并注入API密钥头部,这样客户端就不需要包含它:
ServerName
ProxyPreserveHost On
ProxyTimeout 3600
# Pass the API key header
RequestHeader set X-API-Key "my-super-secret-key-12345"
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
ProxyPass http://127.0.0.1:8000/sse
ProxyPassReverse http://127.0.0.1:8000/sse
SetEnv proxy-sendcl 0
SetEnv proxy-sendchunked 1
ProxyPass http://127.0.0.1:8000/messages
ProxyPassReverse http://127.0.0.1:8000/messages
ProxyPass http://127.0.0.1:8000/health
ProxyPassReverse http://127.0.0.1:8000/health
然后客户端配置可以省略头部信息:
{
"mcpServers": {
"apache-manager": {
"url": "http://test.kraybin.com/sse"
}
}
}生成一个强密码的API密钥
uv run python -c "import secrets; print(secrets.token_urlsafe(32))"安全特性
- API密钥要求
/sse并且/messages - 无需认证即可
/health和/(仅信息) - 如果未设置,则自动生成密钥
- 环境变量支持(
MCP_API_KEY) - 自定义头部名称(
X-API-Key)
与MCP Inspector一起使用
服务器为MCP Inspector打印一行信息。您也可以运行:
# Replace host if remote
npx @modelcontextprotocol/inspector http://localhost:8000/sse添加 X-API-Key 如果未使用注入该头的反向代理,则在检查器(Inspector)UI中显示该头。
可用的MCP工具
list_available_sites— 列出以下所有文件/etc/apache2/sites-availablelist_enabled_sites— 列出以下所有文件/etc/apache2/sites-enabledget_site_status— 显示站点的启用状态和配置enable_site— 通过(某种方式)启用一个网站a2ensite(可选自动重载)disable_site— 通过禁用某个网站a2dissite(可选自动重载)test_config— 跑apache2ctl configtestreload_apache—service apache2 reloadrestart_apache—service apache2 restart
故障排除
- 权限问题与
a2ensite/a2dissite为服务用户配置sudoers文件,或以具有适当权限的用户身份运行。非交互式sudo可能需要NOPASSWD规则。 - 通过反向代理使用SSE(服务器发送事件):确保允许长连接并启用分块编码(参见上面的示例)。
- 空列表:验证标准的Debian/Ubuntu Apache布局是否存在,以及文件是否可读(
/etc/apache2/sites-available,/etc/apache2/sites-enabled)。
安全注意事项
- 保护您的API密钥;它授予对Apache网站配置的控制权并允许重新加载。
- 在生产环境中,限制CORS(跨源资源共享)/允许的来源,并在反向代理后使用HTTPS。
- 确保生成的密钥不在共享日志中;如果未提供,则在启动时会打印到标准输出。
