@teamnetwork-nz/feenix-mcp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +217 -0
- package/dist/client.d.ts +28 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +89 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/datetime.d.ts +4 -0
- package/dist/datetime.d.ts.map +1 -0
- package/dist/datetime.js +58 -0
- package/dist/datetime.js.map +1 -0
- package/dist/format.d.ts +10 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +126 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/quickorder.d.ts +568 -0
- package/dist/schemas/quickorder.d.ts.map +1 -0
- package/dist/schemas/quickorder.js +100 -0
- package/dist/schemas/quickorder.js.map +1 -0
- package/dist/tools/addresses.d.ts +3 -0
- package/dist/tools/addresses.d.ts.map +1 -0
- package/dist/tools/addresses.js +38 -0
- package/dist/tools/addresses.js.map +1 -0
- package/dist/tools/billing.d.ts +3 -0
- package/dist/tools/billing.d.ts.map +1 -0
- package/dist/tools/billing.js +33 -0
- package/dist/tools/billing.js.map +1 -0
- package/dist/tools/connection.d.ts +3 -0
- package/dist/tools/connection.d.ts.map +1 -0
- package/dist/tools/connection.js +38 -0
- package/dist/tools/connection.js.map +1 -0
- package/dist/tools/customers.d.ts +3 -0
- package/dist/tools/customers.d.ts.map +1 -0
- package/dist/tools/customers.js +72 -0
- package/dist/tools/customers.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +25 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inventory.d.ts +3 -0
- package/dist/tools/inventory.d.ts.map +1 -0
- package/dist/tools/inventory.js +80 -0
- package/dist/tools/inventory.js.map +1 -0
- package/dist/tools/misc.d.ts +3 -0
- package/dist/tools/misc.d.ts.map +1 -0
- package/dist/tools/misc.js +38 -0
- package/dist/tools/misc.js.map +1 -0
- package/dist/tools/orders.d.ts +3 -0
- package/dist/tools/orders.d.ts.map +1 -0
- package/dist/tools/orders.js +138 -0
- package/dist/tools/orders.js.map +1 -0
- package/dist/tools/products.d.ts +3 -0
- package/dist/tools/products.d.ts.map +1 -0
- package/dist/tools/products.js +63 -0
- package/dist/tools/products.js.map +1 -0
- package/dist/tools/services.d.ts +3 -0
- package/dist/tools/services.d.ts.map +1 -0
- package/dist/tools/services.js +120 -0
- package/dist/tools/services.js.map +1 -0
- package/dist/tools/subscribers.d.ts +3 -0
- package/dist/tools/subscribers.d.ts.map +1 -0
- package/dist/tools/subscribers.js +94 -0
- package/dist/tools/subscribers.js.map +1 -0
- package/dist/tools/vendors.d.ts +3 -0
- package/dist/tools/vendors.d.ts.map +1 -0
- package/dist/tools/vendors.js +68 -0
- package/dist/tools/vendors.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// Typed schema for the FeeniX Quick Order document, derived from the Public API docs.
|
|
3
|
+
// Nested objects and the root use .passthrough() so any field not modelled here can
|
|
4
|
+
// still be supplied verbatim — the parsed object IS the request body.
|
|
5
|
+
const siteInfo = z
|
|
6
|
+
.object({
|
|
7
|
+
demarc: z
|
|
8
|
+
.string()
|
|
9
|
+
.describe('Where the Fibre box should be installed (usually inside). Required.'),
|
|
10
|
+
siteContactName: z.string().describe('Name of the person who will be on site'),
|
|
11
|
+
siteContactNumber: z.string().describe('Phone of the on-site contact'),
|
|
12
|
+
siteContactEmail: z.string().describe('Email of the on-site contact'),
|
|
13
|
+
isBusinessAddress: z.boolean().describe('Is this a business address?'),
|
|
14
|
+
alias: z.string().optional().describe('Business name (when isBusinessAddress=true)'),
|
|
15
|
+
description: z.string().optional().describe('Business description (when isBusinessAddress=true)'),
|
|
16
|
+
siteAccessInformation: z.string().optional().describe('Relevant site-access information'),
|
|
17
|
+
siteAccessHours: z.string().optional().describe('Free-text access hours'),
|
|
18
|
+
endServiceProvider: z.string().optional().describe('Name of 3rd party with the customer relationship'),
|
|
19
|
+
hasMedicalEmergencyOnSite: z.boolean().optional().describe('Emergency medical equipment on site?'),
|
|
20
|
+
medicalEmergencyDetails: z.string().optional().describe('Details of on-site emergency medical equipment'),
|
|
21
|
+
})
|
|
22
|
+
.passthrough();
|
|
23
|
+
const tailOrder = z
|
|
24
|
+
.object({
|
|
25
|
+
orderAim: z
|
|
26
|
+
.string()
|
|
27
|
+
.describe('New / Connect / Migrate / Modify / Disconnect (not case sensitive)'),
|
|
28
|
+
circuitTerminationId: z.string().optional().describe('ONT_ID when orderAim="Connect"'),
|
|
29
|
+
existingServiceId: z.string().optional().describe('Existing fibre/copper service id when migrating'),
|
|
30
|
+
existingServiceProvider: z.string().optional().describe('Losing Service Provider name when migrating'),
|
|
31
|
+
targetDate: z.string().optional().describe('Requested date, e.g. "2020-06-01T09:00:00" (NZT)'),
|
|
32
|
+
tailOrderAttributes: z
|
|
33
|
+
.array(z.record(z.unknown()))
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('Array of {name,value} objects, e.g. [{"name":"ONT_ID","value":"1234567"}]'),
|
|
36
|
+
})
|
|
37
|
+
.passthrough();
|
|
38
|
+
const voiceOrder = z
|
|
39
|
+
.object({
|
|
40
|
+
orderAim: z.string().optional().describe('"Migrate" or "New" (default New)'),
|
|
41
|
+
username: z.string().optional(),
|
|
42
|
+
})
|
|
43
|
+
.passthrough();
|
|
44
|
+
const modemOrder = z
|
|
45
|
+
.object({
|
|
46
|
+
firstName: z.string().optional(),
|
|
47
|
+
lastName: z.string().optional(),
|
|
48
|
+
streetAddress: z.string().optional(),
|
|
49
|
+
city: z.string().optional(),
|
|
50
|
+
postCode: z.string().optional(),
|
|
51
|
+
})
|
|
52
|
+
.passthrough();
|
|
53
|
+
const meshOrder = z
|
|
54
|
+
.object({
|
|
55
|
+
companyName: z.string().optional(),
|
|
56
|
+
firstName: z.string().optional(),
|
|
57
|
+
lastName: z.string().optional(),
|
|
58
|
+
streetAddress: z.string().optional(),
|
|
59
|
+
city: z.string().optional(),
|
|
60
|
+
postCode: z.string().optional(),
|
|
61
|
+
email: z.string().optional(),
|
|
62
|
+
phone: z.string().optional(),
|
|
63
|
+
notes: z.string().optional(),
|
|
64
|
+
})
|
|
65
|
+
.passthrough();
|
|
66
|
+
export const quickOrderShape = {
|
|
67
|
+
// --- Required ---
|
|
68
|
+
address: z.string().describe('Address _id (NOT the TUI) — from prequal address._id'),
|
|
69
|
+
soldProduct: z
|
|
70
|
+
.string()
|
|
71
|
+
.describe('Sold product _id from prequal (availableQuickOrderProducts.soldProduct._id, productClass="subscriber plan")'),
|
|
72
|
+
tailProduct: z.string().describe('Tail product _id from prequal'),
|
|
73
|
+
subscriberName: z.string().describe('The subscriber name'),
|
|
74
|
+
username: z.string().describe('Subscriber username, e.g. user@feenix.co.nz'),
|
|
75
|
+
orderContactName: z.string().describe('Order contact person name'),
|
|
76
|
+
orderContactNumber: z.string().describe('Order contact person phone'),
|
|
77
|
+
orderContactEmail: z.string().describe('Order contact person email'),
|
|
78
|
+
siteInfo,
|
|
79
|
+
tailOrder,
|
|
80
|
+
// --- Optional ---
|
|
81
|
+
tailVariant: z.string().optional().describe('Tail variant _id from prequal'),
|
|
82
|
+
projectName: z.string().optional().describe('Optional name to group multiple orders'),
|
|
83
|
+
modemProduct: z.string().optional().describe('Modem product _id (required for Modem orders)'),
|
|
84
|
+
voiceProduct: z.string().optional().describe('Voice product _id (required for Voice orders)'),
|
|
85
|
+
meshProduct: z.array(z.string()).optional().describe('Array of mesh product _ids (required for Mesh)'),
|
|
86
|
+
customerReference: z.string().optional().describe('Reference for the ongoing service lifetime'),
|
|
87
|
+
customerOrderReference: z.string().optional().describe('Reference used only during provisioning'),
|
|
88
|
+
ipAddressAssignment: z
|
|
89
|
+
.string()
|
|
90
|
+
.optional()
|
|
91
|
+
.describe('"DYNAMIC" | "STATIC" | "CG-NAT" (case independent, default DYNAMIC)'),
|
|
92
|
+
voiceOrder: voiceOrder.optional(),
|
|
93
|
+
modemOrder: modemOrder.optional(),
|
|
94
|
+
meshOrder: meshOrder.optional(),
|
|
95
|
+
forCustomer: z.string().optional().describe('FeeniX Admin only — order on behalf of a customer _id'),
|
|
96
|
+
resold: z.record(z.unknown()).optional(),
|
|
97
|
+
};
|
|
98
|
+
// Root schema: passthrough so any additional documented field is accepted verbatim.
|
|
99
|
+
export const quickOrderSchema = z.object(quickOrderShape).passthrough();
|
|
100
|
+
//# sourceMappingURL=quickorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickorder.js","sourceRoot":"","sources":["../../src/schemas/quickorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.d.ts","sourceRoot":"","sources":["../../src/tools/addresses.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAO,MAAM,YAAY,EAAE,cAAc,EAuCxC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock } from '../format.js';
|
|
3
|
+
export const addressTools = [
|
|
4
|
+
{
|
|
5
|
+
name: 'feenix_search_addresses',
|
|
6
|
+
description: 'Search FeeniX addresses by free-text query (e.g. "12 Wadier Place, Henderson"). Returns matching addresses with their TUI identifiers, which feed feenix_address_prequal and ordering.',
|
|
7
|
+
inputSchema: z
|
|
8
|
+
.object({
|
|
9
|
+
q: z.string().describe('Address search string, e.g. "12 Wadier Place, Henderson"'),
|
|
10
|
+
})
|
|
11
|
+
.strict(),
|
|
12
|
+
handler: async (client, args) => {
|
|
13
|
+
const data = await client.get('/api/v1/addresses', { q: args.q });
|
|
14
|
+
return jsonBlock(`Addresses matching "${args.q}"`, data);
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'feenix_address_prequal',
|
|
19
|
+
description: 'Get full pre-qualification (available services/technologies) for an address by its TUI. Optionally limit to specific technologies for a faster response (e.g. Wireless avoids the daily Chorus wireline limit).',
|
|
20
|
+
inputSchema: z
|
|
21
|
+
.object({
|
|
22
|
+
tui: z.string().describe('The address TUI (from feenix_search_addresses)'),
|
|
23
|
+
techFilter: z
|
|
24
|
+
.array(z.string())
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Limit to these technologies, e.g. ["Wireless"], ["Fibre"]. Omit for all.'),
|
|
27
|
+
})
|
|
28
|
+
.strict(),
|
|
29
|
+
handler: async (client, args) => {
|
|
30
|
+
const params = {};
|
|
31
|
+
if (args.techFilter?.length)
|
|
32
|
+
params['techFilter'] = JSON.stringify(args.techFilter);
|
|
33
|
+
const data = await client.get(`/api/v2/addresses/${encodeURIComponent(args.tui)}/prequal`, params);
|
|
34
|
+
return jsonBlock(`Prequalification — TUI ${args.tui}`, data);
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
//# sourceMappingURL=addresses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../src/tools/addresses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,wLAAwL;QAC1L,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;SACnF,CAAC;aACD,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,mBAAmB,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO,SAAS,CAAC,uBAAuB,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC;KACF;IAED;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,iNAAiN;QACnN,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YAC1E,UAAU,EAAE,CAAC;iBACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,0EAA0E,CAAC;SACxF,CAAC;aACD,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAC3D,MAAM,CACP,CAAC;YACF,OAAO,SAAS,CAAC,0BAA0B,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/D,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAO,MAAM,YAAY,EAAE,cAAc,EA+BxC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock } from '../format.js';
|
|
3
|
+
export const billingTools = [
|
|
4
|
+
{
|
|
5
|
+
name: 'feenix_query_invoices',
|
|
6
|
+
description: 'Return a summary of invoices issued between two dates (inclusive). Dates are YYYY-MM-DD.',
|
|
7
|
+
inputSchema: z
|
|
8
|
+
.object({
|
|
9
|
+
startDate: z.string().describe('Period start date, YYYY-MM-DD'),
|
|
10
|
+
endDate: z.string().describe('Period end date, YYYY-MM-DD'),
|
|
11
|
+
})
|
|
12
|
+
.strict(),
|
|
13
|
+
handler: async (client, args) => {
|
|
14
|
+
const data = await client.get('/api/v1/invoices', {
|
|
15
|
+
startDate: args.startDate,
|
|
16
|
+
endDate: args.endDate,
|
|
17
|
+
});
|
|
18
|
+
return jsonBlock(`Invoices ${args.startDate} → ${args.endDate}`, data);
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'feenix_get_invoice',
|
|
23
|
+
description: 'Get a single invoice by its invoice number (e.g. "INV-0001") or its Xero invoice ID (UUID).',
|
|
24
|
+
inputSchema: z
|
|
25
|
+
.object({ invoice: z.string().describe('Invoice number (INV-0001) or invoice ID (UUID)') })
|
|
26
|
+
.strict(),
|
|
27
|
+
handler: async (client, args) => {
|
|
28
|
+
const data = await client.get(`/api/v1/invoices/${encodeURIComponent(args.invoice)}`);
|
|
29
|
+
return jsonBlock(`Invoice ${args.invoice}`, data);
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
//# sourceMappingURL=billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,0FAA0F;QAC5F,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;SAC5D,CAAC;aACD,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,kBAAkB,EAAE;gBACzD,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,OAAO,SAAS,CAAC,YAAY,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QACzE,CAAC;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,6FAA6F;QAC/F,WAAW,EAAE,CAAC;aACX,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC,EAAE,CAAC;aAC1F,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/F,OAAO,SAAS,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/tools/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAO,MAAM,eAAe,EAAE,cAAc,EAsC3C,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock } from '../format.js';
|
|
3
|
+
export const connectionTools = [
|
|
4
|
+
{
|
|
5
|
+
name: 'feenix_test_connection',
|
|
6
|
+
description: 'Verify FeeniX connectivity and credentials by resolving the customer that owns the API key. Reports base URL and read-only/read-write mode.',
|
|
7
|
+
inputSchema: z.object({}).strict(),
|
|
8
|
+
handler: async (client) => {
|
|
9
|
+
const resp = await client.get('/api/v1/customerFromApiKey');
|
|
10
|
+
// The API wraps the record as { customer: {...} }.
|
|
11
|
+
const customer = resp?.['customer'] ?? resp ?? {};
|
|
12
|
+
const mode = client.isReadWrite()
|
|
13
|
+
? '✏️ read-write'
|
|
14
|
+
: '🔒 read-only (set FEENIX_READWRITE=true to enable writes/orders)';
|
|
15
|
+
const name = customer?.['name'] ??
|
|
16
|
+
customer?.['shortName'] ??
|
|
17
|
+
customer?.['number'] ??
|
|
18
|
+
customer?.['_id'] ??
|
|
19
|
+
'(unknown)';
|
|
20
|
+
return [
|
|
21
|
+
'FeeniX connection successful.',
|
|
22
|
+
`- **Base URL**: ${client.getBaseUrl()}`,
|
|
23
|
+
`- **Mode**: ${mode}`,
|
|
24
|
+
`- **API key owner**: ${String(name)}`,
|
|
25
|
+
].join('\n');
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'feenix_get_customer_from_apikey',
|
|
30
|
+
description: 'Return the full customer record that the configured API key belongs to (identity, callback settings, etc.).',
|
|
31
|
+
inputSchema: z.object({}).strict(),
|
|
32
|
+
handler: async (client) => {
|
|
33
|
+
const customer = await client.get('/api/v1/customerFromApiKey');
|
|
34
|
+
return jsonBlock('Customer (from API key)', customer);
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/tools/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,6IAA6I;QAC/I,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAA0B,4BAA4B,CAAC,CAAC;YACrF,mDAAmD;YACnD,MAAM,QAAQ,GAAI,IAAI,EAAE,CAAC,UAAU,CAAyC,IAAI,IAAI,IAAI,EAAE,CAAC;YAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE;gBAC/B,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,kEAAkE,CAAC;YACvE,MAAM,IAAI,GACR,QAAQ,EAAE,CAAC,MAAM,CAAC;gBAClB,QAAQ,EAAE,CAAC,WAAW,CAAC;gBACvB,QAAQ,EAAE,CAAC,QAAQ,CAAC;gBACpB,QAAQ,EAAE,CAAC,KAAK,CAAC;gBACjB,WAAW,CAAC;YACd,OAAO;gBACL,+BAA+B;gBAC/B,mBAAmB,MAAM,CAAC,UAAU,EAAE,EAAE;gBACxC,eAAe,IAAI,EAAE;gBACrB,wBAAwB,MAAM,CAAC,IAAI,CAAC,EAAE;aACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;IAED;QACE,IAAI,EAAE,iCAAiC;QACvC,WAAW,EACT,6GAA6G;QAC/G,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAA0B,4BAA4B,CAAC,CAAC;YACzF,OAAO,SAAS,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customers.d.ts","sourceRoot":"","sources":["../../src/tools/customers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C,eAAO,MAAM,aAAa,EAAE,cAAc,EAwEzC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock, modelsList } from '../format.js';
|
|
3
|
+
const idArg = { customerId: z.string().describe('Customer _id') };
|
|
4
|
+
const bodyArg = {
|
|
5
|
+
body: z.record(z.unknown()).describe('Customer document (JSON object) as accepted by the FeeniX API'),
|
|
6
|
+
};
|
|
7
|
+
export const customerTools = [
|
|
8
|
+
{
|
|
9
|
+
name: 'feenix_list_customers',
|
|
10
|
+
description: 'List all customers.',
|
|
11
|
+
inputSchema: z.object({}).strict(),
|
|
12
|
+
handler: async (client) => {
|
|
13
|
+
const data = await client.get('/api/v1/customer');
|
|
14
|
+
return modelsList('Customers', data, ['_id', 'name', 'shortName', 'number', 'status']);
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'feenix_get_customer',
|
|
19
|
+
description: 'Get one customer by _id.',
|
|
20
|
+
inputSchema: z.object(idArg).strict(),
|
|
21
|
+
handler: async (client, args) => {
|
|
22
|
+
const data = await client.get(`/api/v1/customer/${encodeURIComponent(args.customerId)}`);
|
|
23
|
+
return jsonBlock(`Customer ${args.customerId}`, data);
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'feenix_create_customer',
|
|
28
|
+
description: '[write] Create a customer. Requires FEENIX_READWRITE=true.',
|
|
29
|
+
inputSchema: z.object(bodyArg).strict(),
|
|
30
|
+
handler: async (client, args) => {
|
|
31
|
+
const data = await client.post('/api/v1/customer', args.body);
|
|
32
|
+
return jsonBlock('Created customer', data);
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'feenix_update_customer',
|
|
37
|
+
description: '[write] Update a customer by _id. Requires FEENIX_READWRITE=true.',
|
|
38
|
+
inputSchema: z.object({ ...idArg, ...bodyArg }).strict(),
|
|
39
|
+
handler: async (client, args) => {
|
|
40
|
+
const data = await client.put(`/api/v1/customer/${encodeURIComponent(args.customerId)}`, args.body);
|
|
41
|
+
return jsonBlock(`Updated customer ${args.customerId}`, data);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'feenix_delete_customer',
|
|
46
|
+
description: '[write] Delete a customer by _id. Requires FEENIX_READWRITE=true.',
|
|
47
|
+
inputSchema: z.object(idArg).strict(),
|
|
48
|
+
handler: async (client, args) => {
|
|
49
|
+
const data = await client.delete(`/api/v1/customer/${encodeURIComponent(args.customerId)}`);
|
|
50
|
+
return jsonBlock(`Deleted customer ${args.customerId}`, data ?? { deleted: true });
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'feenix_set_callback_url',
|
|
55
|
+
description: '[write] Set/update the callback (webhook) URL and settings for a customer by _id. Requires FEENIX_READWRITE=true.',
|
|
56
|
+
inputSchema: z.object({ ...idArg, ...bodyArg }).strict(),
|
|
57
|
+
handler: async (client, args) => {
|
|
58
|
+
const data = await client.put(`/api/v2/customer/${encodeURIComponent(args.customerId)}`, args.body);
|
|
59
|
+
return jsonBlock(`Callback settings — customer ${args.customerId}`, data);
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'feenix_test_callback',
|
|
64
|
+
description: '[write] Trigger a test callback to the configured customer callback URL. Requires FEENIX_READWRITE=true.',
|
|
65
|
+
inputSchema: z.object({ body: z.record(z.unknown()).optional() }).strict(),
|
|
66
|
+
handler: async (client, args) => {
|
|
67
|
+
const data = await client.post('/api/v2/customer/testcallback', args.body ?? {});
|
|
68
|
+
return jsonBlock('Test callback result', data);
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
//# sourceMappingURL=customers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customers.js","sourceRoot":"","sources":["../../src/tools/customers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,QAAQ,EAAE,cAAc,EAYpC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { connectionTools } from './connection.js';
|
|
2
|
+
import { addressTools } from './addresses.js';
|
|
3
|
+
import { productTools } from './products.js';
|
|
4
|
+
import { serviceTools } from './services.js';
|
|
5
|
+
import { orderTools } from './orders.js';
|
|
6
|
+
import { subscriberTools } from './subscribers.js';
|
|
7
|
+
import { inventoryTools } from './inventory.js';
|
|
8
|
+
import { vendorTools } from './vendors.js';
|
|
9
|
+
import { customerTools } from './customers.js';
|
|
10
|
+
import { billingTools } from './billing.js';
|
|
11
|
+
import { miscTools } from './misc.js';
|
|
12
|
+
export const allTools = [
|
|
13
|
+
...connectionTools,
|
|
14
|
+
...addressTools,
|
|
15
|
+
...productTools,
|
|
16
|
+
...serviceTools,
|
|
17
|
+
...orderTools,
|
|
18
|
+
...subscriberTools,
|
|
19
|
+
...inventoryTools,
|
|
20
|
+
...vendorTools,
|
|
21
|
+
...customerTools,
|
|
22
|
+
...billingTools,
|
|
23
|
+
...miscTools,
|
|
24
|
+
];
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,GAAG,eAAe;IAClB,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,UAAU;IACb,GAAG,eAAe;IAClB,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,aAAa;IAChB,GAAG,YAAY;IACf,GAAG,SAAS;CACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../src/tools/inventory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAmB,MAAM,aAAa,CAAC;AAQ9D,eAAO,MAAM,cAAc,EAAE,cAAc,EA2E1C,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock, modelsList } from '../format.js';
|
|
3
|
+
const idArg = { inventoryId: z.string().describe('Inventory record _id') };
|
|
4
|
+
const bodyArg = {
|
|
5
|
+
body: z.record(z.unknown()).describe('Inventory document (JSON object) as accepted by the FeeniX API'),
|
|
6
|
+
};
|
|
7
|
+
export const inventoryTools = [
|
|
8
|
+
{
|
|
9
|
+
name: 'feenix_list_inventory',
|
|
10
|
+
description: 'List inventory records. Supports server-side filtering (e.g. by asset serial number) and pagination.',
|
|
11
|
+
inputSchema: z
|
|
12
|
+
.object({
|
|
13
|
+
serialNumber: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Convenience filter on asset.serialNumber'),
|
|
17
|
+
filter: z
|
|
18
|
+
.record(z.unknown())
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Raw serverSideFilter object (merged with serialNumber), e.g. { "asset.serialNumber": "..." }'),
|
|
21
|
+
limit: z.number().int().min(1).max(200).optional().describe('Page size'),
|
|
22
|
+
page: z.number().int().min(1).optional().describe('Page number (1-based)'),
|
|
23
|
+
})
|
|
24
|
+
.strict(),
|
|
25
|
+
handler: async (client, args) => {
|
|
26
|
+
const filter = { ...(args.filter ?? {}) };
|
|
27
|
+
if (args.serialNumber)
|
|
28
|
+
filter['asset.serialNumber'] = args.serialNumber;
|
|
29
|
+
const query = {};
|
|
30
|
+
if (Object.keys(filter).length)
|
|
31
|
+
query.serverSideFilter = filter;
|
|
32
|
+
query.serverSidePaginateInfo = {
|
|
33
|
+
limit: args.limit ?? client.getDefaultPageSize(),
|
|
34
|
+
page: args.page ?? 1,
|
|
35
|
+
};
|
|
36
|
+
const data = await client.get('/api/v1/inventorys', { data: JSON.stringify(query) });
|
|
37
|
+
return modelsList('Inventory records', data);
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'feenix_get_inventory',
|
|
42
|
+
description: 'Get one inventory record by _id.',
|
|
43
|
+
inputSchema: z.object(idArg).strict(),
|
|
44
|
+
handler: async (client, args) => {
|
|
45
|
+
const data = await client.get(`/api/v1/inventorys/${encodeURIComponent(args.inventoryId)}`);
|
|
46
|
+
return jsonBlock(`Inventory ${args.inventoryId}`, data);
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'feenix_create_inventory',
|
|
51
|
+
description: '[write] Create an inventory record. Requires FEENIX_READWRITE=true.',
|
|
52
|
+
inputSchema: z.object(bodyArg).strict(),
|
|
53
|
+
handler: async (client, args) => {
|
|
54
|
+
const data = await client.post('/api/v1/inventorys', args.body);
|
|
55
|
+
return jsonBlock('Created inventory record', data);
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'feenix_update_inventory',
|
|
60
|
+
description: '[write] Update an inventory record by _id. Optionally push config to the device. Requires FEENIX_READWRITE=true.',
|
|
61
|
+
inputSchema: z
|
|
62
|
+
.object({ ...idArg, ...bodyArg, pushConfig: z.boolean().optional().describe('Push config to device (default false)') })
|
|
63
|
+
.strict(),
|
|
64
|
+
handler: async (client, args) => {
|
|
65
|
+
const suffix = args.pushConfig !== undefined ? `?pushConfig=${args.pushConfig}` : '';
|
|
66
|
+
const data = await client.put(`/api/v1/inventorys/${encodeURIComponent(args.inventoryId)}${suffix}`, args.body);
|
|
67
|
+
return jsonBlock(`Updated inventory ${args.inventoryId}`, data);
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'feenix_delete_inventory',
|
|
72
|
+
description: '[write] Delete an inventory record by _id. Requires FEENIX_READWRITE=true.',
|
|
73
|
+
inputSchema: z.object(idArg).strict(),
|
|
74
|
+
handler: async (client, args) => {
|
|
75
|
+
const data = await client.delete(`/api/v1/inventorys/${encodeURIComponent(args.inventoryId)}`);
|
|
76
|
+
return jsonBlock(`Deleted inventory ${args.inventoryId}`, data ?? { deleted: true });
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/tools/inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/tools/misc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAO,MAAM,SAAS,EAAE,cAAc,EAwCrC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock } from '../format.js';
|
|
3
|
+
export const miscTools = [
|
|
4
|
+
{
|
|
5
|
+
name: 'feenix_get_call_details',
|
|
6
|
+
description: 'Get summary Call Detail Records (CDRs) for a phone number over a date range. accountName is the phone number; dates accept any parseable date string (ISO recommended).',
|
|
7
|
+
inputSchema: z
|
|
8
|
+
.object({
|
|
9
|
+
accountName: z.string().describe('The phone number to query (the CDR "accountName")'),
|
|
10
|
+
startDate: z.string().describe('Range start, e.g. 2020-01-01T00:00:00.000Z'),
|
|
11
|
+
endDate: z.string().describe('Range end, e.g. 2020-01-31T23:59:59.000Z'),
|
|
12
|
+
})
|
|
13
|
+
.strict(),
|
|
14
|
+
handler: async (client, args) => {
|
|
15
|
+
const data = await client.get('/api/v1/voice/calldetails', {
|
|
16
|
+
accountName: args.accountName,
|
|
17
|
+
startDate: args.startDate,
|
|
18
|
+
endDate: args.endDate,
|
|
19
|
+
});
|
|
20
|
+
return jsonBlock(`Call details — ${args.accountName}`, data);
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'feenix_get_task_notifications',
|
|
25
|
+
description: 'List notifications created for a request/task during the order process. notificationType is e.g. "Callback".',
|
|
26
|
+
inputSchema: z
|
|
27
|
+
.object({
|
|
28
|
+
issueId: z.string().describe('The request/task _id'),
|
|
29
|
+
notificationType: z.string().describe('Notification type, e.g. "Callback"'),
|
|
30
|
+
})
|
|
31
|
+
.strict(),
|
|
32
|
+
handler: async (client, args) => {
|
|
33
|
+
const data = await client.get(`/api/v1/requests/${encodeURIComponent(args.issueId)}/notifications/${encodeURIComponent(args.notificationType)}`);
|
|
34
|
+
return jsonBlock(`Notifications — task ${args.issueId} (${args.notificationType})`, data);
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
//# sourceMappingURL=misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/tools/misc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,MAAM,SAAS,GAAqB;IACzC;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,yKAAyK;QAC3K,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;YACrF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YAC5E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;SACzE,CAAC;aACD,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,2BAA2B,EAAE;gBAClE,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,OAAO,SAAS,CAAC,kBAAkB,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/D,CAAC;KACF;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,WAAW,EACT,8GAA8G;QAChH,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACpD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;SAC5E,CAAC;aACD,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,kBAAkB,CACtF,IAAI,CAAC,gBAAgB,CACtB,EAAE,CACJ,CAAC;YACF,OAAO,SAAS,CAAC,wBAAwB,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,gBAAgB,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5F,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/tools/orders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA4B7C,eAAO,MAAM,UAAU,EAAE,cAAc,EA8ItC,CAAC"}
|