接入 MCP 数据服务
在 MCP 客户端里填入 MCP 地址(https://dev.thuwater.com/mcp/data)、用 THWater 专用 MCP 账号登录一次即可开始使用;脚本对接需要请求 openid profile pg-mcp-audience 三个 scope,动态注册(DCR)客户端必须在注册报文中声明这三个 scope。
MCP 数据服务不需要安装任何软件,也不需要手工配置 Token:客户端负责发现登录入口、引导登录、自动续期。下面按"客户端接入"和"脚本接入"两条路说明。
开始之前
- 一个支持 MCP 的客户端(能填 Streamable HTTP 地址即可);
- 一个已开通 MCP 数据权限的 THWater 账号(用 SSO 登录,不需要单独的密码);
- 网络能访问
dev.thuwater.com与sso.thuwater.com。
第 1 步:填服务器地址
| 配置项 | 值 |
|---|---|
| 服务器地址(URL) | https://dev.thuwater.com/mcp/data |
| 传输方式 | Streamable HTTP(JSON-RPC 2.0,单端点) |
| 是否需要 initialize 握手 | 不需要(无状态,每次请求独立) |
| 认证 | OAuth 2.1 Bearer;客户端自动发现登录入口 |
以 mcp.json 形式的客户端为例:
{
"mcpServers": {
"thwater-data": {
"type": "streamable-http",
"url": "https://dev.thuwater.com/mcp/data"
}
}
}第 2 步:完成一次登录
首次连接时会发生这些事,都是自动的:
- 客户端调用接口,服务端返回
401并附带登录入口地址(WWW-Authenticate: Bearer resource_metadata="…"); - 支持自动发现的客户端读取该地址,找到 THWater 统一登录(SSO)服务,并自动打开浏览器;
- 你在浏览器里用 THWater 账号登录,并点击同意授权(密码只输入到 SSO 页面,MCP 服务全程看不到);
- 客户端拿到 Bearer 令牌并重新发起请求,连接建立。令牌 15 分钟有效,客户端会用 refresh token 自动续期,你不需要管。
如果你的客户端不主动打开浏览器,可以让它手动触发一次登录,或在浏览器里打开 SSO 页面先登录,再回到客户端重试。详见「常见问题」。
第 3 步:确认连接成功
连接成功后,先问一个不涉及具体项目的问题来验证权限范围:
我现在能看哪些项目?如果返回了项目清单(例如"THWater智慧排水监测"),说明账号、权限、登录全部正常。接下来就可以按「使用示例」里的方式提问了。
脚本 / CLI 接入
程序对接时不要共用个人密码:要么申请服务账号,要么走 OAuth 的设备码/授权码流程获取令牌,然后带 Authorization: Bearer <token> 调用接口。
curl -s -X POST https://dev.thuwater.com/mcp/data \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'申请令牌时请求的 scope 必须是:
openid profile pg-mcp-audience # 需要 refresh token 时再加 offline_access只请求 openid 与 pg-mcp-audience 时,虽然能正常登录并拿到令牌,但调用接口会一直返回 401(且不提示原因)。原因是服务端用令牌里的用户名(preferred_username)识别账号,而该字段属于 profile scope。申请令牌时请务必带上 profile。
| scope | 是否必需 | 作用 |
|---|---|---|
openid | 必需 | 标准 OIDC 登录 |
profile | 必需 | 提供 preferred_username,服务端据此识别你的 MCP 账号 |
pg-mcp-audience | 必需 | 把令牌限定给本 MCP 资源使用 |
offline_access | 可选 | 需要 refresh token 静默续期时加 |
若平台已提供固定的 client_id/secret,直接使用即可。自行对接时也可让客户端通过 OAuth 动态客户端注册(RFC 7591,DCR)登记,注册报文必须一次性声明 scope 与回调地址:
curl -s -X POST https://sso.thuwater.com/realms/thdatalake/clients-registrations/openid-connect \
-H "Content-Type: application/json" \
-d '{
"client_name": "my-mcp-client",
"grant_types": ["authorization_code"],
"response_types": ["code"],
"redirect_uris": ["http://127.0.0.1:8973/callback"],
"token_endpoint_auth_method": "client_secret_basic",
"scope": "openid profile pg-mcp-audience"
}'① scope 必须在注册报文中声明为 openid profile pg-mcp-audience。只声明 openid 的客户端,后续请求 profile 会被 SSO 拒绝(invalid_scope),且注册接口不支持事后补改 scope(只能重建客户端)。② 必须带 `redirect_uris`:授权码流程要靠它回调取 code,纯 client_credentials 客户端无法引导浏览器登录。
然后走标准授权码流程 + PKCE:拼接 SSO 授权链接(scope=openid profile pg-mcp-audience,附 state 与 code_challenge)→ 浏览器打开链接、用 THWater 账号登录并点「是」同意 → 回调地址拿到 code → 换取令牌:
curl -s -X POST https://sso.thuwater.com/realms/thdatalake/protocol/openid-connect/token \
-u "<client_id>:<client_secret>" \
-d "grant_type=authorization_code&code=<code>\
&redirect_uri=http%3A%2F%2F127.0.0.1%3A8973%2Fcallback\
&code_verifier=<pkce_verifier>"拿到令牌后,带上 Authorization: Bearer <token> 按上文 curl 调用即可(15 分钟有效,过期需重新走授权流程,或申请时加 offline_access 用 refresh token 续期)。
用 client_credentials 直接取令牌调用会返回 401:机器令牌没有用户名 claim,服务端无法把它映射到 MCP 账号。脚本对接请走上面的授权码流程(人工登录一次),或向管理员申请已开通 MCP 数据权限的服务账号。