Skip to content

Safefood 360 MCP by usefulapi

io.usefulapi/safefood-360usefulapi.iostreamable-httpv1.0.0Scanned

Read Safefood 360 documents, complaints, suppliers, materials; create complaints, update documents.

17 tools: 2 can delete or cancel things, 1 change things and 14 only read.

Tools: 2 delete, 0 irreversible, 1 write, 14 read.
  • Reads private data · 8
  • Reads text others write · 17
  • Can send data out · 1
  • No findings

Anlyon alternative

3 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

17 tools

Deletes or cancels 2Claude Code: deny
  • safefood360_update_customerWRITE: change the name, phone, mobile and/or notes of a customer in Safefood 360 (JSON patch of those fields; others stay as they are).Reads text others writeNo findings

    Why it is in this group

    • The name "safefood360_update_customer" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: change the name, phone, mobile and/or notes of a customer in Safefood 360 (JSON patch of those fields; others stay as they are). notes REPLACES the existing notes. PATCH /customers/sites/{siteId}/v1/customers/{identifier}.

    Annotations the server declares

    • title: Update customer
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • safefood360_update_documentWRITE: change the title, description and/or folder of a controlled document in Safefood 360 (JSON patch; fields you leave out stay as they are).Reads text others writeNo findings

    Why it is in this group

    • The name "safefood360_update_document" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: change the title, description and/or folder of a controlled document in Safefood 360 (JSON patch; fields you leave out stay as they are). It does not publish a new version or change the review workflow. Returns the updated document. PATCH /documents/sites/{siteId}/v1/documents/{identifier}.

    Annotations the server declares

    • title: Update document
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
Changes things 1Claude Code: ask
  • safefood360_create_complaintWRITE: record a NEW complaint in Safefood 360 (it may trigger the site's complaint workflow and notifications).Reads text others writeCan send data outNo findings

    Why it is in this group

    • The name "safefood360_create_complaint" says "create": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • outboundThe input takes a destination (input.contact_person.phone): what the tool writes goes there.
    Description, as the server wrote it
    WRITE: record a NEW complaint in Safefood 360 (it may trigger the site's complaint workflow and notifications). Not idempotent: calling it twice creates two complaints. Safefood 360 validates the fields (ids such as source, company and recorded_by are GUIDs from your site's lists) and rejects a request that lacks required ones. POST /complaints/sites/{siteId}/v1/complaints/.

    Annotations the server declares

    • title: Create complaint
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
Only reads 14Show 14 read-only tools
  • safefood360_get_batching_recordOne batching (traceability) record by its id (GUID).Reads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_batching_record" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One batching (traceability) record by its id (GUID). GET /batching/sites/{siteId}/v1/batching/records/{recordId}.

    Annotations the server declares

    • title: Get batching record
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_get_complaintOne complaint by its id (GUID).Reads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_complaint" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One complaint by its id (GUID). GET /complaints/sites/{siteId}/v1/complaints/{id}.

    Annotations the server declares

    • title: Get complaint
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_get_customerOne customer by its identifier (name, addresses, phone, notes).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_customer" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "note": it reads notes.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One customer by its identifier (name, addresses, phone, notes). The vendor offers no customer list. GET /customers/sites/{siteId}/v1/customers/{identifier}.

    Annotations the server declares

    • title: Get customer
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_get_documentOne controlled document by its identifier: title, description, version, folder, responsible person and workflow.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_document" says "get": a word for reading.

    What it can reach

    • private-dataThe name "safefood360_get_document" says "get" and "document": it reads documents.
    • private-dataThe description's first sentence says "document": it reads documents.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One controlled document by its identifier: title, description, version, folder, responsible person and workflow. GET /documents/sites/{siteId}/v1/documents/{identifier}.

    Annotations the server declares

    • title: Get document
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_get_document_reviewOne document review by its review number.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_document_review" says "get": a word for reading.

    What it can reach

    • private-dataThe name "safefood360_get_document_review" says "get" and "document": it reads documents.
    • private-dataThe description's first sentence says "document": it reads documents.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe name "safefood360_get_document_review" says "get" and "review": it reads comments, which other people can write.
    • untrusted-inputThe description's first sentence says "review": it reads comments, which other people can write.
    Description, as the server wrote it
    One document review by its review number. GET /documents/sites/{siteId}/v1/documentreviews/{no}.

    Annotations the server declares

    • title: Get document review
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_get_employeeOne employee record by its identifier (training/HR master data of the site).Reads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_employee" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One employee record by its identifier (training/HR master data of the site). Contains personal data: use it only for the question asked. The vendor offers no employee list. GET /employees/sites/{siteId}/v1/employees/{identifier}.

    Annotations the server declares

    • title: Get employee
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_get_final_productOne final (finished) product by its identifier: name, folder, categories, barcode, specifications and the materials it is made of.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_final_product" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "folder": it reads files.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One final (finished) product by its identifier: name, folder, categories, barcode, specifications and the materials it is made of. The vendor offers no final-product list. GET /finalproducts/sites/{siteId}/v1/finalproducts/{identifier}.

    Annotations the server declares

    • title: Get final product
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_get_materialOne material by its external id.Reads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_material" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One material by its external id. GET /v1/materials/{externalId}?siteId=.

    Annotations the server declares

    • title: Get material
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_get_supplierOne supplier by its external id.Reads text others writeNo findings

    Why it is in this group

    • The name "safefood360_get_supplier" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One supplier by its external id. GET /v1/suppliers/{externalId}?siteId=.

    Annotations the server declares

    • title: Get supplier
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_list_complaintsList customer complaints (number, name, risk, date, company, source, contact person, product/material, description, created/modified).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "safefood360_list_complaints" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "contact": it reads contacts.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List customer complaints (number, name, risk, date, company, source, contact person, product/material, description, created/modified). Supports OData $filter, $orderby, $top, $skip and $count. GET /complaints/sites/{siteId}/v1/complaints.

    Annotations the server declares

    • title: List complaints
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_list_document_reviewsList document reviews (the periodic review records of controlled documents).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "safefood360_list_document_reviews" says "list": a word for reading.

    What it can reach

    • private-dataThe name "safefood360_list_document_reviews" says "list" and "document": it reads documents.
    • private-dataThe description's first sentence says "list" and "document": it reads documents.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe name "safefood360_list_document_reviews" says "list" and "review": it reads comments, which other people can write.
    • untrusted-inputThe description's first sentence says "list" and "review": it reads comments, which other people can write.
    Description, as the server wrote it
    List document reviews (the periodic review records of controlled documents). Supports OData $filter, $orderby, $top, $skip and $count; use it to find reviews that are due or overdue. GET /documents/sites/{siteId}/v1/documentreviews/.

    Annotations the server declares

    • title: List document reviews
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_list_documentsList controlled documents of the Safefood 360 site (title, description, version, folder, responsible person, review/approval workflow, created/modified).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "safefood360_list_documents" says "list": a word for reading.

    What it can reach

    • private-dataThe name "safefood360_list_documents" says "list" and "document": it reads documents.
    • private-dataThe description's first sentence says "list" and "document": it reads documents.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "list" and "review": it reads comments, which other people can write.
    Description, as the server wrote it
    List controlled documents of the Safefood 360 site (title, description, version, folder, responsible person, review/approval workflow, created/modified). Supports OData $filter, $orderby, $top, $skip and $count. GET /documents/sites/{siteId}/v1/documents/.

    Annotations the server declares

    • title: List documents
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_list_materialsList materials/ingredients (name, our code, supplier code, description, category, countries of origin, risk, archived flag).Reads text others writeNo findings

    Why it is in this group

    • The name "safefood360_list_materials" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List materials/ingredients (name, our code, supplier code, description, category, countries of origin, risk, archived flag). Paged with start_index and limit; the reply carries recordCount and next_start_index. GET /v1/materials/?siteId=.

    Annotations the server declares

    • title: List materials
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • safefood360_list_suppliersList suppliers (name, code, addresses, contacts, approval status, risk, establishment numbers).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "safefood360_list_suppliers" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "contact": it reads contacts.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List suppliers (name, code, addresses, contacts, approval status, risk, establishment numbers). Paged with start_index and limit; the reply carries recordCount and next_start_index. GET /v1/suppliers/?siteId=.

    Annotations the server declares

    • title: List suppliers
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

136 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 outbound tool breaks every one.

Can send data out1
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
deny to break every path
{
  "permissions": {
    "deny": [
      "mcp__safefood-360__safefood360_create_complaint"
    ]
  }
}

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

No check matched anything in these tool definitions. That is not a safety guarantee.

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http safefood-360 https://safefood-360.usefulapi.io/mcp
claude mcp add --transport http safefood-360 https://safefood-360.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__safefood-360__safefood360_list_documents",
      "mcp__safefood-360__safefood360_get_document",
      "mcp__safefood-360__safefood360_list_document_reviews",
      "mcp__safefood-360__safefood360_get_document_review",
      "mcp__safefood-360__safefood360_list_complaints",
      "mcp__safefood-360__safefood360_get_complaint",
      "mcp__safefood-360__safefood360_list_suppliers",
      "mcp__safefood-360__safefood360_get_supplier",
      "mcp__safefood-360__safefood360_list_materials",
      "mcp__safefood-360__safefood360_get_material",
      "mcp__safefood-360__safefood360_get_customer",
      "mcp__safefood-360__safefood360_get_employee",
      "mcp__safefood-360__safefood360_get_final_product",
      "mcp__safefood-360__safefood360_get_batching_record"
    ],
    "ask": [
      "mcp__safefood-360__safefood360_create_complaint"
    ],
    "deny": [
      "mcp__safefood-360__safefood360_update_document",
      "mcp__safefood-360__safefood360_update_customer"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as safefood-360. Review it before you use it.

Capability tags behind 17 rules
  • mcp__safefood-360__safefood360_list_documents private-data, untrusted-input
  • mcp__safefood-360__safefood360_get_document private-data, untrusted-input
  • mcp__safefood-360__safefood360_list_document_reviews private-data, untrusted-input
  • mcp__safefood-360__safefood360_get_document_review private-data, untrusted-input
  • mcp__safefood-360__safefood360_list_complaints private-data, untrusted-input
  • mcp__safefood-360__safefood360_get_complaint untrusted-input
  • mcp__safefood-360__safefood360_list_suppliers private-data, untrusted-input
  • mcp__safefood-360__safefood360_get_supplier untrusted-input
  • mcp__safefood-360__safefood360_list_materials untrusted-input
  • mcp__safefood-360__safefood360_get_material untrusted-input
  • mcp__safefood-360__safefood360_get_customer private-data, untrusted-input
  • mcp__safefood-360__safefood360_get_employee untrusted-input
  • mcp__safefood-360__safefood360_get_final_product private-data, untrusted-input
  • mcp__safefood-360__safefood360_get_batching_record untrusted-input
  • mcp__safefood-360__safefood360_update_document untrusted-input
  • mcp__safefood-360__safefood360_update_customer untrusted-input
  • mcp__safefood-360__safefood360_create_complaint untrusted-input, outbound

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/io.usefulapi/safefood-360/verify?hash=a7c7a469e99cdff0b5ae5ebad96f23b7577a75799e6affcd9434f65a3d253e71" | jq -e '.changed == false'

Pinned hash a7c7a469e99c, from Oct 24, 2026, 16:21 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/io.usefulapi/safefood-360/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for io.usefulapi/safefood-360
[![anlyon.dev](https://anlyon.dev/badge/io.usefulapi/safefood-360.svg)](https://anlyon.dev/servers/io.usefulapi/safefood-360)

Source: MCP Registry · repository. Synced Oct 24, 2026, 17:17 UTC.