Recommand MCP by usefulapi
Read documents and the inbox, verify Peppol recipients and send invoices in Recommand.
我该使用它吗
质量与安全性
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"recommand": {
"url": "https://recommand.usefulapi.io/mcp"
}
}
}远程端点
https://recommand.usefulapi.io/mcpstreamable-http它能做什么
工具清单
工具(9)
🟢recommand_list_companies(enterpriseNumber, vatNumber)
List every company registered under the team, with its verification and Peppol registration status. Start here to get company ids. Not paginated. Recommand API: GET /api/v1/companies.
输入模式
{
"type": "object",
"properties": {
"enterpriseNumber": {
"description": "Filter by enterprise number.",
"type": "string"
},
"vatNumber": {
"description": "Filter by VAT number.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢recommand_get_company(companyId)
Get one company with its verification and Peppol registration status. Recommand API: GET /api/v1/companies/{companyId}.
输入模式
{
"type": "object",
"properties": {
"companyId": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Company id, for example c_01JQZ8X0M4T7RB6K9V2NDHW3PA (from recommand_list_companies)."
}
},
"required": [
"companyId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢recommand_list_labels
List every label in the team. Use a label id with recommand_list_documents (labelId). Recommand API: GET /api/v1/labels.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢recommand_list_documents(limit, page, companyId, labelId, direction, ...)
List sent and received documents, one page at a time. Filter by company, direction, read status, dates, label or failed delivery (deliveryFailed true finds sends that need attention). Recommand API: GET /api/v1/documents.
输入模式
{
"type": "object",
"properties": {
"limit": {
"description": "Items per page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"page": {
"description": "Page number, starting at 1.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"companyId": {
"description": "One company id or a list.",
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Company id, for example c_01JQZ8X0M4T7RB6K9V2NDHW3PA (from recommand_list_companies)."
},
{
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Company id, for example c_01JQZ8X0M4T7RB6K9V2NDHW3PA (from recommand_list_companies)."
}
}
]
},
"labelId": {
"description": "One label id or a list.",
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Label id (from recommand_list_labels)."
},
{
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Label id (from recommand_list_labels)."
}
}
]
},
"direction": {
"description": "incoming = received, outgoing = sent.",
"type": "string",
"enum": [
"incoming",
"outgoing"
]
},
"search": {
"description": "Free text search.",
"type": "string"
},
"from": {
"description": "Created at or after this ISO 8601 timestamp.",
"type": "string"
},
"to": {
"description": "Created before this ISO 8601 timestamp.",
"type": "string"
},
"isUnread": {
"description": "true = unread only, false = read only.",
"type": "boolean"
},
"deliveryFailed": {
"description": "true = only documents with at least one failed delivery.",
"type": "boolean"
},
"excludeAttachments": {
"description": "true = leave attachments out of the parsed data.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢recommand_get_document(documentId)
Get one sent or received document with its parsed content and delivery status. Recommand API: GET /api/v1/documents/{documentId}.
输入模式
{
"type": "object",
"properties": {
"documentId": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Document id, for example doc_01JQZ8X0M4T7RB6K9V2NDHW3PA (from recommand_list_documents or recommand_get_inbox)."
}
},
"required": [
"documentId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢recommand_get_inbox(companyId)
List incoming documents that are not marked as read yet. Process a document, then call recommand_mark_document_read so it leaves the inbox. Not paginated. Recommand API: GET /api/v1/inbox.
输入模式
{
"type": "object",
"properties": {
"companyId": {
"description": "Only this company's inbox.",
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢recommand_verify_recipient(peppolAddress, includeEndpointDetails, includeBusinessCard)
Look up a Peppol address in the directory before sending. Reports whether it is registered, the company name and the document types it accepts. isValid false means the lookup failed. Recommand API: POST /api/v1/verify.
输入模式
{
"type": "object",
"properties": {
"peppolAddress": {
"type": "string",
"pattern": "^[^\\s:]+:[^\\s]+$",
"description": "Peppol address as scheme:identifier, for example \"0208:0123456789\" (Belgian enterprise number)."
},
"includeEndpointDetails": {
"description": "true = add the endpoint details of each document type.",
"type": "boolean"
},
"includeBusinessCard": {
"description": "true = add the company name and country from the business card.",
"type": "boolean"
}
},
"required": [
"peppolAddress"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴recommand_send_invoice(companyId, recipient, email, pdfGeneration, invoice)
SENDS A REAL INVOICE over the Peppol network, by email, or both. This cannot be undone, and each send counts toward the subscription usage. Check the buyer with recommand_verify_recipient first. Do NOT retry after a timeout: list the outgoing documents first, because the invoice may already be sent. If Peppol delivery fails and no email fallback applies, the call returns HTTP 422 and stores nothing. Recommand API: POST /api/v1/{companyId}/send.
输入模式
{
"type": "object",
"properties": {
"companyId": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "The company that sends the invoice."
},
"recipient": {
"anyOf": [
{
"type": "string",
"pattern": "^[^\\s:]+:[^\\s]+$",
"description": "Peppol address as scheme:identifier, for example \"0208:0123456789\" (Belgian enterprise number)."
},
{
"type": "null"
}
],
"description": "Buyer's Peppol address. Null sends by email only (then email.to is required)."
},
"email": {
"description": "Email delivery. Optional when a Peppol recipient is given.",
"type": "object",
"properties": {
"when": {
"description": "\"always\" sends the email with the Peppol transmission. \"on_peppol_failure\" sends it only when Peppol delivery fails.",
"type": "string",
"enum": [
"always",
"on_peppol_failure"
]
},
"to": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"description": "Email addresses. Required when recipient is null."
},
"subject": {
"type": "string"
},
"htmlBody": {
"type": "string"
},
"replyTo": {
"description": "Where replies go. Defaults to the seller's email address.",
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"required": [
"to"
]
},
"pdfGeneration": {
"description": "Attach a generated PDF of the invoice.",
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"filename": {
"type": "string"
}
}
},
"invoice": {
"type": "object",
"properties": {
"invoiceNumber": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "The invoice number the seller assigned."
},
"issueDate": {
"description": "Defaults to today.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"dueDate": {
"description": "Defaults to one month after the issue date.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"note": {
"type": [
"string",
"null"
]
},
"buyerReference": {
"description": "Buyer routing reference. Defaults to the invoice number.",
"type": [
"string",
"null"
]
},
"purchaseOrderReference": {
"description": "The buyer's purchase order number.",
"type": [
"string",
"null"
]
},
"buyer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Registered name of the party."
},
"street": {
"type": "string",
"minLength": 1,
"description": "Street and number."
},
"street2": {
"description": "Extra address line, for example a suite.",
"type": [
"string",
"null"
]
},
"city": {
"type": "string",
"minLength": 1
},
"postalZone": {
"type": "string",
"minLength": 1,
"description": "Postal code."
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, for example BE."
},
"vatNumber": {
"description": "VAT number with its country prefix, for example BE0123456789.",
"type": [
"string",
"null"
]
},
"enterpriseNumber": {
"description": "National registration number without the country prefix.",
"type": [
"string",
"null"
]
},
"enterpriseNumberScheme": {
"description": "Scheme of enterpriseNumber, for example \"0208\" for a Belgian enterprise number.",
"type": [
"string",
"null"
]
},
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"description": "At least 3 digits.",
"type": [
"string",
"null"
]
}
},
"required": [
"name",
"street",
"city",
"postalZone",
"country"
]
},
"seller": {
"description": "Defaults to the company that sends the invoice.",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Registered name of the party."
},
"street": {
"type": "string",
"minLength": 1,
"description": "Street and number."
},
"street2": {
"description": "Extra address line, for example a suite.",
"type": [
"string",
"null"
]
},
"city": {
"type": "string",
"minLength": 1
},
"postalZone": {
"type": "string",
"minLength": 1,
"description": "Postal code."
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, for example BE."
},
"vatNumber": {
"description": "VAT number with its country prefix, for example BE0123456789.",
"type": [
"string",
"null"
]
},
"enterpriseNumber": {
"description": "National registration number without the country prefix.",
"type": [
"string",
"null"
]
},
"enterpriseNumberScheme": {
"description": "Scheme of enterpriseNumber, for example \"0208\" for a Belgian enterprise number.",
"type": [
"string",
"null"
]
},
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"description": "At least 3 digits.",
"type": [
"string",
"null"
]
}
},
"required": [
"name",
"street",
"city",
"postalZone",
"country"
]
},
"lines": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "The item or service billed."
},
"description": {
"type": [
"string",
"null"
]
},
"sellersId": {
"description": "The seller's item code or SKU.",
"type": [
"string",
"null"
]
},
"quantity": {
"description": "Units billed. Default \"1.00\".",
"type": "string",
"pattern": "^-?\\d+(\\.\\d{1,4})?$"
},
"unitCode": {
"description": "UN/ECE Rec 20 unit code. Default \"C62\" (one unit), \"HUR\" for hours.",
"type": "string"
},
"netPriceAmount": {
"type": "string",
"pattern": "^-?\\d+(\\.\\d{1,4})?$",
"description": "Price of one unit, excluding VAT, for example \"12.40\"."
},
"vat": {
"type": "object",
"properties": {
"percentage": {
"type": "string",
"pattern": "^-?\\d+(\\.\\d{1,4})?$",
"description": "VAT rate in percent, for example \"21.00\". Use \"0.00\" for zero rate."
}
},
"required": [
"percentage"
]
}
},
"required": [
"name",
"netPriceAmount",
"vat"
]
},
"description": "At least one invoice line."
}
},
"required": [
"invoiceNumber",
"buyer",
"lines"
],
"description": "Invoice in Peppol BIS 3 terms. Currency is EUR. Payment means, discounts and attachments are not part of this tool."
}
},
"required": [
"companyId",
"recipient",
"invoice"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡recommand_mark_document_read(documentId, read)
Mark a document as read, which removes it from the inbox. Pass read false to mark it unread again. Calling it again with the same value does no harm. Recommand API: POST /api/v1/documents/{documentId}/mark-as-read.
输入模式
{
"type": "object",
"properties": {
"documentId": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Document id, for example doc_01JQZ8X0M4T7RB6K9V2NDHW3PA (from recommand_list_documents or recommand_get_inbox)."
},
"read": {
"description": "true (default) = read. false = unread.",
"type": "boolean"
}
},
"required": [
"documentId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}社区
证据