MCP Tools for AI Agents
The tools Vendwick offers AI agents through EmDash’s MCP server, grouped by area, with what each one does and whether it changes data. It also covers module toggles, secrets, retries and the re-consent that 0.2.0 needs.
Vendwick exposes 75 tools to AI agents connected to EmDash’s MCP server (an MCP client sees each as vendwick__<name>). Each tool calls one admin route with that route’s permission (plugins:manage, administrators only), so an agent can do exactly what an administrator can do on the matching admin screen, and nothing more.
The admin manages the tools in EmDash’s plugin manager: one switch turns every Vendwick tool on or off, and the consent screen lists them. The Integrations page (Store settings > Integrations) shows every tool by area, which ones change data, and which areas are off because their module is off.
How the tools behave
- Module toggles. The tool set is static. A tool whose module is off (Shipping, Webhooks, Store import, Client invoices and so on) still appears and answers
MODULE_DISABLED(for example "Physical Goods and Shipping is turned off. Turn it on in Modules.", with the module named as on the Modules page) until the module is turned on in Modules. - Changes data. Tools marked "yes" below issue, charge, refund, email or edit records. EmDash marks them destructive, and an MCP client asks before running them. Their descriptions tell the agent to ask the merchant first where money or customers are involved.
- Audit. A tool writes the same activity-log events as the admin action it mirrors (refunds, stock adjustments, webhook endpoint changes and secret rotations, license changes).
- Paging. Lists answer at most 100 rows and a
cursorfor the next page. - Secrets. No tool returns payment gateway credentials, stored webhook secrets or full license keys. License keys come back masked, the same as in 0.1.0, and
commerce/licenses/reveal-keyis not a tool. A webhook endpoint’s signing secret is returned once, byrotate-webhook-secret;create-webhook-endpointdoes not return it.get-webhook-deliverytakes license keys out of the stored body, even for an endpoint that opted in to receive them. - Retries.
create-refundtakes arequestKey; sending the same refund again with the same key never refunds twice.create-client-invoicetakes anidempotencyKeythe same way. - What stays in the admin. Starting a store import, uploading a release file, revealing a license key and changing gateway credentials have no tool.
Re-consent
EmDash stores every tool’s name, description, route, permission, destructive flag and input schema in the admin’s consent. Vendwick 0.2.0 adds 34 tools and changes list-orders (the new filters) and save-plan (pay what you want, bundle grants, SKU and weight), so admins approve Vendwick’s tools again after upgrading. See Update Vendwick.
Store
| Tool | Changes data | What it does |
|---|---|---|
get-commerce-summary | Store overview: product and plan counts (active and total), orders, customers, licenses, fulfillment and refund queue health, and the checkout URL. Read-only. Run this first to orient yourself. | |
list-events | List the immutable commerce activity log (license issued, renewed, disabled, activations, payments, refunds, refusals), newest first. Read-only; paged. | |
get-store-overview | Store summary for a period: revenue, orders, refunds, new customers and their change against the previous period, a daily series, MRR, top products, recent orders and what needs attention. Read-only. | |
search-store | Look something up the way the admin search box does: an order number, a customer email, a license key, or the start of a customer’s name or email. Answers ids and labels; license keys come back masked. Read-only. |
Catalog
| Tool | Changes data | What it does |
|---|---|---|
list-products | List products with their plan and license counts, newest first. Filter by status, type or a name/slug search. Read-only; paged. | |
get-product | One product with its plans (active first, by price), releases (no download credentials), gallery and checkout URL. Read-only. | |
save-product | yes | Create a product (omit id) or update one (pass id; omitted fields are unchanged). To take a product off sale, set status archived rather than deleting it. Changes what customers see and buy. |
delete-product | yes | Permanently delete a product that has never sold, with its plans and release records. Refused for products with orders, licenses or pending payments: archive those with save-product status archived instead. Cannot be undone; confirm with the merchant first. |
list-plans | List pricing plans (price in minor units, currency, billing period and interval, site limit), optionally for one product, ordered by product, then price. Read-only. | |
save-plan | yes | Create a pricing plan for a product (omit id) or update one (pass id). Price changes apply to new checkouts only; existing orders keep the price they paid. activationLimit 0 means unlimited sites. Also sets pay-what-you-want pricing, a bundle’s grants and a physical plan’s SKU and weight. |
generate-sample-products | Create the sample products and plans (a plugin, a theme and a download) that do not exist yet. Never overwrites existing products. Returns what was created and what already existed. Idempotent. | |
list-order-bumps | List order bumps: the extra offers shown at checkout, with the bumped plan, its price, the bump price, headline and the products that trigger it. Read-only. | |
save-order-bump | yes | Create an order bump (omit id) or update one (pass id): a one-tick offer at checkout for another plan, optionally at a special price, shown when the cart holds one of the trigger products (or always). Changes what buyers see at checkout. |
delete-order-bump | yes | Delete an order bump. Past orders that took it keep their lines. Cannot be undone; archiving with save-order-bump hides it instead. |
Releases
| Tool | Changes data | What it does |
|---|---|---|
list-releases | List a product’s published releases, highest version first, with channel, file name, size, SHA-256 and which one is latest. Never returns download links or storage keys. Read-only. | |
publish-release | yes | Validate an uploaded package and publish it as a product release that licensed customers can download and update to. The file must already be uploaded from the Releases panel, which returns its stageId. Publishing a version that exists is refused unless replaceExisting is true. |
Orders
| Tool | Changes data | What it does |
|---|---|---|
list-orders | List orders, newest first, with customer, totals (minor units), payment provider and status. Filters combine: status, kind, email, a search, a date range, refunds, disputes and the provider. License keys are never included. Read-only; paged. | |
get-order | One order with its line items (product, plan, masked license key, license status), licenses, checkout summary, fulfillment jobs and audit events. License keys stay masked. Read-only. | |
resend-customer-access | yes | Email the customer a fresh secure link to their account (licenses, downloads, invoices), found by order, license or customer. Sends an email to the customer. |
Refunds and disputes
| Tool | Changes data | What it does |
|---|---|---|
list-order-refunds | An order’s refunds, credit notes and disputes, what is left to refund in total and per item (and for shipping), and whether a refund can be made from here (blocked explains why not). Read-only. Run this before create-refund. | |
create-refund | yes | Refund an order through its payment provider, in the mode it was paid in: an amount spread over what is left of each item, or chosen lines. Optionally disable the refunded licenses (revoke) and put physical units back in stock (restock). Retrying with the same requestKey never refunds twice. Money leaves the merchant’s account and the customer is emailed: ask the merchant first and show them the amount. |
list-disputes | List payment disputes (chargebacks), newest first, with provider, order, amount, reason, status and when they opened and closed. Read-only; paged. | |
get-dispute | One dispute with its order (number, status, totals, customer email) and the refunds it caused. Read-only. Evidence is submitted in the provider’s dashboard. |
Order invoices
| Tool | Changes data | What it does |
|---|---|---|
get-order-invoice-links | An order’s invoice number with links to its invoice page and PDF, and to every credit note (one per refund) and its PDF. The links are the customer’s signed links. Read-only. |
Licenses
| Tool | Changes data | What it does |
|---|---|---|
list-licenses | List licenses, newest first, with masked keys, product, plan, status, expiry, site limit and active site count. Read-only; paged. | |
get-license | One license with a masked key, its product and its activation records (active sites first). Read-only. | |
update-license | yes | Change a license’s status (active, disabled, expired), site limit or expiry. Disabling stops updates and activations for the customer immediately. activationLimit 0 means unlimited sites; expiresAt null means never expires. Idempotent. |
reset-license-activations | yes | Deactivate every active site of one license, so the customer can activate it again elsewhere. Sites lose licensed updates until re-activated. Idempotent. |
list-activations | List activated sites (URL, environment, status, last seen), most recently seen first, optionally for one license. Read-only; paged. | |
deactivate-activation | yes | Deactivate one site of a license (frees one seat). The site stops receiving licensed updates. Idempotent. |
list-downloads | List audited release downloads (license, product, version, time; IP addresses are never returned), newest first. Read-only; paged. |
Subscriptions
| Tool | Changes data | What it does |
|---|---|---|
list-subscriptions | List subscriptions (local license terms and provider subscriptions) with status, automatic-renewal flag, provider, period and customer, newest first. Read-only; paged. | |
update-subscription | yes | Turn automatic renewal off (autoRenew false: the license runs to the end of its paid term) or back on, at the payment provider first, then locally. Status itself follows the provider and cannot be set here. Idempotent. |
get-subscription | One subscription with its license (no key), plan, provider ids and payment mode, its orders (purchase and renewals) and audit events. Read-only. |
Payments
| Tool | Changes data | What it does |
|---|---|---|
get-currency-routes | The ordered payment gateways each currency may use (first = default), the built-in defaults and the known gateways. Read-only. | |
update-currency-routes | yes | Replace which gateways each currency uses, in order (the first is the default). Pass exactly one of: routes {USD: [stripe, paypal], …}, rows [{currency, gateways, primary}], or reset true for the defaults. Gateway credentials are never touched. A currency with no route cannot be sold. Idempotent. |
get-gateway-status | Each payment gateway’s mode (test/live), whether it is configured, whether its webhook secret is set, the currencies routed to it, its webhook URL and the last webhook received. Never returns credentials. Read-only. |
Shipping and stock
| Tool | Changes data | What it does |
|---|---|---|
list-shipping-zones | List shipping zones with their countries, regions, currency, order and rates, and every country the store ships to. Read-only. | |
save-shipping-zone | yes | Create a shipping zone (omit id) or replace one (pass id): its countries and regions, currency and up to 12 rates. A region match wins over a country, a country over the rest-of-world zone. Changes what buyers pay for shipping. |
delete-shipping-zone | yes | Delete a shipping zone. Buyers in its countries can no longer check out physical items unless another zone covers them. Cannot be undone. |
get-shipping-settings | The ship-from address, the low-stock threshold, whether the storefront shows units left, and whether buyers get a delivered email. Read-only. | |
update-shipping-settings | yes | Save shipping settings; only the fields given change. Changes packing slips, stock warnings and customer emails. |
list-stock | Stock of physical plans: on hand, held by open checkouts, available, low or out, and backorders, most recently changed first. Read-only; paged. | |
adjust-stock | yes | Change a physical plan’s stock by a delta with a reason (audited), or turn tracking on (track true with onHand) or off (track false). Changes what can be sold. |
list-orders-to-ship | Paid orders with units still to ship (unfulfilled or partly shipped), oldest paid first, with country and backorder flag. Read-only; paged. | |
list-shipments | With orderId: that order’s shipping (address, items with shipped and unshipped units, shipments). Without: shipments, newest first, filtered by status. Read-only; paged. | |
create-shipment | yes | Record a shipment for an order: which units (omit items for everything unshipped), packed or shipped, carrier and tracking. With status shipped and notify true the buyer is emailed the tracking. |
update-shipment | yes | Update a shipment: mark it shipped (with carrier and tracking), delivered or returned, or fix its tracking. Marking delivered can email the buyer (shipping settings). |
Client invoices
| Tool | Changes data | What it does |
|---|---|---|
client-invoice-context | Payable currencies and their payment methods, tax settings, the next invoice number, reminder settings and invoice counts. Read-only. Run this first in any invoice workflow. | |
client-invoice-lookup | Find a customer (name, email, billing address) or a billable item (saved invoice items and catalog plans with prices) to put on an invoice. Read-only. | |
list-client-invoices | List invoices, newest first, with number, customer, total and state. status: draft, issued (unpaid), overdue, paid, void or refunded. Read-only; paged. | |
get-client-invoice | One invoice with totals, payment link, schedule and recent activity. Drafts include reviewHash and readyToIssue, which issue-client-invoice needs. Read-only. | |
create-client-invoice | Save a private draft invoice: no number, no payment link, no email. Retrying with the same idempotencyKey and the same details returns the same draft instead of a second one. Drafts need no approval. | |
update-client-invoice | Patch a draft. Pass the revision from the latest result. billing merges with the saved address; items replaces the whole list. Fields: title, name, email, currency, taxMode, dueDate, projectName, servicePeriod, message, notes, terms, discount, items, billing, autoReminders. | |
issue-client-invoice | yes | Number the draft, lock its totals and create its payment link. Sends no email (use send-client-invoice). Needs the revision and reviewHash from the latest draft result. Ask the merchant first and show them the total. |
send-client-invoice | yes | Email an issued, unpaid invoice with its payment link, or a reminder (the overdue reminder after the due date). dryRun shows the recipient and the email without sending. Emails the customer; ask the merchant first. |
duplicate-client-invoice | Make a new draft with the same customer and lines as an existing invoice. Sends nothing. | |
reopen-client-invoice | yes | Turn an unpaid issued or void invoice back into a draft. It keeps its number; earlier payment links stop working. Ask the merchant first. |
void-client-invoice | yes | Void a draft or unpaid invoice. Its payment link stops working and any schedule ends; an issued invoice’s customer is emailed a void notice unless notify is false. Refused once paid. Ask the merchant first. |
mark-client-invoice-paid | yes | Record a payment taken outside the store, such as a bank transfer, as a paid order for this invoice. Ask the merchant first. |
schedule-client-invoice | yes | Repeat an issued invoice: unit week|month|year, count 1-12, start (a date after today), ends never|after (endsAfter copies)|on (endsOn date), mode send (issue and email each copy) or draft. dryRun shows the first three dates without saving. Ask the merchant first. |
unschedule-client-invoice | yes | Pause, resume or stop (default) the repeating schedule of a template invoice. A stopped schedule cannot be resumed. |
list-client-invoice-schedules | Repeating invoice schedules with their template invoice, customer, amount and next date. status: active, paused or ended. Read-only; paged. | |
get-client-invoice-pdf-link | The customer’s signed links to an issued invoice’s page and its PDF. Drafts have none. Editing, reopening or voiding the invoice revokes the links. Read-only. |
Webhooks
| Tool | Changes data | What it does |
|---|---|---|
list-webhook-endpoints | List outgoing webhook endpoints (URL, events, status, failures, last delivery, a hint of the secret) and every event name that can be subscribed to. Never returns signing secrets. Read-only. | |
create-webhook-endpoint | yes | Add an endpoint that receives signed JSON events. The signing secret is not returned: call rotate-webhook-secret when the receiver is ready to store it. includeLicenseKeys sends full license keys to that URL: ask the merchant first. |
update-webhook-endpoint | yes | Change an endpoint’s URL, description, events or license-key opt-in, or pause or resume it (status). Omitted fields are unchanged. |
delete-webhook-endpoint | yes | Delete a webhook endpoint and stop sending to it. Cannot be undone; pausing it with update-webhook-endpoint keeps it. |
rotate-webhook-secret | yes | Replace an endpoint’s signing secret. The answer carries the new secret once; it is never shown again, and the receiver must be updated at once or it will reject events. Ask the merchant first. |
list-webhook-deliveries | List webhook deliveries, newest first, with event, endpoint, status, attempts, last response code and next retry. Read-only; paged. | |
get-webhook-delivery | One delivery with the JSON body as sent (license keys removed), the attempt log and the last response. Read-only. | |
redeliver-webhook | yes | Send a delivery’s stored body again now, with a fresh signature, and start a new retry schedule. The receiver may act on it twice if it does not de-duplicate by event id. |
ping-webhook-endpoint | yes | Send a signed test event (type ping) to an endpoint and report whether it answered with a 2xx status. Makes an outgoing request to the endpoint’s URL; touches no store data. |
Store import
| Tool | Changes data | What it does |
|---|---|---|
list-import-runs | List store import runs (from FluentCart or Easy Digital Downloads), newest first, with source, mode, status and counts. Starting an import stays in the admin. Read-only; paged. | |
get-import-run | One import run: its progress, what it created, linked or skipped per record type, and its conflicts. Read-only. |