Skip to content

KiotViet MCP by usefulapi

io.usefulapi/kiotvietusefulapi.iostreamable-httpv1.0.0Scanned

Read KiotViet products, customers, invoices, orders and stock; create customers and orders.

29 tools: 9 change things and 20 only read.

Tools: 0 delete, 0 irreversible, 9 write, 20 read.
  • Reads private data · 14
  • Reads text others write · 29
  • Can send data out · 0
  • 7 findings

Anlyon alternative

9 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.

29 tools

Changes things 9Claude Code: ask
  • kiotviet_create_customerWRITE: create a new customer in the shop (name required; code is generated by KiotViet if omitted).Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_create_customer" says "create": a word for a change.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.

    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: create a new customer in the shop (name required; code is generated by KiotViet if omitted). Always check with the user first, and look the customer up by phone before creating a duplicate. POST /customers.

    Annotations the server declares

    • title: Create customer
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • kiotviet_create_orderWRITE: create a sales order (an order, not an invoice: no invoice is made and no payment is recorded) with lines of existing products in a branch, for an existing customer or none.Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_create_order" 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.
    Description, as the server wrote it
    WRITE: create a sales order (an order, not an invoice: no invoice is made and no payment is recorded) with lines of existing products in a branch, for an existing customer or none. Always confirm the products, quantities and prices with the user first. POST /orders.

    Annotations the server declares

    • title: Create sales order
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • kiotviet_get_customer_by_codeOne customer by customer code.Reads text others write1 finding

    Why it is in this group

    • The name "kiotviet_get_customer_by_code" says "get": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Warn

      The server marks "kiotviet_get_customer_by_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_get_customer_by_code" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    One customer by customer code. GET /customers/code/{code}.

    Annotations the server declares

    • title: Get customer by code
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_invoice_by_codeOne invoice by invoice code (for example HD000123).Reads text others write1 finding

    Why it is in this group

    • The name "kiotviet_get_invoice_by_code" says "get": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Warn

      The server marks "kiotviet_get_invoice_by_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_get_invoice_by_code" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    One invoice by invoice code (for example HD000123). GET /invoices/code/{code}.

    Annotations the server declares

    • title: Get invoice by code
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_order_by_codeOne sales order by order code (for example DH000123).Reads text others write1 finding

    Why it is in this group

    • The name "kiotviet_get_order_by_code" says "get": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Warn

      The server marks "kiotviet_get_order_by_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_get_order_by_code" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    One sales order by order code (for example DH000123). GET /orders/code/{code}.

    Annotations the server declares

    • title: Get sales order by code
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_product_by_codeOne product by its product code (SKU).Reads text others write1 finding

    Why it is in this group

    • The name "kiotviet_get_product_by_code" says "get": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Warn

      The server marks "kiotviet_get_product_by_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_get_product_by_code" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    One product by its product code (SKU). GET /products/code/{code}.

    Annotations the server declares

    • title: Get product by code
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_cashflowList cash-book entries (receipts and payments: code, branch, method, partner, amount, date, status).Reads private dataReads text others write1 finding

    Why it is in this group

    • The name "kiotviet_list_cashflow" says "list": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Warn

      The server marks "kiotviet_list_cashflow" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_list_cashflow" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    List cash-book entries (receipts and payments: code, branch, method, partner, amount, date, status). Filter by branch, direction or date range. GET /cashflow.

    Annotations the server declares

    • title: List cash flow
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_customersList customers (code, name, phone, email, address, debt, total invoiced, reward points, groups).Reads private dataReads text others write1 finding

    Why it is in this group

    • The name "kiotviet_list_customers" says "list": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • private-dataThe description's first sentence says "list" and "email": it reads mail.
    • 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 "email": it reads inbound email, which other people can write.

    Findings

    • Warn

      The server marks "kiotviet_list_customers" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_list_customers" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    List customers (code, name, phone, email, address, debt, total invoiced, reward points, groups). Contains personal data of the shop's customers. Filter by code, name, phone, group or last change. GET /customers.

    Annotations the server declares

    • title: List customers
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_suppliersList suppliers (code, name, phone, email, address, debt, total invoiced).Reads private dataReads text others write1 finding

    Why it is in this group

    • The name "kiotviet_list_suppliers" says "list": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • private-dataThe description's first sentence says "list" and "email": it reads mail.
    • 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 "email": it reads inbound email, which other people can write.

    Findings

    • Warn

      The server marks "kiotviet_list_suppliers" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_list_suppliers" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    List suppliers (code, name, phone, email, address, debt, total invoiced). Filter by code, name, phone or last change. GET /suppliers.

    Annotations the server declares

    • title: List suppliers
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
Only reads 20Show 20 read-only tools
  • kiotviet_get_categoryOne product category by id (name, parent, children).Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_get_category" 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 product category by id (name, parent, children). GET /categories/{id}.

    Annotations the server declares

    • title: Get category
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_customerOne customer by id: contact data, debt, total invoiced, reward points, groups.Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "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
    One customer by id: contact data, debt, total invoiced, reward points, groups. GET /customers/{id}.

    Annotations the server declares

    • title: Get customer
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_invoiceOne invoice by id with its lines, payments and delivery.Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_get_invoice" 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 invoice by id with its lines, payments and delivery. GET /invoices/{id}.

    Annotations the server declares

    • title: Get invoice
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_orderOne sales order by id with its lines, payments and delivery.Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_get_order" 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 sales order by id with its lines, payments and delivery. GET /orders/{id}.

    Annotations the server declares

    • title: Get sales order
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_price_bookThe product prices of one price book (product id, code, price), paged.Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_get_price_book" 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
    The product prices of one price book (product id, code, price), paged. GET /pricebooks/{id}.

    Annotations the server declares

    • title: Get price book prices
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_productOne product by id: code, barcode, name, category, base price, units, attributes, images, stock per branch and price books.Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One product by id: code, barcode, name, category, base price, units, attributes, images, stock per branch and price books. GET /products/{id}.

    Annotations the server declares

    • title: Get product
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_purchase_orderOne goods receipt (nhap hang) by id with its lines.Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_get_purchase_order" 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 goods receipt (nhap hang) by id with its lines. GET /purchaseorders/{id}.

    Annotations the server declares

    • title: Get goods receipt
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_returnOne customer return by id with its lines.Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_get_return" 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 customer return by id with its lines. GET /returns/{id}.

    Annotations the server declares

    • title: Get return
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_get_supplierOne supplier by id.Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_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 id. GET /suppliers/{id}.

    Annotations the server declares

    • title: Get supplier
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_branchesList the shop's branches (id, name, code, phone, address).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe name "kiotviet_list_branches" says "list" and "branch": it reads repositories.
    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List the shop's branches (id, name, code, phone, address). Use the ids to filter other tools. GET /branches.

    Annotations the server declares

    • title: List branches
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_categoriesList product categories (id, name, parent, whether it has children).Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_list_categories" 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 product categories (id, name, parent, whether it has children). Set hierarchical to get the category tree. GET /categories.

    Annotations the server declares

    • title: List categories
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_invoicesList sales invoices (code, date, branch, customer, total, amount paid, status, lines).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List sales invoices (code, date, branch, customer, total, amount paid, status, lines). Filter by branch, customer, status, order, purchase-date range or last change. GET /invoices.

    Annotations the server declares

    • title: List invoices
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_ordersList sales orders (code, date, branch, customer, total, status, lines, delivery).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List sales orders (code, date, branch, customer, total, status, lines, delivery). Filter by branch, customer, status, creation date (from) or last change (from/to). GET /orders.

    Annotations the server declares

    • title: List sales orders
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_price_booksList price books (bang gia: name, active flag, validity dates, branches, customer groups).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List price books (bang gia: name, active flag, validity dates, branches, customer groups). GET /pricebooks.

    Annotations the server declares

    • title: List price books
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_productsList products (code, barcode, name, category, base price, units, attributes).Reads text others writeNo findings

    Why it is in this group

    • The name "kiotviet_list_products" 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 products (code, barcode, name, category, base price, units, attributes). Optionally include stock per branch (include_inventory) and price-book prices. Filter by name, category, branch, active flag or last change. GET /products.

    Annotations the server declares

    • title: List products
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_purchase_ordersList goods receipts from suppliers (nhap hang: code, date, branch, supplier, total, lines).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List goods receipts from suppliers (nhap hang: code, date, branch, supplier, total, lines). Filter by branch, status or purchase-date range. GET /purchaseorders.

    Annotations the server declares

    • title: List goods receipts
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_returnsList customer returns (code, date, branch, customer, invoice, return total, lines).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List customer returns (code, date, branch, customer, invoice, return total, lines). GET /returns.

    Annotations the server declares

    • title: List returns
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_stockStock on hand and reserved quantity per product and branch.Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Stock on hand and reserved quantity per product and branch. Filter by branch or last change. GET /productOnHands.

    Annotations the server declares

    • title: List stock on hand
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_supplier_ordersList orders placed with suppliers (dat hang nhap: code, date, branch, supplier, status, lines, amount paid).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List orders placed with suppliers (dat hang nhap: code, date, branch, supplier, status, lines, amount paid). Filter by branch, status, supplier or product text. GET /ordersuppliers.

    Annotations the server declares

    • title: List supplier orders
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiotviet_list_usersList the shop's staff users (id, username, name, phone, email).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "list" and "email": it reads mail.
    • 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 "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    List the shop's staff users (id, username, name, phone, email). GET /users.

    Annotations the server declares

    • title: List users
    • 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.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

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.

7 warn
  • The server marks "kiotviet_get_product_by_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_get_product_by_code" says "get": a word for reading.

    What this check looks for
  • The server marks "kiotviet_list_customers" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_list_customers" says "list": a word for reading.

    What this check looks for
  • The server marks "kiotviet_get_customer_by_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_get_customer_by_code" says "get": a word for reading.

    What this check looks for
  • The server marks "kiotviet_get_invoice_by_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_get_invoice_by_code" says "get": a word for reading.

    What this check looks for
  • The server marks "kiotviet_get_order_by_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_get_order_by_code" says "get": a word for reading.

    What this check looks for
  • The server marks "kiotviet_list_suppliers" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_list_suppliers" says "list": a word for reading.

    What this check looks for
Show 1 more finding
  • The server marks "kiotviet_list_cashflow" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kiotviet_list_cashflow" says "list": a word for reading.

    What this check looks for

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 kiotviet https://kiotviet.usefulapi.io/mcp
claude mcp add --transport http kiotviet https://kiotviet.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__kiotviet__kiotviet_list_products",
      "mcp__kiotviet__kiotviet_get_product",
      "mcp__kiotviet__kiotviet_list_categories",
      "mcp__kiotviet__kiotviet_get_category",
      "mcp__kiotviet__kiotviet_get_customer",
      "mcp__kiotviet__kiotviet_list_invoices",
      "mcp__kiotviet__kiotviet_get_invoice",
      "mcp__kiotviet__kiotviet_list_orders",
      "mcp__kiotviet__kiotviet_get_order",
      "mcp__kiotviet__kiotviet_list_branches",
      "mcp__kiotviet__kiotviet_list_stock",
      "mcp__kiotviet__kiotviet_get_supplier",
      "mcp__kiotviet__kiotviet_list_purchase_orders",
      "mcp__kiotviet__kiotviet_get_purchase_order",
      "mcp__kiotviet__kiotviet_list_supplier_orders",
      "mcp__kiotviet__kiotviet_list_returns",
      "mcp__kiotviet__kiotviet_get_return",
      "mcp__kiotviet__kiotviet_list_users",
      "mcp__kiotviet__kiotviet_list_price_books",
      "mcp__kiotviet__kiotviet_get_price_book"
    ],
    "ask": [
      "mcp__kiotviet__kiotviet_get_product_by_code",
      "mcp__kiotviet__kiotviet_list_customers",
      "mcp__kiotviet__kiotviet_get_customer_by_code",
      "mcp__kiotviet__kiotviet_create_customer",
      "mcp__kiotviet__kiotviet_get_invoice_by_code",
      "mcp__kiotviet__kiotviet_get_order_by_code",
      "mcp__kiotviet__kiotviet_create_order",
      "mcp__kiotviet__kiotviet_list_suppliers",
      "mcp__kiotviet__kiotviet_list_cashflow"
    ],
    "deny": []
  }
}

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 kiotviet. Review it before you use it.

Capability tags behind 29 rules
  • mcp__kiotviet__kiotviet_list_products untrusted-input
  • mcp__kiotviet__kiotviet_get_product private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_product_by_code untrusted-input
  • mcp__kiotviet__kiotviet_list_categories untrusted-input
  • mcp__kiotviet__kiotviet_get_category untrusted-input
  • mcp__kiotviet__kiotviet_list_customers private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_customer private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_customer_by_code untrusted-input
  • mcp__kiotviet__kiotviet_create_customer untrusted-input
  • mcp__kiotviet__kiotviet_list_invoices private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_invoice untrusted-input
  • mcp__kiotviet__kiotviet_get_invoice_by_code untrusted-input
  • mcp__kiotviet__kiotviet_list_orders private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_order untrusted-input
  • mcp__kiotviet__kiotviet_get_order_by_code untrusted-input
  • mcp__kiotviet__kiotviet_create_order untrusted-input
  • mcp__kiotviet__kiotviet_list_branches private-data, untrusted-input
  • mcp__kiotviet__kiotviet_list_stock private-data, untrusted-input
  • mcp__kiotviet__kiotviet_list_suppliers private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_supplier untrusted-input
  • mcp__kiotviet__kiotviet_list_purchase_orders private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_purchase_order untrusted-input
  • mcp__kiotviet__kiotviet_list_supplier_orders private-data, untrusted-input
  • mcp__kiotviet__kiotviet_list_returns private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_return untrusted-input
  • mcp__kiotviet__kiotviet_list_cashflow private-data, untrusted-input
  • mcp__kiotviet__kiotviet_list_users private-data, untrusted-input
  • mcp__kiotviet__kiotviet_list_price_books private-data, untrusted-input
  • mcp__kiotviet__kiotviet_get_price_book untrusted-input

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/kiotviet/verify?hash=7a42269cb20090b196553768638efed0c62fe97f9f26b66165be51127e88ece8" | jq -e '.changed == false'

Pinned hash 7a42269cb200, from Oct 26, 2026, 01:18 UTC.

Watch

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

https://anlyon.dev/servers/io.usefulapi/kiotviet/changes.xml

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

Badge

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

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