feat(mcp): customer_number on create_customer + Beta tags on webshop surfaces (#1677)
* feat(mcp): accept customer_number on gnubok_create_customer Parity with gnubok_update_customer: a customer number no longer needs a create-then-update two-step with two approvals. The staged params carry the trimmed number, commitCreateCustomer inserts it, and the payload-size ceiling is bumped 59.7K to 59.75K with a documented entry (the property has no description; name + maxLength are the whole contract). Requested by a user on Discord 2026-08-16. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(ui): mark webshop integrations and orders tab as Beta WooCommerce and Shopify rows on the import page get a quiet Beta chip next to the title, and the webshop /orders sidebar item sets the existing betaBadge flag. Chip recipe matches the nav beta badge so Beta reads identically everywhere. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(mcp): enforce customer_number invariants and show it on the approval card Consolidated resolution pass for PR #1677: - skeptic (correctness): maxLength 32 was advertisement-only on the create path; now enforced with a runtime guard in gnubok_create_customer execute (clean errors for non-string and >32) and a 400 guard in commitCreateCustomer, matching the web/v1 routes and commitUpdateCustomer. - skeptic (correctness): CustomerPreview never rendered the staged customer_number, leaving the approver blind to the new field; added a conditional Kundnr row. - CodeRabbit: reset the event bus in create-customer.test.ts beforeEach. - Tests cover both new guards at the tool and executor layers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
387e1fb7f1
commit
cfdddb2d7e
@@ -4565,6 +4565,7 @@ export const tools: McpTool[] = [
|
||||
enum: ['individual', 'swedish_business', 'eu_business', 'non_eu_business'],
|
||||
description: 'Customer type',
|
||||
},
|
||||
customer_number: { type: 'string', maxLength: 32 },
|
||||
email: { type: 'string', description: 'Email address' },
|
||||
org_number: { type: 'string', description: 'Swedish org number' },
|
||||
vat_number: { type: 'string', description: 'EU VAT number' },
|
||||
@@ -4599,9 +4600,20 @@ export const tools: McpTool[] = [
|
||||
throw new Error('Invalid customer_type. Must be: individual, swedish_business, eu_business, non_eu_business')
|
||||
}
|
||||
|
||||
// Runtime guard (hosts don't always enforce inputSchema maxLength).
|
||||
const customerNumberArg = args.customer_number
|
||||
if (customerNumberArg != null && typeof customerNumberArg !== 'string') {
|
||||
throw new Error('customer_number must be a string.')
|
||||
}
|
||||
const customerNumber = typeof customerNumberArg === 'string' ? customerNumberArg.trim() : ''
|
||||
if (customerNumber.length > 32) {
|
||||
throw new Error('customer_number must be at most 32 characters.')
|
||||
}
|
||||
|
||||
const params = {
|
||||
name: name.trim(),
|
||||
customer_type: customerType,
|
||||
customer_number: customerNumber || null,
|
||||
email: (args.email as string) || null,
|
||||
org_number: (args.org_number as string) || null,
|
||||
vat_number: (args.vat_number as string) || null,
|
||||
|
||||
Reference in New Issue
Block a user