@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,138 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock } from '../format.js';
|
|
3
|
+
import { quickOrderSchema } from '../schemas/quickorder.js';
|
|
4
|
+
const bodyArg = {
|
|
5
|
+
body: z.record(z.unknown()).describe('Request document (JSON object) as accepted by the FeeniX API'),
|
|
6
|
+
};
|
|
7
|
+
// Quick Order search fields are CASE SENSITIVE (per the API docs).
|
|
8
|
+
const SEARCH_FIELDS = [
|
|
9
|
+
'name',
|
|
10
|
+
'number',
|
|
11
|
+
'issueType',
|
|
12
|
+
'issueSubType',
|
|
13
|
+
'category',
|
|
14
|
+
'otherCategory',
|
|
15
|
+
'status',
|
|
16
|
+
'subStatus',
|
|
17
|
+
'waitingOn',
|
|
18
|
+
'customerReference',
|
|
19
|
+
'customerOrderReference',
|
|
20
|
+
'description',
|
|
21
|
+
'additionalInformation',
|
|
22
|
+
'team',
|
|
23
|
+
'nextAction',
|
|
24
|
+
'vendorStatus',
|
|
25
|
+
];
|
|
26
|
+
export const orderTools = [
|
|
27
|
+
{
|
|
28
|
+
name: 'feenix_quickorder_search',
|
|
29
|
+
description: 'Search orders by criteria. Field names are CASE SENSITIVE and include: ' +
|
|
30
|
+
SEARCH_FIELDS.join(', ') +
|
|
31
|
+
'. Pass any subset as `criteria`.',
|
|
32
|
+
inputSchema: z
|
|
33
|
+
.object({
|
|
34
|
+
criteria: z
|
|
35
|
+
.record(z.unknown())
|
|
36
|
+
.describe('Search criteria object, e.g. { "number": "ORD-123", "status": "Open" }'),
|
|
37
|
+
})
|
|
38
|
+
.strict(),
|
|
39
|
+
handler: async (client, args) => {
|
|
40
|
+
const data = await client.get('/api/v2/quickorder/search', args.criteria);
|
|
41
|
+
return jsonBlock('Quick Order search', data);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'feenix_quick_order',
|
|
46
|
+
description: '[write] Place a Quick Order (provision a service, churn, voice, modem, mesh). Fields map to the QuickOrder document; any unmodelled field may be supplied verbatim. Requires FEENIX_READWRITE=true.',
|
|
47
|
+
inputSchema: quickOrderSchema,
|
|
48
|
+
handler: async (client, args) => {
|
|
49
|
+
const data = await client.post('/api/v2/quickorder', args);
|
|
50
|
+
return jsonBlock('Quick Order result', data);
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'feenix_quick_order_subscriber',
|
|
55
|
+
description: '[write] Place a Quick Order that also creates/attaches a subscriber. Same document shape as feenix_quick_order. Requires FEENIX_READWRITE=true.',
|
|
56
|
+
inputSchema: quickOrderSchema,
|
|
57
|
+
handler: async (client, args) => {
|
|
58
|
+
const data = await client.post('/api/v2/quickorder/subscriber', args);
|
|
59
|
+
return jsonBlock('Quick Order (subscriber) result', data);
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'feenix_amend_order',
|
|
64
|
+
description: '[write] Amend an in-flight order identified by its task id. Requires FEENIX_READWRITE=true.',
|
|
65
|
+
inputSchema: z.object({ taskId: z.string(), ...bodyArg }).strict(),
|
|
66
|
+
handler: async (client, args) => {
|
|
67
|
+
const data = await client.post(`/api/v1/issues/${encodeURIComponent(args.taskId)}/amend`, args.body);
|
|
68
|
+
return jsonBlock(`Amend order — task ${args.taskId}`, data);
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'feenix_cancel_order',
|
|
73
|
+
description: '[write] Cancel an in-flight order identified by its request id. Requires FEENIX_READWRITE=true.',
|
|
74
|
+
inputSchema: z
|
|
75
|
+
.object({ requestId: z.string(), body: z.record(z.unknown()).optional() })
|
|
76
|
+
.strict(),
|
|
77
|
+
handler: async (client, args) => {
|
|
78
|
+
const data = await client.post(`/api/v1/issues/${encodeURIComponent(args.requestId)}/cancel`, args.body ?? {});
|
|
79
|
+
return jsonBlock(`Cancel order — request ${args.requestId}`, data);
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
// ---- Tail order (staged appointment-based provisioning) --------------------
|
|
83
|
+
{
|
|
84
|
+
name: 'feenix_tailorder_run_feasibility',
|
|
85
|
+
description: '[write] Run feasibility for a tail order (task id). Requires FEENIX_READWRITE=true.',
|
|
86
|
+
inputSchema: z.object({ taskId: z.string(), body: z.record(z.unknown()).optional() }).strict(),
|
|
87
|
+
handler: async (client, args) => {
|
|
88
|
+
const data = await client.post(`/api/v1/tailorder/${encodeURIComponent(args.taskId)}/runFeasibility`, args.body ?? {});
|
|
89
|
+
return jsonBlock(`Tail order feasibility — task ${args.taskId}`, data);
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'feenix_tailorder_get_available_appointments',
|
|
94
|
+
description: '[write] Get available install appointments for a tail order (task id). Requires FEENIX_READWRITE=true.',
|
|
95
|
+
inputSchema: z.object({ taskId: z.string(), body: z.record(z.unknown()).optional() }).strict(),
|
|
96
|
+
handler: async (client, args) => {
|
|
97
|
+
const data = await client.post(`/api/v1/tailorder/${encodeURIComponent(args.taskId)}/getAvailableAppointments`, args.body ?? {});
|
|
98
|
+
return jsonBlock(`Tail order appointments — task ${args.taskId}`, data);
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'feenix_tailorder_reserve_appointment',
|
|
103
|
+
description: '[write] Reserve an appointment for a tail order (task id). Requires FEENIX_READWRITE=true.',
|
|
104
|
+
inputSchema: z.object({ taskId: z.string(), ...bodyArg }).strict(),
|
|
105
|
+
handler: async (client, args) => {
|
|
106
|
+
const data = await client.post(`/api/v1/tailorder/${encodeURIComponent(args.taskId)}/reserveAppointment`, args.body);
|
|
107
|
+
return jsonBlock(`Tail order reserve — task ${args.taskId}`, data);
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'feenix_tailorder_service_given',
|
|
112
|
+
description: '[write] Mark service-given for a tail order (task id). Requires FEENIX_READWRITE=true.',
|
|
113
|
+
inputSchema: z.object({ taskId: z.string(), body: z.record(z.unknown()).optional() }).strict(),
|
|
114
|
+
handler: async (client, args) => {
|
|
115
|
+
const data = await client.post(`/api/v1/tailorder/${encodeURIComponent(args.taskId)}/serviceGiven`, args.body ?? {});
|
|
116
|
+
return jsonBlock(`Tail order service given — task ${args.taskId}`, data);
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'feenix_tailorder_order',
|
|
121
|
+
description: '[write] Submit the tail order (task id). Requires FEENIX_READWRITE=true.',
|
|
122
|
+
inputSchema: z.object({ taskId: z.string(), ...bodyArg }).strict(),
|
|
123
|
+
handler: async (client, args) => {
|
|
124
|
+
const data = await client.post(`/api/v2/tailorder/${encodeURIComponent(args.taskId)}/order`, args.body);
|
|
125
|
+
return jsonBlock(`Tail order submit — task ${args.taskId}`, data);
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: 'feenix_modemorder_complete',
|
|
130
|
+
description: '[write] Complete a modem order (task id). Requires FEENIX_READWRITE=true.',
|
|
131
|
+
inputSchema: z.object({ taskId: z.string(), body: z.record(z.unknown()).optional() }).strict(),
|
|
132
|
+
handler: async (client, args) => {
|
|
133
|
+
const data = await client.post(`/api/v2/modemorder/${encodeURIComponent(args.taskId)}/complete`, args.body ?? {});
|
|
134
|
+
return jsonBlock(`Modem order complete — task ${args.taskId}`, data);
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
//# sourceMappingURL=orders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../src/tools/orders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../src/tools/products.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C,eAAO,MAAM,YAAY,EAAE,cAAc,EA0DxC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock, modelsList } from '../format.js';
|
|
3
|
+
const idArg = { productId: z.string().describe('Product _id') };
|
|
4
|
+
const bodyArg = {
|
|
5
|
+
body: z.record(z.unknown()).describe('Product document (JSON object) as accepted by the FeeniX API'),
|
|
6
|
+
};
|
|
7
|
+
export const productTools = [
|
|
8
|
+
{
|
|
9
|
+
name: 'feenix_list_products',
|
|
10
|
+
description: 'List all products in the catalogue.',
|
|
11
|
+
inputSchema: z.object({}).strict(),
|
|
12
|
+
handler: async (client) => {
|
|
13
|
+
const data = await client.get('/api/v1/products');
|
|
14
|
+
return modelsList('Products', data, ['_id', 'name', 'number', 'productClass', 'category']);
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'feenix_get_product',
|
|
19
|
+
description: 'Get one product by its _id.',
|
|
20
|
+
inputSchema: z.object(idArg).strict(),
|
|
21
|
+
handler: async (client, args) => {
|
|
22
|
+
const data = await client.get(`/api/v1/products/${encodeURIComponent(args.productId)}`);
|
|
23
|
+
return jsonBlock(`Product ${args.productId}`, data);
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'feenix_get_product_variants_csv',
|
|
28
|
+
description: 'Get the product variants list as CSV (returned as raw text).',
|
|
29
|
+
inputSchema: z.object({}).strict(),
|
|
30
|
+
handler: async (client) => {
|
|
31
|
+
const data = await client.get('/api/v1/products/variantsListCsv');
|
|
32
|
+
return jsonBlock('Product variants (CSV)', data);
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'feenix_create_product',
|
|
37
|
+
description: '[write] Create a new product. Requires FEENIX_READWRITE=true.',
|
|
38
|
+
inputSchema: z.object(bodyArg).strict(),
|
|
39
|
+
handler: async (client, args) => {
|
|
40
|
+
const data = await client.post('/api/v1/products', args.body);
|
|
41
|
+
return jsonBlock('Created product', data);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'feenix_update_product',
|
|
46
|
+
description: '[write] Update an existing product by _id. Requires FEENIX_READWRITE=true.',
|
|
47
|
+
inputSchema: z.object({ ...idArg, ...bodyArg }).strict(),
|
|
48
|
+
handler: async (client, args) => {
|
|
49
|
+
const data = await client.put(`/api/v1/products/${encodeURIComponent(args.productId)}`, args.body);
|
|
50
|
+
return jsonBlock(`Updated product ${args.productId}`, data);
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'feenix_delete_product',
|
|
55
|
+
description: '[write] Delete a product by _id. Requires FEENIX_READWRITE=true.',
|
|
56
|
+
inputSchema: z.object(idArg).strict(),
|
|
57
|
+
handler: async (client, args) => {
|
|
58
|
+
const data = await client.delete(`/api/v1/products/${encodeURIComponent(args.productId)}`);
|
|
59
|
+
return jsonBlock(`Deleted product ${args.productId}`, data ?? { deleted: true });
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
//# sourceMappingURL=products.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.js","sourceRoot":"","sources":["../../src/tools/products.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/tools/services.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO7C,eAAO,MAAM,YAAY,EAAE,cAAc,EAuIxC,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock, modelsList } from '../format.js';
|
|
3
|
+
const bodyArg = {
|
|
4
|
+
body: z.record(z.unknown()).describe('Request document (JSON object) as accepted by the FeeniX API'),
|
|
5
|
+
};
|
|
6
|
+
export const serviceTools = [
|
|
7
|
+
{
|
|
8
|
+
name: 'feenix_list_services',
|
|
9
|
+
description: 'List all sold services.',
|
|
10
|
+
inputSchema: z.object({}).strict(),
|
|
11
|
+
handler: async (client) => {
|
|
12
|
+
const data = await client.get('/api/v1/services');
|
|
13
|
+
return modelsList('Services', data, ['_id', 'name', 'number', 'status']);
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'feenix_get_service',
|
|
18
|
+
description: 'Get one sold service by its service _id.',
|
|
19
|
+
inputSchema: z.object({ serviceId: z.string().describe('Service _id') }).strict(),
|
|
20
|
+
handler: async (client, args) => {
|
|
21
|
+
const data = await client.get(`/api/v1/services/${encodeURIComponent(args.serviceId)}`);
|
|
22
|
+
return jsonBlock(`Service ${args.serviceId}`, data);
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'feenix_service_linetest',
|
|
27
|
+
description: 'Run a line test on the fibre connection of an active subscriber, identified by soldServiceId (same id used for suspend/decommission).',
|
|
28
|
+
inputSchema: z.object({ soldServiceId: z.string().describe('The soldServiceId of the service') }).strict(),
|
|
29
|
+
handler: async (client, args) => {
|
|
30
|
+
const data = await client.get(`/api/v1/services/${encodeURIComponent(args.soldServiceId)}/linetest`);
|
|
31
|
+
return jsonBlock(`Line test — service ${args.soldServiceId}`, data);
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'feenix_create_service',
|
|
36
|
+
description: '[write] Create a service. Requires FEENIX_READWRITE=true.',
|
|
37
|
+
inputSchema: z.object(bodyArg).strict(),
|
|
38
|
+
handler: async (client, args) => {
|
|
39
|
+
const data = await client.post('/api/v1/services', args.body);
|
|
40
|
+
return jsonBlock('Created service', data);
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'feenix_update_service',
|
|
45
|
+
description: '[write] Update a service by _id. Requires FEENIX_READWRITE=true.',
|
|
46
|
+
inputSchema: z.object({ serviceId: z.string(), ...bodyArg }).strict(),
|
|
47
|
+
handler: async (client, args) => {
|
|
48
|
+
const data = await client.put(`/api/v1/services/${encodeURIComponent(args.serviceId)}`, args.body);
|
|
49
|
+
return jsonBlock(`Updated service ${args.serviceId}`, data);
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'feenix_delete_service',
|
|
54
|
+
description: '[write] Delete a service by _id. Requires FEENIX_READWRITE=true.',
|
|
55
|
+
inputSchema: z.object({ serviceId: z.string() }).strict(),
|
|
56
|
+
handler: async (client, args) => {
|
|
57
|
+
const data = await client.delete(`/api/v1/services/${encodeURIComponent(args.serviceId)}`);
|
|
58
|
+
return jsonBlock(`Deleted service ${args.serviceId}`, data ?? { deleted: true });
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'feenix_change_product',
|
|
63
|
+
description: '[write] Change the product on a completed service (soldServiceId). Requires FEENIX_READWRITE=true.',
|
|
64
|
+
inputSchema: z
|
|
65
|
+
.object({
|
|
66
|
+
soldServiceId: z.string().describe('The soldServiceId of the service to change'),
|
|
67
|
+
soldProduct: z.string().describe('New sold product _id'),
|
|
68
|
+
tailProduct: z.string().optional().describe('New tail product _id'),
|
|
69
|
+
tailVariant: z.string().optional().describe('New tail variant _id'),
|
|
70
|
+
targetDate: z.string().optional().describe('Requested change date, e.g. "2020-06-01T09:00:00" (NZT)'),
|
|
71
|
+
})
|
|
72
|
+
.passthrough(),
|
|
73
|
+
handler: async (client, args) => {
|
|
74
|
+
const { soldServiceId, ...body } = args;
|
|
75
|
+
const data = await client.post(`/api/v1/services/${encodeURIComponent(soldServiceId)}/changeProduct`, body);
|
|
76
|
+
return jsonBlock(`Change product — service ${soldServiceId}`, data);
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'feenix_change_attributes',
|
|
81
|
+
description: '[write] Change attributes on a service (serviceId). Requires FEENIX_READWRITE=true.',
|
|
82
|
+
inputSchema: z
|
|
83
|
+
.object({
|
|
84
|
+
serviceId: z.string().describe('The serviceId to change'),
|
|
85
|
+
productAttributes: z
|
|
86
|
+
.array(z.object({ name: z.string(), value: z.unknown() }).passthrough())
|
|
87
|
+
.describe('Array of {name, value} attribute objects'),
|
|
88
|
+
targetDate: z.string().optional().describe('Requested change date (NZT)'),
|
|
89
|
+
})
|
|
90
|
+
.passthrough(),
|
|
91
|
+
handler: async (client, args) => {
|
|
92
|
+
const { serviceId, ...body } = args;
|
|
93
|
+
const data = await client.post(`/api/v1/services/${encodeURIComponent(serviceId)}/changeAttributes`, body);
|
|
94
|
+
return jsonBlock(`Change attributes — service ${serviceId}`, data);
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'feenix_suspend_service',
|
|
99
|
+
description: '[write] Suspend a completed order/service (soldServiceId). Requires FEENIX_READWRITE=true.',
|
|
100
|
+
inputSchema: z
|
|
101
|
+
.object({ soldServiceId: z.string(), body: z.record(z.unknown()).optional() })
|
|
102
|
+
.strict(),
|
|
103
|
+
handler: async (client, args) => {
|
|
104
|
+
const data = await client.post(`/api/v1/services/${encodeURIComponent(args.soldServiceId)}/suspend`, args.body ?? {});
|
|
105
|
+
return jsonBlock(`Suspend — service ${args.soldServiceId}`, data);
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'feenix_decommission_service',
|
|
110
|
+
description: '[write] Decommission a completed order/service (soldServiceId). Requires FEENIX_READWRITE=true.',
|
|
111
|
+
inputSchema: z
|
|
112
|
+
.object({ soldServiceId: z.string(), body: z.record(z.unknown()).optional() })
|
|
113
|
+
.strict(),
|
|
114
|
+
handler: async (client, args) => {
|
|
115
|
+
const data = await client.post(`/api/v1/services/${encodeURIComponent(args.soldServiceId)}/decommission`, args.body ?? {});
|
|
116
|
+
return jsonBlock(`Decommission — service ${args.soldServiceId}`, data);
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/tools/services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,8DAA8D,CAAC;CACrG,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,yBAAyB;QACtC,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,CAAU,kBAAkB,CAAC,CAAC;YAC3D,OAAO,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3E,CAAC;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,0CAA0C;QACvD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QACjF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACjG,OAAO,SAAS,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;KACF;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,uIAAuI;QACzI,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QAC1G,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CACtE,CAAC;YACF,OAAO,SAAS,CAAC,uBAAuB,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;QACvC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAU,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,OAAO,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACrE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EACxD,IAAI,CAAC,IAAI,CACV,CAAC;YACF,OAAO,SAAS,CAAC,mBAAmB,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAU,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpG,OAAO,SAAS,CAAC,mBAAmB,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,oGAAoG;QACtG,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YAChF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACxD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACnE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACnE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;SACtG,CAAC;aACD,WAAW,EAAE;QAChB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,oBAAoB,kBAAkB,CAAC,aAAa,CAAC,gBAAgB,EACrE,IAAI,CACL,CAAC;YACF,OAAO,SAAS,CAAC,4BAA4B,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;KACF;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,qFAAqF;QACvF,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACzD,iBAAiB,EAAE,CAAC;iBACjB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;iBACvE,QAAQ,CAAC,0CAA0C,CAAC;YACvD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;SAC1E,CAAC;aACD,WAAW,EAAE;QAChB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,EACpE,IAAI,CACL,CAAC;YACF,OAAO,SAAS,CAAC,+BAA+B,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,4FAA4F;QAC9F,WAAW,EAAE,CAAC;aACX,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;aAC7E,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EACpE,IAAI,CAAC,IAAI,IAAI,EAAE,CAChB,CAAC;YACF,OAAO,SAAS,CAAC,qBAAqB,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC;KACF;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,WAAW,EACT,iGAAiG;QACnG,WAAW,EAAE,CAAC;aACX,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;aAC7E,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EACzE,IAAI,CAAC,IAAI,IAAI,EAAE,CAChB,CAAC;YACF,OAAO,SAAS,CAAC,0BAA0B,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;QACzE,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../src/tools/subscribers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C,eAAO,MAAM,eAAe,EAAE,cAAc,EAgG3C,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock, modelsList } from '../format.js';
|
|
3
|
+
const idArg = { subscriberId: z.string().describe('Subscriber _id') };
|
|
4
|
+
const bodyArg = {
|
|
5
|
+
body: z.record(z.unknown()).describe('Subscriber document (JSON object) as accepted by the FeeniX API'),
|
|
6
|
+
};
|
|
7
|
+
export const subscriberTools = [
|
|
8
|
+
{
|
|
9
|
+
name: 'feenix_list_subscribers',
|
|
10
|
+
description: 'List all subscribers.',
|
|
11
|
+
inputSchema: z.object({}).strict(),
|
|
12
|
+
handler: async (client) => {
|
|
13
|
+
const data = await client.get('/api/v1/subscribers');
|
|
14
|
+
return modelsList('Subscribers', data, ['_id', 'subscriberName', 'username', 'status']);
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'feenix_get_subscriber',
|
|
19
|
+
description: 'Get one subscriber by _id.',
|
|
20
|
+
inputSchema: z.object(idArg).strict(),
|
|
21
|
+
handler: async (client, args) => {
|
|
22
|
+
const data = await client.get(`/api/v1/subscribers/${encodeURIComponent(args.subscriberId)}`);
|
|
23
|
+
return jsonBlock(`Subscriber ${args.subscriberId}`, data);
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'feenix_get_subscriber_status',
|
|
28
|
+
description: 'Get the current status of a subscriber by _id.',
|
|
29
|
+
inputSchema: z.object(idArg).strict(),
|
|
30
|
+
handler: async (client, args) => {
|
|
31
|
+
const data = await client.get(`/api/v1/subscribers/${encodeURIComponent(args.subscriberId)}/status`);
|
|
32
|
+
return jsonBlock(`Subscriber status ${args.subscriberId}`, data);
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'feenix_get_subscriber_data_usage',
|
|
37
|
+
description: 'Get data-usage information for a subscriber by _id.',
|
|
38
|
+
inputSchema: z.object(idArg).strict(),
|
|
39
|
+
handler: async (client, args) => {
|
|
40
|
+
const data = await client.get(`/api/v1/subscribers/${encodeURIComponent(args.subscriberId)}/dataUsage`);
|
|
41
|
+
return jsonBlock(`Subscriber data usage ${args.subscriberId}`, data);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'feenix_get_subscriber_logs',
|
|
46
|
+
description: 'Get RADIUS auth logs for a subscriber, filtered by a query object (e.g. { "username": "user@example.com" }).',
|
|
47
|
+
inputSchema: z
|
|
48
|
+
.object({ query: z.record(z.unknown()).describe('Log filter, e.g. { "username": "test@feenix.co.nz" }') })
|
|
49
|
+
.strict(),
|
|
50
|
+
handler: async (client, args) => {
|
|
51
|
+
const data = await client.get('/api/subscribers/logs', { q: JSON.stringify(args.query) });
|
|
52
|
+
return jsonBlock('Subscriber RADIUS logs', data);
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'feenix_bulk_data_usage',
|
|
57
|
+
description: 'Look up data usage for many subscribers in one call. Body is the bulk request document (e.g. a list of subscriber ids/usernames). This is a read-only query (not gated).',
|
|
58
|
+
inputSchema: z
|
|
59
|
+
.object({ body: z.record(z.unknown()).describe('Bulk data-usage request document') })
|
|
60
|
+
.strict(),
|
|
61
|
+
handler: async (client, args) => {
|
|
62
|
+
const data = await client.postQuery('/api/v1/subscribers/bulkDataUsage', args.body);
|
|
63
|
+
return jsonBlock('Bulk data usage', data);
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'feenix_create_subscriber',
|
|
68
|
+
description: '[write] Create a subscriber. Requires FEENIX_READWRITE=true.',
|
|
69
|
+
inputSchema: z.object(bodyArg).strict(),
|
|
70
|
+
handler: async (client, args) => {
|
|
71
|
+
const data = await client.post('/api/v1/subscribers', args.body);
|
|
72
|
+
return jsonBlock('Created subscriber', data);
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'feenix_update_subscriber',
|
|
77
|
+
description: '[write] Update a subscriber by _id. Requires FEENIX_READWRITE=true.',
|
|
78
|
+
inputSchema: z.object({ ...idArg, ...bodyArg }).strict(),
|
|
79
|
+
handler: async (client, args) => {
|
|
80
|
+
const data = await client.put(`/api/v1/subscribers/${encodeURIComponent(args.subscriberId)}`, args.body);
|
|
81
|
+
return jsonBlock(`Updated subscriber ${args.subscriberId}`, data);
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'feenix_delete_subscriber',
|
|
86
|
+
description: '[write] Delete a subscriber by _id. Requires FEENIX_READWRITE=true.',
|
|
87
|
+
inputSchema: z.object(idArg).strict(),
|
|
88
|
+
handler: async (client, args) => {
|
|
89
|
+
const data = await client.delete(`/api/v1/subscribers/${encodeURIComponent(args.subscriberId)}`);
|
|
90
|
+
return jsonBlock(`Deleted subscriber ${args.subscriberId}`, data ?? { deleted: true });
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
//# sourceMappingURL=subscribers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/tools/subscribers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendors.d.ts","sourceRoot":"","sources":["../../src/tools/vendors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C,eAAO,MAAM,WAAW,EAAE,cAAc,EAkEvC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonBlock, modelsList } from '../format.js';
|
|
3
|
+
const idArg = { vendorId: z.string().describe('Vendor _id') };
|
|
4
|
+
const bodyArg = {
|
|
5
|
+
body: z.record(z.unknown()).describe('Vendor document (JSON object) as accepted by the FeeniX API'),
|
|
6
|
+
};
|
|
7
|
+
export const vendorTools = [
|
|
8
|
+
{
|
|
9
|
+
name: 'feenix_list_vendors',
|
|
10
|
+
description: 'List all vendor records.',
|
|
11
|
+
inputSchema: z.object({}).strict(),
|
|
12
|
+
handler: async (client) => {
|
|
13
|
+
const data = await client.get('/api/v1/vendors');
|
|
14
|
+
return modelsList('Vendors', data, ['_id', 'name', 'number', 'country']);
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'feenix_get_vendor',
|
|
19
|
+
description: 'Get one vendor by _id.',
|
|
20
|
+
inputSchema: z.object(idArg).strict(),
|
|
21
|
+
handler: async (client, args) => {
|
|
22
|
+
const data = await client.get(`/api/v1/vendors/${encodeURIComponent(args.vendorId)}`);
|
|
23
|
+
return jsonBlock(`Vendor ${args.vendorId}`, data);
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'feenix_get_losing_service_provider',
|
|
28
|
+
description: 'Get the Losing Service Provider (LSP) for a vendor and technology (e.g. "fibre"). Used during a churn/transfer.',
|
|
29
|
+
inputSchema: z
|
|
30
|
+
.object({
|
|
31
|
+
vendorId: z.string().describe('Vendor _id'),
|
|
32
|
+
technology: z.string().describe('Technology, e.g. "fibre"'),
|
|
33
|
+
})
|
|
34
|
+
.strict(),
|
|
35
|
+
handler: async (client, args) => {
|
|
36
|
+
const data = await client.get(`/api/v1/vendors/${encodeURIComponent(args.vendorId)}/lsp/${encodeURIComponent(args.technology)}`);
|
|
37
|
+
return jsonBlock(`Losing Service Provider — vendor ${args.vendorId} / ${args.technology}`, data);
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'feenix_create_vendor',
|
|
42
|
+
description: '[write] Create a vendor. Requires FEENIX_READWRITE=true.',
|
|
43
|
+
inputSchema: z.object(bodyArg).strict(),
|
|
44
|
+
handler: async (client, args) => {
|
|
45
|
+
const data = await client.post('/api/v1/vendors', args.body);
|
|
46
|
+
return jsonBlock('Created vendor', data);
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'feenix_update_vendor',
|
|
51
|
+
description: '[write] Update a vendor by _id. Requires FEENIX_READWRITE=true.',
|
|
52
|
+
inputSchema: z.object({ ...idArg, ...bodyArg }).strict(),
|
|
53
|
+
handler: async (client, args) => {
|
|
54
|
+
const data = await client.put(`/api/v1/vendors/${encodeURIComponent(args.vendorId)}`, args.body);
|
|
55
|
+
return jsonBlock(`Updated vendor ${args.vendorId}`, data);
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'feenix_delete_vendor',
|
|
60
|
+
description: '[write] Delete a vendor by _id. Requires FEENIX_READWRITE=true.',
|
|
61
|
+
inputSchema: z.object(idArg).strict(),
|
|
62
|
+
handler: async (client, args) => {
|
|
63
|
+
const data = await client.delete(`/api/v1/vendors/${encodeURIComponent(args.vendorId)}`);
|
|
64
|
+
return jsonBlock(`Deleted vendor ${args.vendorId}`, data ?? { deleted: true });
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
//# sourceMappingURL=vendors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendors.js","sourceRoot":"","sources":["../../src/tools/vendors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;AAC9D,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,6DAA6D,CAAC;CACpG,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,0BAA0B;QACvC,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,CAAU,iBAAiB,CAAC,CAAC;YAC1D,OAAO,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3E,CAAC;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,wBAAwB;QACrC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;QACrC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/F,OAAO,SAAS,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;KACF;IACD;QACE,IAAI,EAAE,oCAAoC;QAC1C,WAAW,EACT,iHAAiH;QACnH,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;SAC5D,CAAC;aACD,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAClG,CAAC;YACF,OAAO,SAAS,CAAC,oCAAoC,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC;QACnG,CAAC;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,0DAA0D;QACvE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;QACvC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAU,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,OAAO,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,iEAAiE;QAC9E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACxD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EACtD,IAAI,CAAC,IAAI,CACV,CAAC;YACF,OAAO,SAAS,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,iEAAiE;QAC9E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;QACrC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAU,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClG,OAAO,SAAS,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;KACF;CACF,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ToolDefinition {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: any;
|
|
5
|
+
handler: (client: import('./client.js').FeenixClient, args: any) => Promise<string>;
|
|
6
|
+
}
|
|
7
|
+
export interface ServerSideQuery {
|
|
8
|
+
serverSideFilter?: Record<string, unknown>;
|
|
9
|
+
serverSidePaginateInfo?: {
|
|
10
|
+
limit?: number;
|
|
11
|
+
page?: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IAEpB,WAAW,EAAE,GAAG,CAAC;IAEjB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACrF;AAGD,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,sBAAsB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// FeeniX Public API responses are loosely-typed JSON documents whose exact shapes vary
|
|
2
|
+
// by tenant and product. The tools render results generically (see format.ts), so this
|
|
3
|
+
// module keeps only the plumbing contract plus a couple of light shared shapes.
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,uFAAuF;AACvF,gFAAgF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@teamnetwork-nz/feenix-mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for the FeeniX Public API (NZ fibre/broadband wholesale ordering, provisioning & billing) with a read-only gate",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"feenix-mcp-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"mcp",
|
|
20
|
+
"feenix",
|
|
21
|
+
"fibre",
|
|
22
|
+
"broadband",
|
|
23
|
+
"ordering",
|
|
24
|
+
"model-context-protocol"
|
|
25
|
+
],
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.10.0",
|
|
29
|
+
"axios": "^1.7.0",
|
|
30
|
+
"zod": "^3.23.0",
|
|
31
|
+
"zod-to-json-schema": "^3.25.2"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^20.0.0",
|
|
35
|
+
"tsx": "^4.15.0",
|
|
36
|
+
"typescript": "^5.5.0"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=20.0.0"
|
|
40
|
+
}
|
|
41
|
+
}
|