po-guard-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ERPNEXT_URL | No | URL of the ERPNext instance, e.g. http://localhost:8080. | |
| SAP_API_KEY | No | SAP api.sap.com API key (free account). For sandbox reads; the sandbox is read-only. | |
| PO_GUARD_ERP | Yes | Which ERP connector to use: "erpnext" or "sap". | |
| ERPNEXT_API_KEY | No | ERPNext API key of the acting user (identity comes from this key, never from a tool argument). | |
| ERPNEXT_API_SECRET | No | ERPNext API secret paired with ERPNEXT_API_KEY. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| previewA | Show exactly what a write would do and every check result, without writing anything. Returns a one-time confirmation code when no check blocks. Pass that code to the write tool together with the identical arguments. Args: action: The write tool to preview: create_purchase_order, onboard_supplier, submit_for_approval, approve_purchase_order, reject_purchase_order, cancel_purchase_order or amend_purchase_order. args: The exact arguments you will pass to that tool (without confirmation_code). |
| search_suppliersA | Find suppliers by name (fuzzy). Use before ordering, to get the supplier ID. Args: query: Part of the supplier's name, e.g. "herc rentals". limit: Maximum rows (1-50). |
| get_purchase_orderA | One purchase order: supplier, cost centre, lines, total, status, requester, approver. Args: po: Purchase order ID, e.g. "PUR-ORD-2026-00012". |
| list_purchase_ordersA | List purchase orders, newest first. Args: supplier: Optional supplier ID. cost_centre: Optional cost centre. status: Optional: Draft, Pending Approval, Approved, Rejected or Cancelled. limit: Maximum rows (1-100). |
| budget_statusB | A cost centre's annual budget, what live orders already commit, and what's left. Args: cost_centre: Cost centre name, e.g. "Fleet Operations - LDU". |
| audit_logA | Recent po-guard audit records (every write attempt, including refused ones). Args: target: Optional document ID (purchase order or supplier) to filter on. limit: Maximum rows (1-100). |
| whoamiA | The ERP user this server acts as, and their approval authority. |
| create_purchase_orderA | Create a draft purchase order. Needs a confirmation code from Args: supplier: Supplier ID (from search_suppliers). cost_centre: Cost centre to charge. lines: [{"item_code": ..., "qty": ..., "rate": ..., "description": optional}]. confirmation_code: From preview("create_purchase_order", ). required_by: Optional ISO date, e.g. "2026-11-30". notes: Optional free text, stored as-is. |
| onboard_supplierA | Add a supplier to the master after duplicate checks. No bank details, ever. Args: name: Legal name. confirmation_code: From preview("onboard_supplier", ). tax_id: Optional tax ID (e.g. US EIN), checked for duplicates. notes: Optional free text, stored as-is. |
| submit_for_approvalA | Send a draft (or rejected and fixed) purchase order for approval. Args: po: Purchase order ID. confirmation_code: From preview("submit_for_approval", {"po": ...}). |
| approve_purchase_orderA | Approve a pending purchase order as the configured user (never its requester). Args: po: Purchase order ID. confirmation_code: From preview("approve_purchase_order", ). comment: Optional approval comment. |
| reject_purchase_orderA | Reject a pending purchase order back to its requester. Args: po: Purchase order ID. reason: Why, for the requester. confirmation_code: From preview("reject_purchase_order", ). |
| cancel_purchase_orderA | Cancel a purchase order. It stays on record as cancelled; nothing is deleted. Args: po: Purchase order ID. reason: Why. confirmation_code: From preview("cancel_purchase_order", ). |
| amend_purchase_orderA | Replace the lines of an unapproved order. It goes back to Draft for resubmission. Args: po: Purchase order ID. lines: The full new set of lines (same shape as create_purchase_order). confirmation_code: From preview("amend_purchase_order", ). notes: Optional new notes. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
Each tool targets a distinct resource+action: get vs list are clearly scoped, and the approval-state transitions (submit, approve, reject, cancel, amend) are each explicitly delimited. The `preview` meta-tool is clearly distinguished as a dry-run gate for writes, including an enumerated action list.
The dominant pattern is consistent verb_noun (get_purchase_order, list_purchase_orders, create/amend/submit/approve/reject/cancel_purchase_order, search_suppliers). Deviations are noun-only utility tools (budget_status, audit_log) and the generic `preview`/quirky `whoami`, but these remain readable and predictable.
14 tools is well within a healthy range and each earns its place: a full PO lifecycle, plus supporting reads (search, budget, audit, whoami) and a safety-gate preview. Nothing appears redundant or padding.
Purchase-order coverage is strong: create, amend, submit, approve, reject, cancel, get, list, plus budget and audit context. The supplier surface is thin (only search and onboard, no get/update/deactivate), and there is no goods-receipt or invoice-matching operation, but core workflows are workable.