room-stu-fault-mcp
教室故障排查 MCP 服务,面向阿里云百炼 uvx / PyPI 部署。
提供四个工具(业务逻辑在 src/room_stu_fault_mcp/tools/):
| 工具 | 说明 | 填充位置 |
|---|---|---|
query_classroom_logs |
阿里云教室日志(SLS SDK) | tools/classroom_logs.py → fetch_classroom_logs |
get_room_network_info |
自有服务器 Mongo 网络信息(HTTP) | tools/network_info.py → fetch_room_network_info |
get_classroom_tickets |
教室工单信息(HTTP) | tools/tickets.py → fetch_classroom_tickets |
diagnose_classroom_fault |
按问题描述(description)结合日志和上下行网络做千问诊断(不拉工单;查工单用 get_classroom_tickets) |
tools/diagnose.py → diagnose_classroom_fault |
未接好真实接口时,工具会返回模拟数据,便于本地和百炼联调。
本地开发
需要 Python 3.10+(本机默认 python3 若是 3.9,不要用它建 venv)。推荐用 uv:
uv python install 3.12
uv venv --python 3.12
source .venv/bin/activate
uv pip install -e .
cp .env.example .env # 按需填写
或指定解释器:
/path/to/python3.12 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e .
本地以 stdio 启动:
room-stu-fault-mcp
# 或
python -m room_stu_fault_mcp
# 或
fastmcp run src/room_stu_fault_mcp/server.py:mcp
怎么调用测试
stdio 服务本身不会打印结果,要用 Client 去调工具。
1. FastMCP 内存调用(推荐,最快)
source .venv/bin/activate
python examples/call_tools.py
等价手写:
import asyncio
from fastmcp import Client
from room_stu_fault_mcp.server import mcp
async def main():
async with Client(mcp) as client:
print(await client.list_tools())
print(await client.call_tool("query_classroom_logs", {"serial": "R101", "userid": "414325797", "sdkversion": "5.1.0", "osversion": "ios"}))
print(await client.call_tool("get_room_network_info", {
"company_id": 10097,
"serial": "1000292304",
"room_unit_id": 575718,
"userid": "379180147",
"receive_userid": "1b3e2441-b89d-2ef9-fa97-431d101daa51",
}))
print(await client.call_tool("get_classroom_tickets", {
"company_id": 120554,
"serial": "1248513074",
"userid": "379180147",
"starttime": 1788364800,
"endtime": 1788451200,
}))
print(await client.call_tool("diagnose_classroom_fault", {
"company_id": 120554,
"serial": "120554",
"userid": "379180147",
"room_unit_id": 575718,
"receive_userid": "1b3e2441-b89d-2ef9-fa97-431d101daa51",
"sdkversion": "5.1.0",
"osversion": "ios",
"starttime": 1788364800,
"endtime": 1788451200,
"description": "看不到老师画面",
}))
asyncio.run(main())
2. 只测业务方法(不经过 MCP)
python -c "from room_stu_fault_mcp.tools.classroom_logs import fetch_classroom_logs; print(fetch_classroom_logs('R101', '414325797', '5.1.0', 'ios'))"
python -c "from room_stu_fault_mcp.tools.network_info import fetch_room_network_info; print(fetch_room_network_info(10097, '1000292304', 575718, '379180147', '1b3e2441-b89d-2ef9-fa97-431d101daa51'))"
python -c "from room_stu_fault_mcp.tools.tickets import fetch_classroom_tickets; print(fetch_classroom_tickets(120554, '1248513074', '379180147', 1788364800, 1788451200))"
python -c "from room_stu_fault_mcp.tools.diagnose import diagnose_classroom_fault; print(diagnose_classroom_fault(120554, '120554', '379180147', 575718, '1b3e2441-b89d-2ef9-fa97-431d101daa51', '5.1.0', 'ios', description='看不到老师画面'))"
3. MCP Inspector 可视化调试
fastmcp dev src/room_stu_fault_mcp/server.py:mcp
浏览器打开后,在 Tools 里点工具即可。综合诊断用 diagnose_classroom_fault,需配置 DASHSCOPE_API_KEY。
Cursor / Claude Desktop 本地调试配置:
{
"mcpServers": {
"room-stu-fault": {
"command": "uvx",
"args": ["--from", ".", "room-stu-fault-mcp"],
"env": {
"ALIBABA_CLOUD_ACCESS_KEY_ID": "",
"ALIBABA_CLOUD_ACCESS_KEY_SECRET": "",
"ALIYUN_SLS_ENDPOINT": "cn-beijing.log.aliyuncs.com",
"ALIYUN_SLS_PROJECT": "tk-client-log",
"ALIYUN_SLS_TOPIC_ALL_CLIENTS": "log-all-clients",
"ALIYUN_SLS_TOPIC_IOS": "log-ios",
"ALIYUN_SLS_TOPIC_ANDROID": "log-androidstore",
"ALIYUN_SLS_TOPIC_JS": "log-js",
"NETWORK_API_URL": "https://testing-dash-api.talk-cloud.com",
"NETWORK_API_PATH": "/room/{serial}/user/figure",
"NETWORK_API_TOKEN": "",
"TICKET_API_URL": "https://testing.talk-cloud.net",
"TICKET_API_PATH": "/ClientAPI/workOrderListByAI",
"TICKET_API_TOKEN": "",
"DASHSCOPE_API_KEY": "",
"QWEN_MODEL": "qwen3.8-max",
"QWEN_API_BASE": "https://dashscope.aliyuncs.com/compatible-mode/v1"
}
}
}
}
发布到 PyPI
包名必须全局唯一。发布前把 pyproject.toml 里的 name / version 改成你的。
不要用系统自带的 pip(本机默认常是 Python 3.9,会和 botocore / selenium 抢 urllib3)。用项目虚拟环境或 uv:
source .venv/bin/activate
uv pip install build twine
python -m build
python -m twine upload dist/*
更省事:
uv build
uv publish --token pypi-xxxxxxxx
部署到阿里云百炼
- 控制台 → MCP 管理 → 创建 MCP 服务 → 使用脚本部署
- 安装方式选 uvx
- 配置粘贴如下(把包名换成你发布到 PyPI 的名字):
{
"mcpServers": {
"room-stu-fault": {
"type": "stdio",
"timeout": 600,
"command": "uvx",
"args": [
"-q",
"--python",
"3.12",
"--index-url",
"https://mirrors.aliyun.com/pypi/simple",
"--from",
"room-stu-fault-mcp==0.1.5",
"room-stu-fault-mcp"
],
"env": {
"UV_NO_PROGRESS": "1",
"UV_PYTHON_INSTALL_MIRROR": "https://registry.npmmirror.com/-/binary/python-build-standalone",
"ALIBABA_CLOUD_ACCESS_KEY_ID": "你的 AccessKey ID",
"ALIBABA_CLOUD_ACCESS_KEY_SECRET": "你的 AccessKey Secret",
"ALIYUN_SLS_ENDPOINT": "cn-beijing.log.aliyuncs.com",
"ALIYUN_SLS_PROJECT": "tk-client-log",
"ALIYUN_SLS_TOPIC_ALL_CLIENTS": "log-all-clients",
"ALIYUN_SLS_TOPIC_IOS": "log-ios",
"ALIYUN_SLS_TOPIC_ANDROID": "log-androidstore",
"ALIYUN_SLS_TOPIC_JS": "log-js",
"NETWORK_API_URL": "https://testing-dash-api.talk-cloud.com",
"NETWORK_API_PATH": "/room/{serial}/user/figure",
"NETWORK_API_TOKEN": "",
"TICKET_API_URL": "https://testing.talk-cloud.net",
"TICKET_API_PATH": "/ClientAPI/workOrderListByAI",
"TICKET_API_TOKEN": "",
"DASHSCOPE_API_KEY": "你的百炼 API Key",
"QWEN_MODEL": "qwen3.8-max",
"QWEN_API_BASE": "https://dashscope.aliyuncs.com/compatible-mode/v1"
}
}
}
}
- 部署方式选 极速模式(不要用按次计费的基础模式)。uvx 首次拉 Python 和依赖经常超过 1 分钟,基础模式冷启动会直接触发初始化超时。
- 部署成功后,在智能体 / 工作流里勾选该 MCP。日常排查可调
diagnose_classroom_fault(按description结合日志和上下行诊断;查工单用get_classroom_tickets)。
若出现 11200057 / Initialization request timeout: no response within 1m:这是 MCP 握手超时,不是诊断工具本身失败。按下面处理:
- 确认已开 极速模式,配置里有
"timeout": 600,args带-q且 pin 了正确版本(不要再用==0.1.1)。 - 环境变量加上
UV_NO_PROGRESS=1和国内镜像(见上),避免 uvx 进度输出打到 stdout、或从 GitHub 拉 Python 超时。 - 到函数计算 FC 看启动日志:若卡在
Downloading/Resolved,多点几次「测试」把缓存打热,第二次通常就能握手成功。 - 不要设置
MCP_TRANSPORT=rest或sse,百炼脚本部署必须走默认 stdio。
若出现 503 No active SSE connection for session:先重试 2~3 次;仍失败则到函数计算 FC 打开日志服务看 uvx 是否启动失败,然后停掉服务、改成极速模式后重新部署。
环境变量
| 变量 | 用途 |
|---|---|
ALIBABA_CLOUD_ACCESS_KEY_ID |
阿里云 AK |
ALIBABA_CLOUD_ACCESS_KEY_SECRET |
阿里云 SK |
ALIYUN_SLS_ENDPOINT |
SLS 地域入口 |
ALIYUN_SLS_PROJECT |
SLS Project |
ALIYUN_SLS_TOPIC_ALL_CLIENTS |
SDK >= 5 使用的日志库 topic,默认 log-all-clients |
ALIYUN_SLS_TOPIC_IOS |
SDK < 5 且 iOS 的日志库 topic,默认 log-ios |
ALIYUN_SLS_TOPIC_ANDROID |
SDK < 5 且 Android 的日志库 topic,默认 log-androidstore |
ALIYUN_SLS_TOPIC_JS |
SDK < 5 且其他端的日志库 topic,默认 log-js |
NETWORK_API_URL |
网络信息服务地址 |
NETWORK_API_PATH |
网络信息接口路径,可用 {serial} / {room_unit_id} 占位 |
NETWORK_API_TOKEN |
网络信息接口 Token(可选) |
TICKET_API_URL |
工单服务地址,如 https://testing.talk-cloud.net |
TICKET_API_PATH |
工单接口路径,如 /ClientAPI/workOrderListByAI |
TICKET_API_TOKEN |
工单接口 Token(可选) |
DASHSCOPE_API_KEY |
百炼 / DashScope API Key,诊断工具调用千问时必填 |
QWEN_MODEL |
千问模型名,默认 qwen3.8-max |
QWEN_API_BASE |
兼容模式地址,默认 https://dashscope.aliyuncs.com/compatible-mode/v1 |
Metadata
Release files for room-stu-fault-mcp 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| room_stu_fault_mcp-0.1.5.tar.gz | 20.3 kB | Without provenance | Details for room_stu_fault_mcp-0.1.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| room_stu_fault_mcp-0.1.5-py3-none-any.whl | Python 3 | none | any | Details for room_stu_fault_mcp-0.1.5-py3-none-any.whl |
Total release size: 44.4 kB
Release files / room_stu_fault_mcp-0.1.5.tar.gz
| Download URL | room_stu_fault_mcp-0.1.5.tar.gz |
|---|---|
| Size | 20.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0ed1fcb2723a8dd6f8adfe0ac1dbbe327cd032f58b38eea53a6161dc4cf2e6c9
|
|
BLAKE2b-256 checksum How to use checksums |
c5238ffc488777b90de2dc2c58fcd15ce7526de06695f1786b91cd07d8269820
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / room_stu_fault_mcp-0.1.5-py3-none-any.whl
| Download URL | room_stu_fault_mcp-0.1.5-py3-none-any.whl |
|---|---|
| Size | 24.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
71bae6034a83ae30cc0a9c044cc94e33c58152f2cd48a1247ebb7cd2a873ff35
|
|
BLAKE2b-256 checksum How to use checksums |
a623ec2006427147ac9590ceaaea9aa98d41ca3a6aa73e43ee6b0fa8adc72f4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for room-stu-fault-mcp 0.1.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.