Skip to main content
Glama
vansyson1308

kiotviet-mcp

by vansyson1308

kiotviet-mcp

A voice-first Model Context Protocol server for shops that run on KiotViet, the POS used by a very large number of Vietnamese grocery and convenience stores.

It lets any MCP client (Alexa+, Claude, IDE agents, your own Bedrock agent) answer a shop owner's questions in one spoken sentence:

  • "What's running low?"

  • "How many cartons of milk do we have?"

  • "How were sales yesterday?"

  • "What sold best this week?"

  • "What should I reorder?" → "Draft it." → "Yes, send it."

Every tool returns two things:

  • content[0].text: a sentence written to be spoken, at most 35 words, with rounded numbers and units, and never more than 3 list items read aloud.

  • structuredContent: data that matches the tool's declared outputSchema.

Tools carry MCP annotations (readOnlyHint, destructiveHint, idempotentHint).

It was extracted from ShopVoice, the Alexa+ MCP project in vansyson1308/groceryclaw, built for the Build, Ship, Shape Amazon Developer Hackathon. This package has no GroceryClaw dependencies: it talks to the KiotViet Public API directly.

Tools

Tool

Type

What it does

get_low_stock

read

Products at or below KiotViet minQuantity, most urgent first (days of cover = on hand / 14-day average daily sales)

get_stock_level

read

On hand plus days of cover for a product name, product code or barcode; asks which one when several match

get_sales_summary

read

Today, yesterday, the last 7 days or the last 28 days, against the previous equal period (same weekday last week for single days)

get_top_movers

read

Top or bottom sellers by units

suggest_reorder

read

(lead time + cover days) × forecast − on hand

create_purchase_order_draft

write, not destructive

Drafts a purchase order and returns a confirmation_token valid for 5 minutes. Nothing is sent yet.

confirm_purchase_order

write, destructive, idempotent

Sends the draft to KiotViet (POST /purchaseorders), only with the token

It also exposes a resource, shop://profile. Start with --read-only to hide the two purchase-order tools entirely.

Related MCP server: store-ops-mcp

Quick start

npm install
npm run build

# Try it without KiotViet credentials (built-in demo shop), over stdio:
node dist/cli.js --demo

# Real shop:
export KIOTVIET_CLIENT_ID=... KIOTVIET_CLIENT_SECRET=... KIOTVIET_RETAILER=your-retailer
export KIOTVIET_BRANCH_ID=12345   # optional, used for purchase orders
node dist/cli.js                  # stdio
KIOTVIET_MCP_TOKEN=$(openssl rand -hex 24) node dist/cli.js --http 8787   # Streamable HTTP on 127.0.0.1:8787/mcp

Claude Desktop / any stdio client

{
  "mcpServers": {
    "kiotviet": {
      "command": "node",
      "args": ["/path/to/kiotviet-mcp/dist/cli.js", "--read-only"],
      "env": { "KIOTVIET_CLIENT_ID": "...", "KIOTVIET_CLIENT_SECRET": "...", "KIOTVIET_RETAILER": "..." }
    }
  }
}

Inspect it

npx @modelcontextprotocol/inspector@2.8.0 --cli node dist/cli.js -e KIOTVIET_MCP_DEMO=1 --method tools/list

How it uses the KiotViet Public API

  • Auth: POST https://id.kiotviet.vn/connect/token (client credentials, scope PublicApi.Access). The token is cached until shortly before it expires, and every call sends Authorization: Bearer … plus the Retailer header.

  • Products: GET /products?includeInventory=true (paged by 100). On hand is summed across branches (onHand − reserved), and the minimum stock comes from minQuantity.

  • Sales: GET /invoices?fromPurchaseDate=…&toPurchaseDate=… for the last 28 days, aggregated from invoiceDetails by product code. Cancelled invoices are skipped.

  • Purchase orders: POST /purchaseorders, and only from confirm_purchase_order.

Responses are read defensively, so missing fields fall back to safe defaults. A snapshot is cached for 60 seconds to stay within API rate limits.

Safety

  • Two-step writes. The draft token is random (96 bits), stored only as a SHA-256 hash, expires after 5 minutes, and confirming twice sends nothing new.

  • The HTTP mode binds to 127.0.0.1, requires a bearer token (compared in constant time), and rejects non-loopback browser Origins, which protects against DNS rebinding.

  • KiotViet credentials are read from the environment only and never logged.

Development

npm test   # builds, then runs node:test against a fake KiotViet API and the demo shop

Pinned: @modelcontextprotocol/sdk 1.30.1 (MCP protocol 2025-11-25), zod 4.6.5, Node ≥ 20.

License

MIT, see LICENSE.

Available Tools

7 tools
confirm_purchase_orderSend the purchase order (step 2 of 2)A
DestructiveIdempotent

Sends the drafted purchase order to KiotViet (POST /purchaseorders). Requires the confirmation_token from create_purchase_order_draft; expires after 5 minutes. Call only after the user explicitly confirms.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmation_tokenYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
kiotviet_codeYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the operation is not read-only and is destructive/idempotent. The description adds useful behavioral context: the token expires in 5 minutes and the call must follow explicit user confirmation, which clarifies the irreversible nature implied by destructiveHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The primary action is stated first, then the prerequisite and timing constraint, then the user-confirmation requirement. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a single parameter, a clear prerequisite, expiration semantics, explicit user-confirmation condition, and an output schema present, the description covers everything needed to invoke this correctly alongside its sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only provides the token's type and length, with 0% description coverage. The description compensates by explaining that confirmation_token comes from create_purchase_order_draft and expires after 5 minutes, giving the parameter meaningful operational context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Sends') with a clear resource ('drafted purchase order') and even cites the endpoint (POST /purchaseorders). The title explicitly labels it 'step 2 of 2', distinguishing it from create_purchase_order_draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states when to call it ('only after the user explicitly confirms'), what prerequisite is required (confirmation_token from create_purchase_order_draft), and adds a time constraint (expires after 5 minutes). This gives an agent actionable go/no-go conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_purchase_order_draftDraft a purchase order (step 1 of 2)A

Drafts a KiotViet purchase order from the current suggestions (or the given product codes) and returns a confirmation_token valid for 5 minutes. Nothing is sent to KiotViet until confirm_purchase_order is called after the user says yes.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
linesYes
est_totalYes
confirmation_tokenYes
expires_in_secondsYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only state that the operation is not read-only and not destructive, but the description adds crucial behavioral detail: the action is a draft only, nothing reaches KiotViet until confirmation, and the returned confirmation_token expires in 5 minutes. This transient-token and two-step commit context is exactly what an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The first sentence front-loads the action and result; the second sentence states the critical non-effect of not sending the order until confirmation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-param draft tool with an output schema and non-destructive annotations, it covers token expiry, the two-step confirmation flow, and how item input is sourced. A minor gap is what happens when neither suggestions nor items are available, but this does not block correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description compensates meaningfully by explaining that the tool can use 'current suggestions' when no items are given, or can take given product codes as an override. It does not fully describe qty semantics, but the param names and constraints already convey most of that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Drafts'), a specific resource ('KiotViet purchase order'), and the workflow position ('step 1 of 2'). It also clearly distinguishes this from the sibling confirm_purchase_order by stating that nothing is sent until that later step is called.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly establishes this tool as the first step in a two-step flow and explains that confirm_purchase_order must follow only after the user approves. It does not explicitly list when not to use it or compare against other siblings, but the workflow context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_low_stockWhat is running lowA
Read-onlyIdempotent

Products at or below their KiotViet minimum stock (minQuantity), most urgent first by days of cover.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
total_lowYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds meaningful behavioral context beyond those annotations by defining the threshold (minQuantity) and the urgency ordering (days of cover), which helps the agent understand what results to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the core behavior and ordering with no filler. Every word contributes to the agent's understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, a rich annotation set, and an output schema present, the description fully covers what the tool does and how results are ordered. Nothing essential for invoking or interpreting the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema description coverage is 100%, so there is no parameter burden for the description to carry. The mention of minQuantity is domain context rather than a parameter explanation, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (products), the filter (at or below KiotViet minimum stock/minQuantity), and the ordering (most urgent first by days of cover). This distinguishes it from sibling tools like get_stock_level and get_top_movers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: the agent should use this when it needs products at or below minimum stock, sorted by urgency. However, it does not explicitly contrast with alternatives such as get_stock_level or suggest_reorder, leaving some routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sales_summarySales summaryA
Read-onlyIdempotent

Revenue and units for today, yesterday, the last 7 days or the last 28 days, compared with the previous equal period (same weekday last week for single days).

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNotoday

Output Schema

ParametersJSON Schema
NameRequiredDescription
toYes
fromYes
unitsYes
periodYes
revenueYes
change_pctYes
previous_revenueYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering safety. The description adds valuable behavioral detail about the comparison logic (same weekday last week for single days), which is not captured elsewhere. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense sentence with no filler. It front-loads the core output (revenue and units) and immediately clarifies the period options and comparison logic, making every word earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single parameter, clear enum values, output schema presence, and annotations covering safety, the description provides all necessary context for an agent to call the tool correctly. It explains the comparison methodology, which is the only non-obvious aspect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explicitly lists all enum values (today, yesterday, last_7_days, last_28_days) and explains their meaning via the comparison context. This fully compensates for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns revenue and units for specified periods, with a comparison to the previous equal period. This is a specific verb+resource and is clearly distinct from sibling tools about stock and reorders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context about what data it returns (sales revenue and units) and the available periods. While it does not explicitly name alternatives or exclusions, the sibling tools are all in the stock/reorder domain, making the usage context unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stock_levelStock level for one productA
Read-onlyIdempotent

On-hand quantity and days of cover for a product by name, product code or barcode. Asks which one if several match.

ParametersJSON Schema
NameRequiredDescriptionDefault
productYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
matchesYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and open-world hints, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: it can match by different identifier types and it asks which one when multiple matches exist, which is non-obvious behavior an agent would otherwise not know. It does not address auth, rate limits, or no-match behavior, but those are less critical given the simple read operation and the presence of an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, with the core output front-loaded and the disambiguation behavior in the second sentence. There is no filler or repetition of schema/annotation details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (one parameter), rich annotations, and an existing output schema, the description is complete for correct invocation. It covers what the tool returns, how the product is identified, and the ambiguous-match behavior. The only possible gap, no-match handling, is likely covered by the output schema or can be reasonably inferred.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it explains that the single "product" parameter can be a name, product code, or barcode. This is essential semantic information beyond the schema's bare string type. It does not fully specify format rules, but for one parameter the meaning is sufficiently conveyed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: it returns "On-hand quantity and days of cover for a product." It also specifies the lookup modes (name, product code, barcode) and explicitly signals that it asks for disambiguation when multiple products match, which distinguishes it from sibling tools that surface lists or summaries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The title and description make clear this is for fetching stock level for a single product, and the search-by-identifier wording implies when it is appropriate. However, it does not explicitly contrast itself with alternatives like get_low_stock or suggest_reorder, and offers no exclusions or conditions for choosing this tool over siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_top_moversBest and slowest sellersB
Read-onlyIdempotent

Top or bottom products by units sold over the last N days.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
limitNo
directionNotop

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior, so the safety profile is covered. The description adds the time-window scoping and the units-sold ranking basis, but it does not disclose additional behavioral traits such as empty-result behavior, pagination, or interpretation of 'bottom' beyond the direction parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly scoped sentence with no filler. It front-loads the core behavior and avoids restating schema defaults or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, the output schema is present, and annotations are comprehensive, so the description does not need to explain return values. However, it lacks explicit usage guidance and does not fully describe the limit parameter, leaving minor but real gaps for an agent deciding whether and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It effectively explains 'days' (last N days), 'direction' (top or bottom), and the ranking basis, but it does not explicitly explain 'limit' or how it caps the returned product list. The parameter names and defaults make some of this inferable, but a clear statement about limit would be stronger.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (products) and the metric (units sold) over a configurable time window, and the title 'Best and slowest sellers' reinforces the meaning. It is distinguishable from siblings like get_low_stock or get_sales_summary, though it lacks an explicit verb like 'returns' or 'lists'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to choose this tool over alternatives, and none of the sibling tools are mentioned. The description implies its use for top/bottom seller analysis, but there are no explicit conditions, exclusions, or comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_reorderSuggest a reorderA
Read-onlyIdempotent

What to reorder now: items at/below minimum. Quantity = (lead time 2 + 7 days) x 14-day average daily sales - on hand. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
linesYes
est_totalYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, open-world, and non-destructive behavior. The description adds valuable behavioral context by defining which items are included (at/below minimum) and exactly how quantity is calculated. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and efficient, with the core purpose front-loaded in the first sentence. The formula is presented clearly and the read-only modifier is a single useful word. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no input parameters, the description fully explains what it does, what data it considers, and the formula for output quantities. The output schema exists to describe return structure, so the description does not need to cover that. No meaningful context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter documentation burden. The description explains the internal data inputs used (lead time, average daily sales, on-hand quantity) even though they are not user-supplied parameters. This is more than adequate for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: suggest reorder quantities for items at/below minimum. It also gives the exact quantity formula, distinguishing it from generic stock viewers and order-creation tools. The read-only note reinforces that this is an advisory, not a mutation, tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'What to reorder now' clearly signals when to use the tool: during reorder planning. It does not explicitly name alternatives like create_purchase_order_draft or get_low_stock, but the read-only designation and focus on suggested quantities imply its role versus sibling tools. Some explicit exclusion guidance would improve it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.0
    • First observedconfirm_purchase_order
    • First observedcreate_purchase_order_draft
    • First observedget_low_stock
    • First observedget_sales_summary
    • First observedget_stock_level
    • First observedget_top_movers
    • First observedsuggest_reorder

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation4/5

Most tools are clearly distinct, but get_low_stock and suggest_reorder both surface items at or below minimum stock, which could cause some confusion. The descriptions clarify that one is a status report while the other provides specific reorder quantities, so the boundary is workable.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: get_*, suggest_reorder, create_purchase_order_draft, confirm_purchase_order. The naming clearly communicates the action and object, with no mixed conventions or vague verbs.

Tool Count5/5

Seven tools is well-scoped for a KiotViet inventory and purchasing assistant. Each tool covers a meaningful step in the workflow from stock and sales visibility to reorder suggestions and purchase order confirmation.

Completeness4/5

The tool set covers the core inventory, sales, and purchase-order workflow end to end, including the important two-phase draft/confirm purchase order flow. Minor gaps exist, such as no ability to list or cancel existing purchase orders or adjust stock, but these do not break the primary use case.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers