Recommand MCP by usefulapi

Read documents and the inbox, verify Peppol recipients and send invoices in Recommand.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
88%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,088Tokens (tool definitions)
~3.0 KBTypical response size
Significant attention impact (2.41% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "recommand": {
      "url": "https://recommand.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://recommand.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (9)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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.

Input Schema

{
  "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}.

Input Schema

{
  "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.

Input Schema

{
  "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.

Input Schema

{
  "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}.

Input Schema

{
  "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.

Input Schema

{
  "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.

Input Schema

{
  "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.

Input Schema

{
  "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.

Input Schema

{
  "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"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded9 tools