mcp-apollo 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcp_apollo-0.1.0/.dockerignore +28 -0
- mcp_apollo-0.1.0/.env.example +16 -0
- mcp_apollo-0.1.0/.gitignore +34 -0
- mcp_apollo-0.1.0/Dockerfile +54 -0
- mcp_apollo-0.1.0/LICENSE +21 -0
- mcp_apollo-0.1.0/PKG-INFO +347 -0
- mcp_apollo-0.1.0/README.md +316 -0
- mcp_apollo-0.1.0/docker-compose.yml +36 -0
- mcp_apollo-0.1.0/pyproject.toml +65 -0
- mcp_apollo-0.1.0/src/mcp_apollo/__init__.py +6 -0
- mcp_apollo-0.1.0/src/mcp_apollo/__main__.py +6 -0
- mcp_apollo-0.1.0/src/mcp_apollo/auth.py +109 -0
- mcp_apollo-0.1.0/src/mcp_apollo/client.py +5 -0
- mcp_apollo-0.1.0/src/mcp_apollo/clients/__init__.py +6 -0
- mcp_apollo-0.1.0/src/mcp_apollo/clients/base.py +231 -0
- mcp_apollo-0.1.0/src/mcp_apollo/clients/factory.py +23 -0
- mcp_apollo-0.1.0/src/mcp_apollo/clients/openapi.py +618 -0
- mcp_apollo-0.1.0/src/mcp_apollo/server.py +1314 -0
- mcp_apollo-0.1.0/tests/__init__.py +0 -0
- mcp_apollo-0.1.0/tests/test_openapi_client.py +298 -0
- mcp_apollo-0.1.0/tests/test_server.py +63 -0
- mcp_apollo-0.1.0/tests/test_server_tools.py +293 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# 版本控制 / 本地数据
|
|
2
|
+
.git
|
|
3
|
+
.workbuddy
|
|
4
|
+
|
|
5
|
+
# 字节码 / 缓存
|
|
6
|
+
__pycache__
|
|
7
|
+
*.pyc
|
|
8
|
+
.mypy_cache
|
|
9
|
+
.pytest_cache
|
|
10
|
+
.ruff_cache
|
|
11
|
+
|
|
12
|
+
# 虚拟环境 / 构建产物
|
|
13
|
+
.venv
|
|
14
|
+
venv
|
|
15
|
+
build
|
|
16
|
+
dist
|
|
17
|
+
*.egg-info
|
|
18
|
+
|
|
19
|
+
# 密钥(保留示例)
|
|
20
|
+
.env
|
|
21
|
+
!.env.example
|
|
22
|
+
|
|
23
|
+
# 系统文件
|
|
24
|
+
.DS_Store
|
|
25
|
+
|
|
26
|
+
# 镜像运行不需要的内容
|
|
27
|
+
tests
|
|
28
|
+
docker-compose.yml
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# ==== MCP 传输与认证 ====
|
|
2
|
+
MCP_TRANSPORT=streamable-http # stdio / sse / streamable-http
|
|
3
|
+
MCP_HOST=0.0.0.0
|
|
4
|
+
MCP_PORT=8000
|
|
5
|
+
MCP_AUTH_TOKEN= # 设置后启用 Bearer Token 认证,保护 HTTP 接口
|
|
6
|
+
MCP_LOG_LEVEL=info # debug / info / warning / error
|
|
7
|
+
|
|
8
|
+
# ==== Apollo 连接配置 ====
|
|
9
|
+
APOLLO_PORTAL_URL=http://localhost:8070 # Apollo Portal(OpenAPI)地址
|
|
10
|
+
APOLLO_TOKEN= # OpenAPI 第三方应用 Token(在 Portal 开放平台创建)
|
|
11
|
+
APOLLO_APP_ID= # 默认应用 ID
|
|
12
|
+
APOLLO_ENV=DEV # 默认环境:DEV / FAT / UAT / PRO
|
|
13
|
+
APOLLO_CLUSTER=default # 默认集群
|
|
14
|
+
APOLLO_NAMESPACE=application # 默认命名空间(配置文件)
|
|
15
|
+
APOLLO_OPERATOR=apollo # 写入/发布时记录的操作人(域账号)
|
|
16
|
+
APOLLO_READ_ONLY=false # true 时禁用发布,仅允许查询
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# ===== Python 字节码 / 缓存 =====
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# ===== 打包 / 构建产物 =====
|
|
7
|
+
build/
|
|
8
|
+
dist/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
*.egg
|
|
11
|
+
.eggs/
|
|
12
|
+
|
|
13
|
+
# ===== 虚拟环境 =====
|
|
14
|
+
.venv/
|
|
15
|
+
venv/
|
|
16
|
+
env/
|
|
17
|
+
ENV/
|
|
18
|
+
|
|
19
|
+
# ===== 测试 / Lint / 类型检查缓存 =====
|
|
20
|
+
.pytest_cache/
|
|
21
|
+
.mypy_cache/
|
|
22
|
+
.ruff_cache/
|
|
23
|
+
.coverage
|
|
24
|
+
htmlcov/
|
|
25
|
+
|
|
26
|
+
# ===== 密钥 / 本地环境(保留示例文件)=====
|
|
27
|
+
.env
|
|
28
|
+
!.env.example
|
|
29
|
+
|
|
30
|
+
# ===== macOS 系统文件 =====
|
|
31
|
+
.DS_Store
|
|
32
|
+
|
|
33
|
+
# ===== 项目本地数据(记忆 / 非源码,不入仓库)=====
|
|
34
|
+
.workbuddy/
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
|
|
3
|
+
########## 构建阶段 ##########
|
|
4
|
+
FROM python:3.12-slim AS builder
|
|
5
|
+
|
|
6
|
+
WORKDIR /app
|
|
7
|
+
|
|
8
|
+
# 仅复制构建所需文件,最大化利用缓存
|
|
9
|
+
COPY pyproject.toml README.md ./
|
|
10
|
+
COPY src ./src
|
|
11
|
+
|
|
12
|
+
# 构建 wheel 并安装到独立前缀,便于拷贝到运行阶段
|
|
13
|
+
RUN pip install --no-cache-dir --upgrade pip build \
|
|
14
|
+
&& pip wheel --no-cache-dir --no-deps --wheel-dir /wheels . \
|
|
15
|
+
&& pip install --no-cache-dir --prefix=/install .
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
########## 运行阶段 ##########
|
|
19
|
+
FROM python:3.12-slim AS runtime
|
|
20
|
+
|
|
21
|
+
# OCI 元数据:关联源码仓库,便于溯源,并让 GHCR 包页自动关联到 GitHub 仓库
|
|
22
|
+
LABEL org.opencontainers.image.source="https://github.com/zhouweico/mcp-apollo" \
|
|
23
|
+
org.opencontainers.image.title="mcp-apollo" \
|
|
24
|
+
org.opencontainers.image.description="MCP Server for Apollo configuration management (stdio/sse/streamable-http, token auth)" \
|
|
25
|
+
org.opencontainers.image.url="https://github.com/zhouweico/mcp-apollo" \
|
|
26
|
+
org.opencontainers.image.licenses="MIT"
|
|
27
|
+
|
|
28
|
+
# 运行时环境变量默认值(可在 docker run / compose 中覆盖)
|
|
29
|
+
ENV PYTHONUNBUFFERED=1 \
|
|
30
|
+
PYTHONDONTWRITEBYTECODE=1 \
|
|
31
|
+
MCP_TRANSPORT=streamable-http \
|
|
32
|
+
MCP_HOST=0.0.0.0 \
|
|
33
|
+
MCP_PORT=8000
|
|
34
|
+
|
|
35
|
+
WORKDIR /app
|
|
36
|
+
|
|
37
|
+
# 拷贝已安装的依赖与包
|
|
38
|
+
COPY --from=builder /install /usr/local
|
|
39
|
+
|
|
40
|
+
# 使用非 root 用户运行
|
|
41
|
+
RUN useradd --create-home --uid 10001 appuser
|
|
42
|
+
USER appuser
|
|
43
|
+
|
|
44
|
+
EXPOSE 8000
|
|
45
|
+
|
|
46
|
+
# 健康检查:HTTP 传输下 /health 免鉴权返回 200
|
|
47
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
48
|
+
CMD python -c "import os,urllib.request,sys; \
|
|
49
|
+
port=os.getenv('MCP_PORT','8000'); \
|
|
50
|
+
sys.exit(0) if os.getenv('MCP_TRANSPORT','stdio')=='stdio' else \
|
|
51
|
+
sys.exit(0 if urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=3).status==200 else 1)"
|
|
52
|
+
|
|
53
|
+
# 入口:通过控制台脚本启动,具体协议由 MCP_TRANSPORT 决定
|
|
54
|
+
ENTRYPOINT ["mcp-apollo"]
|
mcp_apollo-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 zhouweico
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mcp-apollo
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP Server for Apollo configuration management
|
|
5
|
+
Project-URL: Homepage, https://github.com/zhouweico/mcp-apollo
|
|
6
|
+
Project-URL: Repository, https://github.com/zhouweico/mcp-apollo
|
|
7
|
+
Author: zhouweico
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: apollo,configuration,mcp,model-context-protocol
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Requires-Python: >=3.10
|
|
19
|
+
Requires-Dist: httpx>=0.27.0
|
|
20
|
+
Requires-Dist: mcp>=1.0.0
|
|
21
|
+
Requires-Dist: pydantic>=2.0.0
|
|
22
|
+
Requires-Dist: starlette>=0.37.0
|
|
23
|
+
Requires-Dist: uvicorn>=0.27.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: mypy>=1.10.0; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
28
|
+
Requires-Dist: respx>=0.20.0; extra == 'dev'
|
|
29
|
+
Requires-Dist: ruff>=0.4.0; extra == 'dev'
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# mcp-apollo
|
|
33
|
+
|
|
34
|
+
Apollo MCP Server - 让 AI 助手能够查询和管理 [Apollo](https://www.apolloconfig.com/) 配置中心的配置。
|
|
35
|
+
|
|
36
|
+
基于 Apollo Portal 开放平台 OpenAPI(`/openapi/v1/...`,参见 [OpenAPI 接口文档](https://www.apolloconfig.com/#/zh/portal/apollo-open-api-platform?id=%e4%b8%89%e3%80%81-%e6%8e%a5%e5%8f%a3%e6%96%87%e6%a1%a3)),支持配置的读取与发布。
|
|
37
|
+
|
|
38
|
+
## 特性
|
|
39
|
+
|
|
40
|
+
- **多协议传输**:`stdio`(默认)、`sse`、`streamable-http`,一套代码适配本地与远程场景
|
|
41
|
+
- **接口认证**:HTTP 传输支持 Bearer Token 保护,未授权请求返回 `401`
|
|
42
|
+
- **Apollo 原生概念**:直接以 `env / app / cluster / namespace / item` 组织配置,读写一体
|
|
43
|
+
- **灵活部署**:`uvx` 免安装运行、Docker 公开镜像即拉即用、或本地构建
|
|
44
|
+
|
|
45
|
+
## 前置准备
|
|
46
|
+
|
|
47
|
+
在 Apollo Portal 的「开放平台」中创建第三方应用并生成 **Token**,并为其授权目标 App / 环境 / 命名空间。你需要准备:
|
|
48
|
+
|
|
49
|
+
- Apollo Portal 地址(如 `http://localhost:8070`)
|
|
50
|
+
- OpenAPI Token
|
|
51
|
+
- 目标应用的 `appId`
|
|
52
|
+
|
|
53
|
+
## 快速开始
|
|
54
|
+
|
|
55
|
+
### MCP 客户端(stdio,本地)
|
|
56
|
+
|
|
57
|
+
以 Claude Code 为例,在项目 `.mcp.json` 或全局 `~/.claude.json` 中添加:
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"mcpServers": {
|
|
62
|
+
"apollo": {
|
|
63
|
+
"type": "stdio",
|
|
64
|
+
"command": "uvx",
|
|
65
|
+
"args": ["mcp-apollo"],
|
|
66
|
+
"env": {
|
|
67
|
+
"APOLLO_PORTAL_URL": "http://localhost:8070",
|
|
68
|
+
"APOLLO_TOKEN": "your-openapi-token",
|
|
69
|
+
"APOLLO_APP_ID": "your-app-id",
|
|
70
|
+
"APOLLO_ENV": "DEV",
|
|
71
|
+
"APOLLO_CLUSTER": "default",
|
|
72
|
+
"APOLLO_NAMESPACE": "application",
|
|
73
|
+
"APOLLO_READ_ONLY": "false"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
> Cursor、OpenCode、Claude Desktop 等客户端的配置格式相同,核心均为 `command: uvx` + `args: ["mcp-apollo"]`,按各客户端语法填入 `APOLLO_*` 环境变量即可。
|
|
81
|
+
|
|
82
|
+
### Docker(公开镜像,免构建)
|
|
83
|
+
|
|
84
|
+
已发布公开镜像 `ghcr.io/zhouweico/mcp-apollo:latest`,无需本地构建。下面以 Claude Code 为例。
|
|
85
|
+
|
|
86
|
+
**方式一:stdio(由客户端拉起容器,适合本地集成)**
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"mcpServers": {
|
|
91
|
+
"apollo": {
|
|
92
|
+
"type": "stdio",
|
|
93
|
+
"command": "docker",
|
|
94
|
+
"args": ["run", "-i", "--rm", "ghcr.io/zhouweico/mcp-apollo:latest"],
|
|
95
|
+
"env": {
|
|
96
|
+
"APOLLO_PORTAL_URL": "http://your-apollo-portal:8070",
|
|
97
|
+
"APOLLO_TOKEN": "your-openapi-token",
|
|
98
|
+
"APOLLO_APP_ID": "your-app-id",
|
|
99
|
+
"APOLLO_ENV": "DEV"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
> 必须带 `-i`(保持 stdin 管道),否则容器内的 stdio 服务无法与客户端通信。
|
|
107
|
+
|
|
108
|
+
**方式二:HTTP + 认证(容器独立运行,客户端远程连接,适合多客户端共享)**
|
|
109
|
+
|
|
110
|
+
先启动容器:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
docker run -d -p 8000:8000 \
|
|
114
|
+
-e MCP_TRANSPORT=streamable-http \
|
|
115
|
+
-e MCP_AUTH_TOKEN=your-strong-token \
|
|
116
|
+
-e APOLLO_PORTAL_URL=http://your-apollo-portal:8070 \
|
|
117
|
+
-e APOLLO_TOKEN=your-openapi-token \
|
|
118
|
+
-e APOLLO_APP_ID=your-app-id \
|
|
119
|
+
ghcr.io/zhouweico/mcp-apollo:latest
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
再在 Claude Code 的 `.mcp.json` 中通过 HTTP 连接:
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"mcpServers": {
|
|
127
|
+
"apollo": {
|
|
128
|
+
"type": "streamable-http",
|
|
129
|
+
"url": "http://localhost:8000/mcp",
|
|
130
|
+
"headers": {
|
|
131
|
+
"Authorization": "Bearer your-strong-token"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## 可用工具
|
|
139
|
+
|
|
140
|
+
| 工具 | 3.2 接口 | 类型 | 说明 |
|
|
141
|
+
|------|---------|------|------|
|
|
142
|
+
| `apollo_get_config` | 3.2.6 / 3.2.9 | 只读 | 读取命名空间全部配置项,或指定 key 的单个配置项(支持客户端侧分页) |
|
|
143
|
+
| `apollo_get_app_env_clusters` | 3.2.1 | 只读 | 获取 App 的环境与集群信息 |
|
|
144
|
+
| `apollo_get_apps` | 3.2.2 | 只读 | 获取 App 信息(可按 appId 过滤) |
|
|
145
|
+
| `apollo_get_cluster` | 3.2.3 | 只读 | 获取集群详细信息 |
|
|
146
|
+
| `apollo_list_namespaces` | 3.2.5 | 只读 | 获取集群下所有 Namespace |
|
|
147
|
+
| `apollo_get_namespace_lock` | 3.2.8 | 只读 | 获取 Namespace 当前编辑锁(PRO 环境才有) |
|
|
148
|
+
| `apollo_get_latest_release` | 3.2.14 | 只读 | 获取 Namespace 最近一次已发布配置 |
|
|
149
|
+
| `apollo_list_items` | 3.2.16 | 只读 | 分页获取配置项(Apollo 原生服务端分页) |
|
|
150
|
+
| `apollo_create_item` | 3.2.10 | 写 | 新建配置项(严格新建,key 已存在则报错) |
|
|
151
|
+
| `apollo_update_item` | 3.2.11 | 写 | 更新配置项(默认严格更新,key 不存在则报错;可选 `create_if_not_exists=true` 启用 upsert) |
|
|
152
|
+
| `apollo_releases` | 3.2.13 | 写 | 发布命名空间,使改动生效 |
|
|
153
|
+
| `apollo_create_cluster` | 3.2.4 | 写 | 创建集群 |
|
|
154
|
+
| `apollo_create_namespace` | 3.2.7 | 写 | 创建 Namespace |
|
|
155
|
+
| `apollo_delete_item` | 3.2.12 | 写 | 删除配置项(删除后需发布生效) |
|
|
156
|
+
| `apollo_rollback_release` | 3.2.15 | 写 | 回滚已发布配置 |
|
|
157
|
+
| `apollo_create_app` | 3.2.17 | 写 | 创建 App 并获取管理员权限 |
|
|
158
|
+
|
|
159
|
+
> 全部 16 个工具完整覆盖 [Apollo OpenAPI 文档「3.2 API接口列表」](https://www.apolloconfig.com/#/zh/portal/apollo-open-api-platform?id=%e4%b8%89%e3%80%81-%e6%8e%a5%e5%8f%a3%e6%96%87%e6%a1%a3) 的 17 个接口(其中 `apollo_get_config` 一个工具同时覆盖 3.2.6 与 3.2.9,故工具数为 16、接口数为 17)。
|
|
160
|
+
|
|
161
|
+
### `apollo_get_config` 参数
|
|
162
|
+
|
|
163
|
+
| 参数 | 说明 | 默认值 |
|
|
164
|
+
|------|------|--------|
|
|
165
|
+
| `namespace_name` | 命名空间(配置文件名) | 环境变量 `APOLLO_NAMESPACE` → `application` |
|
|
166
|
+
| `key` | 配置项 key;不填返回整个命名空间 | - |
|
|
167
|
+
| `env` / `app_id` / `cluster_name` | Apollo OpenAPI 路径参数(接口层必填);省略回退 `APOLLO_*` 环境变量,未配置用默认 DEV/default/application;`app_id` 无内置默认值,须由参数或 `APOLLO_APP_ID` 提供,否则报错 | 见各 `APOLLO_*` 环境变量 |
|
|
168
|
+
| `page` | 分页页码(从 1 开始),**仅对「整个命名空间」生效** | `1` |
|
|
169
|
+
| `page_size` | 分页大小,`0` 表示不分页(返回全部);**仅对「整个命名空间」生效** | `0` |
|
|
170
|
+
| `response_format` | 输出格式:`markdown` / `json` | `markdown` |
|
|
171
|
+
|
|
172
|
+
> 分页为**客户端侧分页**:Apollo OpenAPI 的 `GET namespace` 一次返回全部配置项,
|
|
173
|
+
> 本项目在客户端按 `page`/`page_size` 切片,避免大命名空间一次性输出过多内容。指定 `key` 时分页参数被忽略。
|
|
174
|
+
|
|
175
|
+
> **只读 / 写的区别**:上表「类型 = 只读」的 8 个工具在 `APOLLO_READ_ONLY=true` 下**仍然可用**;
|
|
176
|
+
> 「类型 = 写」的 8 个工具(create/update/delete/releases/cluster/namespace/app/rollback)在该模式下会被
|
|
177
|
+
> **完全排除**——不出现在 `tools/list` 中,Agent 既看不到也无法调用(注册期排除,非运行期拦截)。
|
|
178
|
+
> 这样生产环境开启只读后,Agent 只能查询、绝无意外改配置的风险。
|
|
179
|
+
>
|
|
180
|
+
> 写入与发布分两步:先用 `apollo_create_item` / `apollo_update_item` / `apollo_delete_item` 落配置项,
|
|
181
|
+
> 再用 `apollo_releases` 发布使其对所有客户端生效。写操作均受 `APOLLO_READ_ONLY` 控制。
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
## 配置
|
|
185
|
+
|
|
186
|
+
### 环境变量
|
|
187
|
+
|
|
188
|
+
**MCP 传输与认证**
|
|
189
|
+
|
|
190
|
+
| 变量 | 说明 | 默认值 |
|
|
191
|
+
|------|------|--------|
|
|
192
|
+
| `MCP_TRANSPORT` | 传输协议:`stdio` / `sse` / `streamable-http` | `stdio` |
|
|
193
|
+
| `MCP_HOST` | HTTP 传输监听地址(stdio 忽略) | `0.0.0.0` |
|
|
194
|
+
| `MCP_PORT` | HTTP 传输监听端口(stdio 忽略) | `8000` |
|
|
195
|
+
| `MCP_AUTH_TOKEN` | 设置后启用 Bearer Token 认证,保护 HTTP 接口 | -(不鉴权) |
|
|
196
|
+
| `MCP_LOG_LEVEL` | 日志级别:`debug`/`info`/`warning`/`error` | `info` |
|
|
197
|
+
|
|
198
|
+
**Apollo 连接**
|
|
199
|
+
|
|
200
|
+
| 变量 | 说明 | 默认值 |
|
|
201
|
+
|------|------|--------|
|
|
202
|
+
| `APOLLO_PORTAL_URL` | Apollo Portal(OpenAPI)地址 | `http://localhost:8070` |
|
|
203
|
+
| `APOLLO_TOKEN` | OpenAPI 第三方应用 Token(必填) | - |
|
|
204
|
+
| `APOLLO_APP_ID` | 默认应用 ID(未在工具参数中指定时使用) | - |
|
|
205
|
+
| `APOLLO_ENV` | 默认环境:`DEV`/`FAT`/`UAT`/`PRO` | `DEV` |
|
|
206
|
+
| `APOLLO_CLUSTER` | 默认集群 | `default` |
|
|
207
|
+
| `APOLLO_NAMESPACE` | 默认命名空间(配置文件) | `application` |
|
|
208
|
+
| `APOLLO_OPERATOR` | 写入/发布时记录的操作人(域账号) | `apollo` |
|
|
209
|
+
| `APOLLO_READ_ONLY` | 只读模式,禁用发布功能(适合生产环境) | `false` |
|
|
210
|
+
|
|
211
|
+
> env / app_id / cluster_name / namespace_name 为 Apollo OpenAPI 路径参数(接口层必填);本 MCP 工具允许省略,省略时回退对应 `APOLLO_*` 环境变量,其中 env/cluster/namespace 未配置用内置默认 DEV/default/application;`app_id` 无内置默认值,须由参数或 `APOLLO_APP_ID` 提供,否则报错。
|
|
212
|
+
|
|
213
|
+
### Apollo 概念说明
|
|
214
|
+
|
|
215
|
+
Apollo 的配置组织层级为:**环境(env)> 应用(app)> 集群(cluster)> 命名空间(namespace)> 配置项(item,key/value)**。
|
|
216
|
+
|
|
217
|
+
- `properties` 格式的命名空间:每个 key/value 是一个独立配置项。
|
|
218
|
+
- 非 `properties` 格式(`yaml`/`json`/`xml`/`txt`):整份内容存放在固定 key `content` 下。写入时用 `apollo_create_item` 传 `key=content`、整份内容作为 `value`;再调用 `apollo_releases` 发布(已存在则改用 `apollo_update_item`)。
|
|
219
|
+
|
|
220
|
+
### 只读模式
|
|
221
|
+
|
|
222
|
+
设置 `APOLLO_READ_ONLY=true` 可禁用发布功能,仅允许查询配置,适合生产环境使用:
|
|
223
|
+
|
|
224
|
+
```json
|
|
225
|
+
{
|
|
226
|
+
"env": {
|
|
227
|
+
"APOLLO_READ_ONLY": "true"
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## 多协议传输
|
|
233
|
+
|
|
234
|
+
通过 `MCP_TRANSPORT` 选择传输协议:
|
|
235
|
+
|
|
236
|
+
- **`stdio`(默认)**:标准输入输出,适合 Claude Code、Cursor 等本地 AI 客户端集成。
|
|
237
|
+
- **`sse`**:Server-Sent Events,HTTP 传输,端点 `http://<host>:<port>/sse`。
|
|
238
|
+
- **`streamable-http`**:Streamable HTTP,端点 `http://<host>:<port>/mcp`。
|
|
239
|
+
|
|
240
|
+
以 `streamable-http` 启动示例:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
MCP_TRANSPORT=streamable-http \
|
|
244
|
+
MCP_HOST=0.0.0.0 MCP_PORT=8000 \
|
|
245
|
+
MCP_AUTH_TOKEN=your-strong-token \
|
|
246
|
+
mcp-apollo
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## 接口认证
|
|
250
|
+
|
|
251
|
+
设置 `MCP_AUTH_TOKEN` 后,所有 HTTP 请求必须携带正确 Token,否则返回 `401`:
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
Authorization: Bearer <MCP_AUTH_TOKEN>
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
也兼容 `X-Auth-Token` / `X-MCP-Token` 请求头。健康检查端点 `GET /health` 免鉴权,返回 `{"status":"ok"}`,用于容器探活。
|
|
258
|
+
|
|
259
|
+
> `stdio` 传输为本地进程通信,不涉及网络,无需也不会进行 Token 认证。未设置 `MCP_AUTH_TOKEN` 时 HTTP 接口不鉴权,生产环境请务必配置。
|
|
260
|
+
>
|
|
261
|
+
> 注意区分两类 Token:`MCP_AUTH_TOKEN` 保护本 MCP Server 的 HTTP 接口;`APOLLO_TOKEN` 用于访问 Apollo OpenAPI,两者互不相关。
|
|
262
|
+
|
|
263
|
+
## 容器化部署
|
|
264
|
+
|
|
265
|
+
### 本地构建(Docker)
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
# 构建镜像
|
|
269
|
+
docker build -t mcp-apollo:latest .
|
|
270
|
+
|
|
271
|
+
# 以 streamable-http 运行并启用认证
|
|
272
|
+
docker run -d --name mcp-apollo -p 8000:8000 \
|
|
273
|
+
-e MCP_TRANSPORT=streamable-http \
|
|
274
|
+
-e MCP_AUTH_TOKEN=your-strong-token \
|
|
275
|
+
-e APOLLO_PORTAL_URL=http://your-apollo-portal:8070 \
|
|
276
|
+
-e APOLLO_TOKEN=your-openapi-token \
|
|
277
|
+
-e APOLLO_APP_ID=your-app-id \
|
|
278
|
+
-e APOLLO_ENV=DEV \
|
|
279
|
+
-e APOLLO_CLUSTER=default \
|
|
280
|
+
-e APOLLO_NAMESPACE=application \
|
|
281
|
+
mcp-apollo:latest
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
> 直接拉取已发布的公开镜像、免本地构建的用法见 [快速开始 → Docker](#docker公开镜像免构建)。
|
|
285
|
+
|
|
286
|
+
### Docker Compose
|
|
287
|
+
|
|
288
|
+
复制 `.env.example` 为 `.env` 并按需修改,然后:
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
cp .env.example .env
|
|
292
|
+
docker compose up -d
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
`docker-compose.yml` 已内置 `build`(基于本地 `Dockerfile` 构建并标记为 `mcp-apollo:latest`)和健康检查(探测 `/health`),以非 root 用户运行,适合本地开发部署。
|
|
296
|
+
|
|
297
|
+
> 若想直接运行已发布的公开镜像、跳过本地构建,可将 `docker-compose.yml` 中的 `build:` 段删除,仅保留 `image: ghcr.io/zhouweico/mcp-apollo:latest`。
|
|
298
|
+
|
|
299
|
+
## 使用场景示例
|
|
300
|
+
|
|
301
|
+
配置好后,你可以这样和 AI 对话:
|
|
302
|
+
|
|
303
|
+
**查询配置:**
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
帮我获取 Apollo 中 application 命名空间的所有配置项
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
```
|
|
310
|
+
查看 redis 命名空间里 key 为 timeout 的配置,环境是 PRO
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
```
|
|
314
|
+
获取 app-id 为 order-service 的 gateway 命名空间配置,集群是 default
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
列出 order-service 在 DEV 环境下的所有 Namespace
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
查看 application 命名空间最近一次发布的内容
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
```
|
|
326
|
+
分页查看 application 命名空间第 2 页的配置项(每页 50 条)
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**发布配置:**
|
|
330
|
+
|
|
331
|
+
```
|
|
332
|
+
把 application 命名空间的 timeout 改成 3000 并发布
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
```
|
|
336
|
+
在 redis 命名空间新增配置项 max-connections=100,环境 DEV
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
```
|
|
340
|
+
把下面这段 yaml 作为 content 发布到 order-service 的 application.yaml 命名空间:
|
|
341
|
+
server:
|
|
342
|
+
port: 6379
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## License
|
|
346
|
+
|
|
347
|
+
MIT
|