关于 Peppol
Peppol 参与方查询 MCP 服务,供需要验证企业电子发票接收能力的系统使用。它通过 SML、SMP 和 Peppol Directory 查找注册状态、文档类型及 AS4 接收端点。
主要功能
- 01查询参与方注册状态
- 02列出可接收的文档类型
- 03获取 AS4 接收端点
- 04按名称或编号搜索企业
适用场景
- 01确认企业能否接收电子发票
- 02确定发票适用的文档格式
- 03查找投递所需的 AS4 地址
MCP 相关
通过 MCP 暴露 Peppol 参与方搜索、注册查询和端点查询工具;也可作为本地 stdio MCP 服务运行。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://gateway.pipeworx.io/peppol/mcpclaude mcp add --transport http pipeworx-io-peppol https://gateway.pipeworx.io/peppol/mcp{"mcpServers":{"pipeworx-io-peppol":{"type":"http","url":"https://gateway.pipeworx.io/peppol/mcp"}}}在 Cursor 中打开{"servers":{"pipeworx-io-peppol":{"type":"http","url":"https://gateway.pipeworx.io/peppol/mcp"}}}在 VS Code 中打开{"mcpServers":{"pipeworx-io-peppol":{"type":"http","url":"https://gateway.pipeworx.io/peppol/mcp"}}}{"mcpServers":{"pipeworx-io-peppol":{"serverUrl":"https://gateway.pipeworx.io/peppol/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
@pipeworx/peppol
检查公司是否已在 Peppol 电子发票网络注册,列出其接受的文档类型,并获取发送方所需的 AS4 端点——实时查询 Peppol SML 和 SMP,无需加入网络。
属于 Pipeworx——一个将 AI Agent 连接到 1683+ 个实时数据源的 MCP 网关。
工具
lookup_participant(participantId, scheme?, environment?)— 权威的注册状态查询。通过 SML(DNS/BDXL)解析参与方对应的 SMP,并读取 ServiceGroup。回答“我能否向这家公司发送电子发票,以及可以使用哪些格式?”。如果没有 SML 记录,则返回registered: false和原因,以及determinate。get_participant_endpoint(participantId, documentTypeId, documentTypeScheme?, scheme?, environment?)— 某种文档类型的 AS4 交付详情:传输配置文件、接收端点 URL、流程标识符,以及服务的启用/过期时间范围。回答“我应该在哪里实际交付文档,以及该服务是否仍有效?”。search_participants(q, country?, limit?)— 按公司名称、增值税号或组织编号搜索 Peppol Directory。回答“这家公司的 Peppol 标识符是什么?”,这是另外两个工具所需的输入。
认证
无需密钥。所有三个上游服务都是公开的,无需加入 Peppol 网络、无需 Access Point 合同,也无需 PKI 证书。网络发现层有意开放读取权限——这样任何发送方都能找到任何接收方。
(注意这种不对称性:发现信息可以公开读取,但不能直接通过 AS4 发送。交付文档需要经过认证的 Access Point 和 Peppol 证书。此工具包仅涵盖读取部分。)
数据源
https://cloudflare-dns.com/dns-query和https://dns.google/resolve— SML NAPTR 查询,通过 DNS-over-HTTPS 执行,因为 Workers 运行时没有 DNS 解析器。优先使用 Cloudflare,Google 作为备用。- SML 区域
iso6523-actorid-upis.edelivery.tech.ec.europa.eu(生产环境)和iso6523-actorid-upis.acc.edelivery.tech.ec.europa.eu(试点环境),由 European Commission 运营——将参与方标识符映射到其 SMP 基础 URL。 - 各参与方的 SMP(NAPTR 指定的主机,例如
https://smp.elma-smp.no、https://smp.horus-software.be)——提供/{scheme}::{participantId}和/{scheme}::{participantId}/services/{docTypeId}。 https://directory.peppol.eu/search/1.0/json— Peppol Directory,这是网络中由用户选择加入的企业名录索引,由 OpenPEPPOL 运营。
开始使用前值得了解的事项
所有文档都在介绍的 MD5 查询方案已经失效。 大多数 Peppol 文档(以及大多数博客文章)都将 SML 描述为:B-{md5(lowercased participant id)}.iso6523-actorid-upis.{zone} 解析到一个 CNAME。如今,这种方式对所有参与方都会返回 NXDOMAIN,包括你能在 Peppol Directory 中查到的参与方。当前使用的方案是 OASIS BDXL:记录名称是对小写标识符进行 SHA-256 运算后得到的无填充 base32 编码,记录类型为 NAPTR,其服务字段为 Meta:SMP,正则表达式字段中包含 SMP URL,格式为 !.*!https://smp.example/!。如果一个你确定已注册的公司返回 NXDOMAIN,说明你走的是 MD5 路径,而不是遇到了未注册的公司——如果你相信文档而不是实时 dig 查询,这会白白耗费一小时。
只对标识符值进行哈希。 SHA-256 的输入是 0192:989995278,而不是 iso6523-actorid-upis::0192:989995278。加入方案前缀会悄悄导致 NXDOMAIN,看起来就像“未注册”。
两个 DoH 提供商返回的 NAPTR RDATA 格式不同。 Cloudflare 会为字符串加引号(100 10 "U" "Meta:SMP" "!.*!https://x!" .),Google 则不会(100 10 U Meta:SMP !.*!https://x! .)。两种格式都要解析,否则回退路径会悄悄返回空结果。
不同 SMP 对 Accept 的处理并不一致。 smp.elma-smp.no(基于 Spring)收到 Accept: application/xml 时会返回 406 Not Acceptable,而 smp.horus-software.be 可以正常提供内容。两者都接受 text/xml。应发送 q 值列表,否则这个工具包可以用于某个运营方的 SMP,却会在另一个运营方那里收到 406——而这里的 406 看起来像是参与方出了问题,而不是我们的请求头有误。
不同 SMP 实现使用的 XML 前缀各不相同。 相同的元素在某个运营方那里可能是 smp:ServiceGroup,在另一个运营方那里则是 ns2:ServiceGroup。应按本地名称匹配,绝不要按前缀匹配。
未出现在 Directory 中,不代表未接入网络。 名片采用自愿加入机制,因此 search_participants 没有返回结果,并不意味着公司无法接收电子发票。通过 SML 调用 lookup_participant 才是权威查询;Directory 是一个便于通过名称查找标识符的索引。
参与方标识符的格式是 {icd}:{value},ICD 前缀是标识符的一部分。 989995278 是挪威组织编号;0192:989995278 才是 Peppol 参与方。同一家公司可以使用多个 ICD 注册(例如,同一家比利时实体使用 0208 公司编号和 9925 增值税号),每种注册都是独立的,并拥有各自的文档类型。
快速开始
添加到你的 MCP 客户端(Claude Desktop、Cursor、Windsurf 等):
{
"mcpServers": {
"peppol": {
"url": "https://gateway.pipeworx.io/peppol/mcp"
}
}
}
此端点实际提供的内容
https://gateway.pipeworx.io/peppol/mcp 上的 tools/list 会返回上表中的工具,以及 Pipeworx 的共享元工具——ask_pipeworx、discover_tools、search_within、remember/recall,还有网关范围内的其他工具。因此,你看到的工具数量会多于此表:目前,单个工具包端点除了列出该工具包自身的工具外,还会列出约 30 个共享工具。连接的 initialize 响应会说明其确切范围,并且是当天情况的权威说明。
这是有意设计的,并非意外多路复用。元工具可以让受限连接通过 ask_pipeworx 跨整个目录路由,从而回答此工具包未涵盖的问题,而无需额外添加一个 MCP 服务。目前无法在不包含这些工具的情况下挂载工具包端点;如果额外的架构定义占用的上下文超过了路由功能带来的价值,请连接一次完整网关,而不是连接多个工具包端点。
你也可以连接完整的 Pipeworx 网关,直接列出所有工具包的工具,而不只是此工具包的工具:
{
"mcpServers": {
"pipeworx": {
"url": "https://gateway.pipeworx.io/mcp"
}
}
}
两个 URL 都连接到同一个网关和相同的 1683+ 个数据源。唯一的区别是哪个工具包的工具会被直接列出;通过任一 URL,ask_pipeworx 都能访问所有工具。
没有 MCP 客户端?通过 HTTP 调用
curl -X POST https://gateway.pipeworx.io/v1/tools/lookup_participant \
-H 'Content-Type: application/json' \
-d '{"participantId":"0192:989995278"}'
首次调用无需账号。查看任意工具:GET https://gateway.pipeworx.io/v1/tools/lookup_participant。查找工具:使用 {"query":"..."} 调用 POST https://gateway.pipeworx.io/v1/tools/search_packs。
独立运行(无需网关账号)
此软件包也可作为本地 stdio MCP 服务运行——无需 Pipeworx 账号,也无需经过网关:
{
"mcpServers": {
"peppol": {
"command": "npx",
"args": ["-y", "@pipeworx/mcp-peppol"]
}
}
}
或者直接运行,确认其能够启动:
npx -y @pipeworx/mcp-peppol
它通过 stdin/stdout 使用 MCP,并响应 initialize/tools/list/tools/call,仅提供此软件包的工具——不包含上方网关连接所添加的任何共享元工具。相同的源代码,相同的工具,无需 ask_pipeworx 路由。
使用 ask_pipeworx
你可以用简单的英语提问,而不是直接调用工具——这既适用于上方的软件包端点,也适用于完整网关:
ask_pipeworx({ question: "your question about Peppol data" })
网关会选择合适的工具并自动填写参数。
更多信息
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。