
KPN Grexx
io.github.WYRE-AI由 GitHub 账号 WYRE-AI 发布v2.3.1更新于 Oct 30, 2026
KPN IRMA on Grexx: address checks, prequalification, customers, orders, mobile and line tools.
概览
面向 Grexx 上 KPN IRMA 电信 API 的 MCP 服务器,让助手查询荷兰地址、产品预资格、订单、客户、SIM 与移动数据。
- 可以做什么
- 查询地址可用技术与速率,并按供应商做产品预资格判断
- 查询订单数据、订单摘要与客户资料
- 查看 SIM、移动设置、移动用量、移动订单与可移植号码
- 执行运营商、Radius 与 RAS 检查,并在 KPN 侧发起线路诊断
- 用公开参考地址测试连接是否可用
- 启用后可额外提供旧版 developer.kpn.com 工具(故障、可用性、SIM 换卡、MSM)
- 适用场景
- 适合 MSP 服务台与电信支持人员在处理客户事务时,让助手查询荷兰地址、订单和移动线路相关的 KPN IRMA 数据。若工作已通过 Grexx 托管的 KPN 接口进行,并希望把这些查询放进助手里,就值得添加。
- 运行要求
- 以本地 stdio 进程运行,来自 GHCR 容器镜像(linux/amd64)。需要 Grexx API 凭据:KPN_GREXX_USERNAME 与 KPN_GREXX_PASSWORD,以及 KPN_GREXX_BASE_URL(无默认值,验收与生产环境不同),可选 KPN_GREXX_TOKEN_URL。网关模式下凭据通过 X-KPN-Grexx-Username 与 X-KPN-Grexx-Password 请求头传入,HTTP 传输还需要 CONDUIT_S2S_SECRET。旧版工具需要 KPN_CLIENT_ID、KPN_CLIENT_SECRET,可选 MSM 凭据对。
安装
在 SourceWeft 中
- 打开 控制台中的 KPN Grexx,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
kpn-mcp
MCP server for KPN IRMA APIs hosted by Grexx (acceptatie: service-accept.grexx.today), aimed at MSP helpdesks. The default surface is realtime XML over OAuth 2.0 client credentials. The SDK sends HTTP Basic to the token endpoint. POST /realtime uses the Bearer token.
Built on the MCP 2026-07-28 spec via the split v2 SDK
(@modelcontextprotocol/server / /node / /client ^2.0.0-beta.5) with dual-era
serving: one shared McpServerFactory behind createMcpHandler({ legacy: 'stateless' })
answers both 2025-era initialize-handshake clients and modern 2026-07-28 envelope clients,
with the same tool list for every caller. Ships as a GHCR container only (no MCPB bundle).
The client is @wyre-ai/node-kpn (Grexx export).
Contract: docs/GREXX.md.
Tools (15, flat)
-
kpn_grexx_test_connection: the SDK mints an OAuth client-credentials token and posts aZipCodeCheckRequest_V6probe for the public reference address 1012JS 1 (portfolio All). Success means the token endpoint andPOST /realtimeaccepted the Bearer token. -
kpn_grexx_zipcode_check: technology and speeds at a Dutch address (ZipCodeCheckRequest_V6→ZipCodeCheckResponse_V5). -
kpn_grexx_prequalification: address and product-type availability per supplier (PrequalificationRequest_V2→PrequalificationResponse_V1). WhenhasBroadbandis true,serviceIdorreferencePhoneNumberis required. -
kpn_grexx_order_data: customer id, product code, and quantity for an order id (OrderDataRequest_V1→OrderDataResponse_V1). -
11 more realtime tools built from the portal request XSDs (see
docs/GREXX.md):kpn_grexx_carrier_info,kpn_grexx_radius_check,kpn_grexx_ras_check,kpn_grexx_start_line_diagnose,kpn_grexx_customer_data,kpn_grexx_order_summary,kpn_grexx_get_sim,kpn_grexx_mobile_settings,kpn_grexx_mobile_usage,kpn_grexx_mobile_orders,kpn_grexx_available_portings.start_line_diagnosestarts a test at KPN, so it is not read-only and is never retried. SIM codes and the RadiusCheck PPP password are masked.
IRMA enforces XSD element order and rejects a bad request with an HTTP 200
NinaResponse; both are handled by the server. Queued writes and Proxymodule
notifications are not exposed.
Set KPN_LEGACY_DEVELOPER_API=1 to also serve the previous 23 developer.kpn.com tools
(disturbances, availability, SIM swap, MSM). They are absent from the default list.
See docs/DESIGN.md for that catalog. Gated MSM writes still require confirmation.
Credentials
Grexx username and password are the OAuth client_id and client_secret (scope=all).
Copy the interface root from the partner portal (API Gegevens). There is no default
base URL: acceptatie and production differ.
Example (acceptatie shape — replace the interface id from API Gegevens):
See env.example. Token mint, cache, and Bearer retry live in
@wyre-ai/node-kpn. Base or token URLs under any other header name (X-KPN-Grexx-Base-Url, ...) are
rejected (HTTP 400).
In gateway mode a request missing X-KPN-Grexx-Username or X-KPN-Grexx-Password is
answered 401 (JSON-RPC error -32001) before the MCP handler runs. It never falls
through to env credentials.
Per-connection Grexx environment (WYREAI-525)
In gateway mode Conduit may send two headers on every call to point that connection at another Grexx environment, such as production:
- Both or neither. When both are absent or empty, the sidecar uses
KPN_GREXX_BASE_URLandKPN_GREXX_TOKEN_URL, also when the credential headers are sent without the URL headers.KPN_GREXX_BASE_URLhas no default and is then required;KPN_GREXX_TOKEN_URLis optional and defaults to the acceptatie token endpoint (https://service-accept.grexx.today/oauth/access_token). Exactly one URL header is HTTP 400. - Honoured only with
X-KPN-Grexx-Username/X-KPN-Grexx-Password; without them the request is 401. - Scheme and authority:
https:only, port 443 only, no userinfo, no query string, no fragment. - Exact-host allowlist (
GREXX_ALLOWED_HOSTSin@wyre-ai/node-kpn):service.grexx.todayandservice-accept.grexx.today. No*.grexx.todaywildcard; IP literals never match. - Paths: token URL path exactly
/oauth/access_token; API URL path must start with/interfaces/kpn/and is the interface root without/realtime(the SDK appends it). - Any violation is HTTP 400 (JSON-RPC
-32600), and the message never echoes the URL. - Private-IP blocking: with header URLs the SDK resolves the host before every token mint and
/realtimepost, and again at socket connect (undicifetchwith a guardedAgent), and refuses private, loopback, link-local (incl.169.254.169.254), CGNAT, reserved/benchmark, ULA and metadata addresses. - Redirects are refused: any 3xx fails the call.
- Every other URL header name (
X-KPN-Grexx-Base-Url, ...) is still rejected with HTTP 400.
HTTP authentication
CONDUIT_S2S_SECRET is required when MCP_TRANSPORT=http. If it is empty, the process
logs an error and exits non-zero. It never prints the secret. Known placeholders
(changeme, change-me, secret, placeholder, example, your-secret,
your-s2s-secret, s2s-secret, replace-me, replace-with-a-real-secret) are
rejected the same way, including when MCP_ALLOW_INSECURE_DEV=1 is set.
MCP_ALLOW_INSECURE_DEV=1 is local development only. The process logs a warning,
does not check X-Gateway-S2S, and listens on 127.0.0.1 only. A non-loopback
MCP_HTTP_HOST (including 0.0.0.0) is ignored in that mode and the override is logged.
MCP_HTTP_HOST is honored when a real secret is set. Unset, that bind stays 0.0.0.0.
Set 127.0.0.1 to keep a secret-backed process on loopback. The container image sets
0.0.0.0 and AUTH_MODE=gateway.
With a real secret, every request except /health and /healthz must include:
v1 is HMAC-SHA256 of the exact string t=<unix seconds> (the same t= prefix that
starts the header), keyed with CONDUIT_S2S_SECRET, hex-encoded. The timestamp must
be within 300 seconds of the server clock. A missing or invalid header is 401.
/health and /healthz stay unauthenticated and do not read credentials. The stdio
transport does not use CONDUIT_S2S_SECRET.
SDK dependency
Import the Grexx client from @wyre-ai/node-kpn (package root), not /legacy.
The dependency is the published range ^2.2.0 (per-connection URLs + SSRF guard from node-kpn#6; Prequalification and OrderData from
node-kpn#5, tag v2.1.0). Token minting
is the HTTP Basic behavior from
node-kpn#4. /legacy
remains the developer.kpn.com client for KPN_LEGACY_DEVELOPER_API=1 only.
This server does not mint the Grexx token.
Running
Docker (linux/amd64 per fleet law). The image listens on 0.0.0.0 inside the
container and defaults to AUTH_MODE=gateway. Publish the port on loopback and
pass the S2S secret. Grexx username and password arrive on each request as
headers. KPN_GREXX_BASE_URL stays in the environment because a caller-supplied
URL is rejected.
Compose refuses to start when CONDUIT_S2S_SECRET is unset, publishes
127.0.0.1:8080:8080, and does not inject KPN_GREXX_USERNAME or
KPN_GREXX_PASSWORD:
Single-tenant HTTP (AUTH_MODE=env) still requires the S2S secret, then uses
KPN_GREXX_USERNAME and KPN_GREXX_PASSWORD:
/health is a shallow liveness probe. It does not call Grexx and does not read credentials.
Legacy developer.kpn.com tools
With KPN_LEGACY_DEVELOPER_API=1 the process also registers kpn_test_connection,
kpn_disturbances_check, kpn_availability_check, kpn_sim_swap_get_date, and the MSM
read/write tools. Credentials are KPN_CLIENT_ID / KPN_CLIENT_SECRET (gateway:
X-KPN-Client-Id / X-KPN-Client-Secret), plus an optional MSM pair. KPN_BASE_URL
stays env-only. A half MSM pair is rejected. MSM writes still create orders, are not
retried, and require confirmation (confirm_destructive_action when the client cannot
be prompted).
Vendor quirks encoded here
- OAuth client_credentials,
scope=all. The SDK sends HTTP Basic to the token endpoint, then Bearer onPOST /realtime(Content-Type: text/xml). Plain XML, no SOAP envelope. Basic Auth is not sent onPOST /realtime. - This server hands token minting to
GrexxClient, which sends HTTP Basic first and may fall back to form-bodyclient_id/client_secretafter HTTP 400/401invalid_client. - The token endpoint is not retried into a Bearer-less call. HTTP 401 remints once inside the SDK.
- IRMA code
108and HTTP 429 are rate limits. Code102is an IP allowlist rejection. - Success codes include
Success(what acceptatie returned for ZipCodeCheck).
License
Apache-2.0 © WYRE Technology
来源:README.md,提交 42bf6f3
工具
0版本历史
5- v2.3.1最新Oct 22, 2026
- v2.3.0Oct 21, 2026
- v2.2.2Oct 20, 2026
- v2.2.1Oct 9, 2026
- v1.1.1Sep 26, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分