mcpField
P
Peppol

Peppol

远程服务
pipeworx.io金融数据05 周前更新

关于 Peppol

Peppol 参与方查询 MCP 服务,供需要验证企业电子发票接收能力的系统使用。它通过 SML、SMP 和 Peppol Directory 查找注册状态、文档类型及 AS4 接收端点。

主要功能

  1. 01查询参与方注册状态
  2. 02列出可接收的文档类型
  3. 03获取 AS4 接收端点
  4. 04按名称或编号搜索企业

适用场景

  1. 01确认企业能否接收电子发票
  2. 02确定发票适用的文档格式
  3. 03查找投递所需的 AS4 地址

MCP 相关

通过 MCP 暴露 Peppol 参与方搜索、注册查询和端点查询工具;也可作为本地 stdio MCP 服务运行。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://gateway.pipeworx.io/peppol/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。