storno-cli 1.0.5
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/LICENSE +53 -0
- package/README.md +257 -0
- package/TOOLS.md +3309 -0
- package/dist/client.d.ts +42 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +162 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +30 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +172 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/accounting-export.d.ts +14 -0
- package/dist/tools/accounting-export.d.ts.map +1 -0
- package/dist/tools/accounting-export.js +97 -0
- package/dist/tools/accounting-export.js.map +1 -0
- package/dist/tools/admin.d.ts +8 -0
- package/dist/tools/admin.d.ts.map +1 -0
- package/dist/tools/admin.js +98 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/anaf.d.ts +8 -0
- package/dist/tools/anaf.d.ts.map +1 -0
- package/dist/tools/anaf.js +115 -0
- package/dist/tools/anaf.js.map +1 -0
- package/dist/tools/api-keys.d.ts +8 -0
- package/dist/tools/api-keys.d.ts.map +1 -0
- package/dist/tools/api-keys.js +29 -0
- package/dist/tools/api-keys.js.map +1 -0
- package/dist/tools/auth.d.ts +8 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +187 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/backup.d.ts +62 -0
- package/dist/tools/backup.d.ts.map +1 -0
- package/dist/tools/backup.js +167 -0
- package/dist/tools/backup.js.map +1 -0
- package/dist/tools/bank-accounts.d.ts +14 -0
- package/dist/tools/bank-accounts.d.ts.map +1 -0
- package/dist/tools/bank-accounts.js +140 -0
- package/dist/tools/bank-accounts.js.map +1 -0
- package/dist/tools/borderou.d.ts +14 -0
- package/dist/tools/borderou.d.ts.map +1 -0
- package/dist/tools/borderou.js +233 -0
- package/dist/tools/borderou.js.map +1 -0
- package/dist/tools/clients.d.ts +14 -0
- package/dist/tools/clients.d.ts.map +1 -0
- package/dist/tools/clients.js +353 -0
- package/dist/tools/clients.js.map +1 -0
- package/dist/tools/companies.d.ts +8 -0
- package/dist/tools/companies.d.ts.map +1 -0
- package/dist/tools/companies.js +211 -0
- package/dist/tools/companies.js.map +1 -0
- package/dist/tools/company-registry.d.ts +31 -0
- package/dist/tools/company-registry.d.ts.map +1 -0
- package/dist/tools/company-registry.js +51 -0
- package/dist/tools/company-registry.js.map +1 -0
- package/dist/tools/cpv-codes.d.ts +17 -0
- package/dist/tools/cpv-codes.d.ts.map +1 -0
- package/dist/tools/cpv-codes.js +28 -0
- package/dist/tools/cpv-codes.js.map +1 -0
- package/dist/tools/dashboard.d.ts +23 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +37 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/defaults.d.ts +14 -0
- package/dist/tools/defaults.d.ts.map +1 -0
- package/dist/tools/defaults.js +29 -0
- package/dist/tools/defaults.js.map +1 -0
- package/dist/tools/delivery-notes.d.ts +185 -0
- package/dist/tools/delivery-notes.d.ts.map +1 -0
- package/dist/tools/delivery-notes.js +525 -0
- package/dist/tools/delivery-notes.js.map +1 -0
- package/dist/tools/document-series.d.ts +54 -0
- package/dist/tools/document-series.d.ts.map +1 -0
- package/dist/tools/document-series.js +171 -0
- package/dist/tools/document-series.js.map +1 -0
- package/dist/tools/efactura-messages.d.ts +34 -0
- package/dist/tools/efactura-messages.d.ts.map +1 -0
- package/dist/tools/efactura-messages.js +51 -0
- package/dist/tools/efactura-messages.js.map +1 -0
- package/dist/tools/einvoice.d.ts +8 -0
- package/dist/tools/einvoice.d.ts.map +1 -0
- package/dist/tools/einvoice.js +170 -0
- package/dist/tools/einvoice.js.map +1 -0
- package/dist/tools/email-templates.d.ts +14 -0
- package/dist/tools/email-templates.d.ts.map +1 -0
- package/dist/tools/email-templates.js +104 -0
- package/dist/tools/email-templates.js.map +1 -0
- package/dist/tools/exchange-rates.d.ts +14 -0
- package/dist/tools/exchange-rates.d.ts.map +1 -0
- package/dist/tools/exchange-rates.js +55 -0
- package/dist/tools/exchange-rates.js.map +1 -0
- package/dist/tools/exports.d.ts +14 -0
- package/dist/tools/exports.d.ts.map +1 -0
- package/dist/tools/exports.js +25 -0
- package/dist/tools/exports.js.map +1 -0
- package/dist/tools/import.d.ts +14 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +221 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/invitations.d.ts +8 -0
- package/dist/tools/invitations.d.ts.map +1 -0
- package/dist/tools/invitations.js +70 -0
- package/dist/tools/invitations.js.map +1 -0
- package/dist/tools/invoices.d.ts +14 -0
- package/dist/tools/invoices.d.ts.map +1 -0
- package/dist/tools/invoices.js +1191 -0
- package/dist/tools/invoices.js.map +1 -0
- package/dist/tools/licensing.d.ts +8 -0
- package/dist/tools/licensing.d.ts.map +1 -0
- package/dist/tools/licensing.js +90 -0
- package/dist/tools/licensing.js.map +1 -0
- package/dist/tools/members.d.ts +8 -0
- package/dist/tools/members.d.ts.map +1 -0
- package/dist/tools/members.js +79 -0
- package/dist/tools/members.js.map +1 -0
- package/dist/tools/nc-codes.d.ts +17 -0
- package/dist/tools/nc-codes.d.ts.map +1 -0
- package/dist/tools/nc-codes.js +28 -0
- package/dist/tools/nc-codes.js.map +1 -0
- package/dist/tools/notifications.d.ts +8 -0
- package/dist/tools/notifications.d.ts.map +1 -0
- package/dist/tools/notifications.js +111 -0
- package/dist/tools/notifications.js.map +1 -0
- package/dist/tools/oauth2-clients.d.ts +8 -0
- package/dist/tools/oauth2-clients.d.ts.map +1 -0
- package/dist/tools/oauth2-clients.js +147 -0
- package/dist/tools/oauth2-clients.js.map +1 -0
- package/dist/tools/payments.d.ts +17 -0
- package/dist/tools/payments.d.ts.map +1 -0
- package/dist/tools/payments.js +109 -0
- package/dist/tools/payments.js.map +1 -0
- package/dist/tools/pdf-template-config.d.ts +14 -0
- package/dist/tools/pdf-template-config.d.ts.map +1 -0
- package/dist/tools/pdf-template-config.js +131 -0
- package/dist/tools/pdf-template-config.js.map +1 -0
- package/dist/tools/products.d.ts +40 -0
- package/dist/tools/products.d.ts.map +1 -0
- package/dist/tools/products.js +73 -0
- package/dist/tools/products.js.map +1 -0
- package/dist/tools/proforma-invoices.d.ts +198 -0
- package/dist/tools/proforma-invoices.d.ts.map +1 -0
- package/dist/tools/proforma-invoices.js +378 -0
- package/dist/tools/proforma-invoices.js.map +1 -0
- package/dist/tools/receipts.d.ts +166 -0
- package/dist/tools/receipts.d.ts.map +1 -0
- package/dist/tools/receipts.js +397 -0
- package/dist/tools/receipts.js.map +1 -0
- package/dist/tools/recurring-invoices.d.ts +187 -0
- package/dist/tools/recurring-invoices.d.ts.map +1 -0
- package/dist/tools/recurring-invoices.js +305 -0
- package/dist/tools/recurring-invoices.js.map +1 -0
- package/dist/tools/reports.d.ts +48 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +200 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/storage-config.d.ts +8 -0
- package/dist/tools/storage-config.d.ts.map +1 -0
- package/dist/tools/storage-config.js +117 -0
- package/dist/tools/storage-config.js.map +1 -0
- package/dist/tools/suppliers.d.ts +14 -0
- package/dist/tools/suppliers.d.ts.map +1 -0
- package/dist/tools/suppliers.js +205 -0
- package/dist/tools/suppliers.js.map +1 -0
- package/dist/tools/system.d.ts +8 -0
- package/dist/tools/system.d.ts.map +1 -0
- package/dist/tools/system.js +24 -0
- package/dist/tools/system.js.map +1 -0
- package/dist/tools/vat-rates.d.ts +14 -0
- package/dist/tools/vat-rates.d.ts.map +1 -0
- package/dist/tools/vat-rates.js +145 -0
- package/dist/tools/vat-rates.js.map +1 -0
- package/dist/tools/webhooks.d.ts +8 -0
- package/dist/tools/webhooks.d.ts.map +1 -0
- package/dist/tools/webhooks.js +305 -0
- package/dist/tools/webhooks.js.map +1 -0
- package/dist/utils/errors.d.ts +18 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +45 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/pagination.d.ts +9 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +10 -0
- package/dist/utils/pagination.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { apiRequest } from '../client.js';
|
|
3
|
+
import { formatResponse, notAuthenticated, noCompanySelected } from '../utils/errors.js';
|
|
4
|
+
import { getConfig } from '../config.js';
|
|
5
|
+
export const tools = [
|
|
6
|
+
{
|
|
7
|
+
name: 'webhooks_list',
|
|
8
|
+
description: 'List all webhook endpoints configured for the current company. Secrets are masked in the listing. Requires X-Company header (companyId param or STORNO_COMPANY_ID env var).',
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
companyId: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
14
|
+
}),
|
|
15
|
+
handler: async (params) => {
|
|
16
|
+
if (!getConfig().token)
|
|
17
|
+
return notAuthenticated();
|
|
18
|
+
const { companyId } = params;
|
|
19
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
20
|
+
if (!effectiveCompanyId)
|
|
21
|
+
return noCompanySelected();
|
|
22
|
+
const res = await apiRequest('/api/v1/webhooks', {
|
|
23
|
+
companyId: effectiveCompanyId,
|
|
24
|
+
});
|
|
25
|
+
return formatResponse(res);
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'webhooks_get',
|
|
30
|
+
description: 'Retrieve the full configuration of a single webhook endpoint. The secret is always masked in this response — use webhooks_regenerate_secret to obtain a new full secret.',
|
|
31
|
+
inputSchema: z.object({
|
|
32
|
+
uuid: z.string().describe('Webhook endpoint UUID'),
|
|
33
|
+
companyId: z
|
|
34
|
+
.string()
|
|
35
|
+
.optional()
|
|
36
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
37
|
+
}),
|
|
38
|
+
handler: async (params) => {
|
|
39
|
+
if (!getConfig().token)
|
|
40
|
+
return notAuthenticated();
|
|
41
|
+
const { uuid, companyId } = params;
|
|
42
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
43
|
+
if (!effectiveCompanyId)
|
|
44
|
+
return noCompanySelected();
|
|
45
|
+
const res = await apiRequest(`/api/v1/webhooks/${uuid}`, {
|
|
46
|
+
companyId: effectiveCompanyId,
|
|
47
|
+
});
|
|
48
|
+
return formatResponse(res);
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'webhooks_create',
|
|
53
|
+
description: 'Register a new webhook endpoint for the current company. The response includes the full signing secret — store it securely immediately as it will be masked in all subsequent responses. URL must use HTTPS. Use ["*"] for events to subscribe to all event types.',
|
|
54
|
+
inputSchema: z.object({
|
|
55
|
+
url: z
|
|
56
|
+
.string()
|
|
57
|
+
.url()
|
|
58
|
+
.describe('HTTPS destination URL that will receive POST requests from Storno'),
|
|
59
|
+
events: z
|
|
60
|
+
.array(z.string())
|
|
61
|
+
.describe('Array of event type names to subscribe to (e.g. ["invoice.created", "invoice.validated"]). Use ["*"] to subscribe to all events.'),
|
|
62
|
+
description: z
|
|
63
|
+
.string()
|
|
64
|
+
.optional()
|
|
65
|
+
.describe('Human-readable label for this webhook endpoint'),
|
|
66
|
+
isActive: z
|
|
67
|
+
.boolean()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe('Whether the webhook is active on creation (default: true)'),
|
|
70
|
+
companyId: z
|
|
71
|
+
.string()
|
|
72
|
+
.optional()
|
|
73
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
74
|
+
}),
|
|
75
|
+
handler: async (params) => {
|
|
76
|
+
if (!getConfig().token)
|
|
77
|
+
return notAuthenticated();
|
|
78
|
+
const { companyId, url, events, description, isActive } = params;
|
|
79
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
80
|
+
if (!effectiveCompanyId)
|
|
81
|
+
return noCompanySelected();
|
|
82
|
+
const body = { url, events };
|
|
83
|
+
if (description !== undefined)
|
|
84
|
+
body.description = description;
|
|
85
|
+
if (isActive !== undefined)
|
|
86
|
+
body.isActive = isActive;
|
|
87
|
+
const res = await apiRequest('/api/v1/webhooks', {
|
|
88
|
+
method: 'POST',
|
|
89
|
+
body,
|
|
90
|
+
companyId: effectiveCompanyId,
|
|
91
|
+
});
|
|
92
|
+
return formatResponse(res);
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'webhooks_update',
|
|
97
|
+
description: 'Partially update an existing webhook endpoint. Only provided fields are changed. Providing events replaces the entire subscription list — send the complete desired set each time. URL must use HTTPS.',
|
|
98
|
+
inputSchema: z.object({
|
|
99
|
+
uuid: z.string().describe('Webhook endpoint UUID to update'),
|
|
100
|
+
url: z.string().url().optional().describe('New HTTPS destination URL'),
|
|
101
|
+
events: z
|
|
102
|
+
.array(z.string())
|
|
103
|
+
.optional()
|
|
104
|
+
.describe('Replacement list of event type names (replaces entire list, not additive). Use ["*"] for all events.'),
|
|
105
|
+
description: z
|
|
106
|
+
.string()
|
|
107
|
+
.optional()
|
|
108
|
+
.describe('Updated human-readable label for this webhook endpoint'),
|
|
109
|
+
isActive: z
|
|
110
|
+
.boolean()
|
|
111
|
+
.optional()
|
|
112
|
+
.describe('Enable (true) or pause (false) deliveries for this webhook'),
|
|
113
|
+
companyId: z
|
|
114
|
+
.string()
|
|
115
|
+
.optional()
|
|
116
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
117
|
+
}),
|
|
118
|
+
handler: async (params) => {
|
|
119
|
+
if (!getConfig().token)
|
|
120
|
+
return notAuthenticated();
|
|
121
|
+
const { uuid, companyId, url, events, description, isActive } = params;
|
|
122
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
123
|
+
if (!effectiveCompanyId)
|
|
124
|
+
return noCompanySelected();
|
|
125
|
+
const body = {};
|
|
126
|
+
if (url !== undefined)
|
|
127
|
+
body.url = url;
|
|
128
|
+
if (events !== undefined)
|
|
129
|
+
body.events = events;
|
|
130
|
+
if (description !== undefined)
|
|
131
|
+
body.description = description;
|
|
132
|
+
if (isActive !== undefined)
|
|
133
|
+
body.isActive = isActive;
|
|
134
|
+
const res = await apiRequest(`/api/v1/webhooks/${uuid}`, {
|
|
135
|
+
method: 'PATCH',
|
|
136
|
+
body,
|
|
137
|
+
companyId: effectiveCompanyId,
|
|
138
|
+
});
|
|
139
|
+
return formatResponse(res);
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: 'webhooks_delete',
|
|
144
|
+
description: 'Permanently delete a webhook endpoint and all its delivery history. This is a hard delete with no recovery. To pause deliveries temporarily, use webhooks_update with isActive: false instead.',
|
|
145
|
+
inputSchema: z.object({
|
|
146
|
+
uuid: z.string().describe('Webhook endpoint UUID to permanently delete'),
|
|
147
|
+
companyId: z
|
|
148
|
+
.string()
|
|
149
|
+
.optional()
|
|
150
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
151
|
+
}),
|
|
152
|
+
handler: async (params) => {
|
|
153
|
+
if (!getConfig().token)
|
|
154
|
+
return notAuthenticated();
|
|
155
|
+
const { uuid, companyId } = params;
|
|
156
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
157
|
+
if (!effectiveCompanyId)
|
|
158
|
+
return noCompanySelected();
|
|
159
|
+
const res = await apiRequest(`/api/v1/webhooks/${uuid}`, {
|
|
160
|
+
method: 'DELETE',
|
|
161
|
+
companyId: effectiveCompanyId,
|
|
162
|
+
});
|
|
163
|
+
return formatResponse(res);
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: 'webhooks_events',
|
|
168
|
+
description: 'List all available webhook event types that can be subscribed to, including their descriptions and categories (invoices, payments, clients, sync, proforma). Use this to discover valid event names for webhook configuration.',
|
|
169
|
+
inputSchema: z.object({}),
|
|
170
|
+
handler: async (_params) => {
|
|
171
|
+
if (!getConfig().token)
|
|
172
|
+
return notAuthenticated();
|
|
173
|
+
const res = await apiRequest('/api/v1/webhooks/events');
|
|
174
|
+
return formatResponse(res);
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: 'webhooks_deliveries',
|
|
179
|
+
description: 'Retrieve a paginated list of delivery attempts for a webhook endpoint. Can filter by status (success/failed), event type, and date range. Use webhooks_delivery_detail to inspect full request/response payloads.',
|
|
180
|
+
inputSchema: z.object({
|
|
181
|
+
uuid: z.string().describe('Webhook endpoint UUID'),
|
|
182
|
+
page: z
|
|
183
|
+
.number()
|
|
184
|
+
.int()
|
|
185
|
+
.positive()
|
|
186
|
+
.optional()
|
|
187
|
+
.describe('Page number for pagination (default: 1)'),
|
|
188
|
+
limit: z
|
|
189
|
+
.number()
|
|
190
|
+
.int()
|
|
191
|
+
.positive()
|
|
192
|
+
.max(100)
|
|
193
|
+
.optional()
|
|
194
|
+
.describe('Number of items per page (default: 20, max: 100)'),
|
|
195
|
+
status: z
|
|
196
|
+
.enum(['success', 'failed'])
|
|
197
|
+
.optional()
|
|
198
|
+
.describe('Filter by delivery status: success or failed'),
|
|
199
|
+
eventType: z
|
|
200
|
+
.string()
|
|
201
|
+
.optional()
|
|
202
|
+
.describe('Filter by event type name (e.g. invoice.validated)'),
|
|
203
|
+
from: z.string().optional().describe('Start date filter in ISO 8601 format (YYYY-MM-DD)'),
|
|
204
|
+
to: z.string().optional().describe('End date filter in ISO 8601 format (YYYY-MM-DD)'),
|
|
205
|
+
companyId: z
|
|
206
|
+
.string()
|
|
207
|
+
.optional()
|
|
208
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
209
|
+
}),
|
|
210
|
+
handler: async (params) => {
|
|
211
|
+
if (!getConfig().token)
|
|
212
|
+
return notAuthenticated();
|
|
213
|
+
const { uuid, companyId, page, limit, status, eventType, from, to } = params;
|
|
214
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
215
|
+
if (!effectiveCompanyId)
|
|
216
|
+
return noCompanySelected();
|
|
217
|
+
const res = await apiRequest(`/api/v1/webhooks/${uuid}/deliveries`, {
|
|
218
|
+
companyId: effectiveCompanyId,
|
|
219
|
+
query: { page, limit, status, eventType, from, to },
|
|
220
|
+
});
|
|
221
|
+
return formatResponse(res);
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
name: 'webhooks_delivery_detail',
|
|
226
|
+
description: 'Retrieve the complete details of a single webhook delivery attempt, including the full request payload, request headers (with signature), and the full response received. Use this to debug failed deliveries.',
|
|
227
|
+
inputSchema: z.object({
|
|
228
|
+
uuid: z.string().describe('Webhook endpoint UUID'),
|
|
229
|
+
deliveryUuid: z.string().describe('Delivery attempt UUID'),
|
|
230
|
+
companyId: z
|
|
231
|
+
.string()
|
|
232
|
+
.optional()
|
|
233
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
234
|
+
}),
|
|
235
|
+
handler: async (params) => {
|
|
236
|
+
if (!getConfig().token)
|
|
237
|
+
return notAuthenticated();
|
|
238
|
+
const { uuid, deliveryUuid, companyId } = params;
|
|
239
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
240
|
+
if (!effectiveCompanyId)
|
|
241
|
+
return noCompanySelected();
|
|
242
|
+
const res = await apiRequest(`/api/v1/webhooks/${uuid}/deliveries/${deliveryUuid}`, {
|
|
243
|
+
companyId: effectiveCompanyId,
|
|
244
|
+
});
|
|
245
|
+
return formatResponse(res);
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
name: 'webhooks_regenerate_secret',
|
|
250
|
+
description: 'Issue a new HMAC-SHA256 signing secret for a webhook endpoint, immediately invalidating the previous one. The new secret is returned in full only in this response — store it securely. Update your endpoint verification logic before calling this in production.',
|
|
251
|
+
inputSchema: z.object({
|
|
252
|
+
uuid: z.string().describe('Webhook endpoint UUID to regenerate the secret for'),
|
|
253
|
+
companyId: z
|
|
254
|
+
.string()
|
|
255
|
+
.optional()
|
|
256
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
257
|
+
}),
|
|
258
|
+
handler: async (params) => {
|
|
259
|
+
if (!getConfig().token)
|
|
260
|
+
return notAuthenticated();
|
|
261
|
+
const { uuid, companyId } = params;
|
|
262
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
263
|
+
if (!effectiveCompanyId)
|
|
264
|
+
return noCompanySelected();
|
|
265
|
+
const res = await apiRequest(`/api/v1/webhooks/${uuid}/regenerate-secret`, {
|
|
266
|
+
method: 'POST',
|
|
267
|
+
companyId: effectiveCompanyId,
|
|
268
|
+
});
|
|
269
|
+
return formatResponse(res);
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
name: 'webhooks_test',
|
|
274
|
+
description: 'Send a synchronous test delivery to a webhook endpoint and return the outcome immediately. Uses a synthetic webhook.test event payload. The webhook must be active. The delivery is recorded in delivery history.',
|
|
275
|
+
inputSchema: z.object({
|
|
276
|
+
uuid: z.string().describe('Webhook endpoint UUID to send the test delivery to'),
|
|
277
|
+
eventType: z
|
|
278
|
+
.string()
|
|
279
|
+
.optional()
|
|
280
|
+
.describe('Override the test event type name (default: webhook.test)'),
|
|
281
|
+
companyId: z
|
|
282
|
+
.string()
|
|
283
|
+
.optional()
|
|
284
|
+
.describe('Company UUID (overrides STORNO_COMPANY_ID env var)'),
|
|
285
|
+
}),
|
|
286
|
+
handler: async (params) => {
|
|
287
|
+
if (!getConfig().token)
|
|
288
|
+
return notAuthenticated();
|
|
289
|
+
const { uuid, companyId, eventType } = params;
|
|
290
|
+
const effectiveCompanyId = companyId || getConfig().companyId;
|
|
291
|
+
if (!effectiveCompanyId)
|
|
292
|
+
return noCompanySelected();
|
|
293
|
+
const body = {};
|
|
294
|
+
if (eventType !== undefined)
|
|
295
|
+
body.eventType = eventType;
|
|
296
|
+
const res = await apiRequest(`/api/v1/webhooks/${uuid}/test`, {
|
|
297
|
+
method: 'POST',
|
|
298
|
+
body: Object.keys(body).length > 0 ? body : undefined,
|
|
299
|
+
companyId: effectiveCompanyId,
|
|
300
|
+
});
|
|
301
|
+
return formatResponse(res);
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
];
|
|
305
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error formatting utilities for AI-readable output.
|
|
3
|
+
*/
|
|
4
|
+
import type { ApiError, ApiResponse } from '../client.js';
|
|
5
|
+
/**
|
|
6
|
+
* Format an API response for the MCP tool result.
|
|
7
|
+
* Returns a JSON string suitable for AI consumption.
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatResponse(response: ApiResponse | ApiError): string;
|
|
10
|
+
/**
|
|
11
|
+
* Format a "not configured" error for tools that need auth.
|
|
12
|
+
*/
|
|
13
|
+
export declare function notAuthenticated(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Format a "no company selected" error.
|
|
16
|
+
*/
|
|
17
|
+
export declare function noCompanySelected(): string;
|
|
18
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,CAWvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAS1C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error formatting utilities for AI-readable output.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Format an API response for the MCP tool result.
|
|
6
|
+
* Returns a JSON string suitable for AI consumption.
|
|
7
|
+
*/
|
|
8
|
+
export function formatResponse(response) {
|
|
9
|
+
if (!response.ok) {
|
|
10
|
+
const err = response;
|
|
11
|
+
const parts = [`Error ${err.status}: ${err.error}`];
|
|
12
|
+
if (err.details) {
|
|
13
|
+
parts.push(JSON.stringify(err.details, null, 2));
|
|
14
|
+
}
|
|
15
|
+
return parts.join('\n\n');
|
|
16
|
+
}
|
|
17
|
+
return JSON.stringify(response.data, null, 2);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Format a "not configured" error for tools that need auth.
|
|
21
|
+
*/
|
|
22
|
+
export function notAuthenticated() {
|
|
23
|
+
return [
|
|
24
|
+
'Error: Not authenticated.',
|
|
25
|
+
'',
|
|
26
|
+
'To authenticate, either:',
|
|
27
|
+
'1. Set STORNO_TOKEN environment variable in MCP server config',
|
|
28
|
+
'2. Call the auth_login tool with email and password',
|
|
29
|
+
'3. Set STORNO_EMAIL and STORNO_PASSWORD env vars for auto-login',
|
|
30
|
+
].join('\n');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Format a "no company selected" error.
|
|
34
|
+
*/
|
|
35
|
+
export function noCompanySelected() {
|
|
36
|
+
return [
|
|
37
|
+
'Error: No company selected.',
|
|
38
|
+
'',
|
|
39
|
+
'To select a company, either:',
|
|
40
|
+
'1. Set STORNO_COMPANY_ID environment variable in MCP server config',
|
|
41
|
+
'2. Call the companies_list tool, then use the company UUID in subsequent calls',
|
|
42
|
+
'3. Most tools accept an optional companyId parameter to override',
|
|
43
|
+
].join('\n');
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgC;IAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,QAAoB,CAAC;QACjC,MAAM,KAAK,GAAa,CAAC,SAAS,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,2BAA2B;QAC3B,EAAE;QACF,0BAA0B;QAC1B,+DAA+D;QAC/D,qDAAqD;QACrD,iEAAiE;KAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,6BAA6B;QAC7B,EAAE;QACF,8BAA8B;QAC9B,oEAAoE;QACpE,gFAAgF;QAChF,kEAAkE;KACnE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination helper for list endpoints.
|
|
3
|
+
*/
|
|
4
|
+
export interface PaginationParams {
|
|
5
|
+
page?: number;
|
|
6
|
+
limit?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function paginationQuery(params: PaginationParams): Record<string, string | number | undefined>;
|
|
9
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAKrG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,UAAU,eAAe,CAAC,MAAwB;IACtD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "storno-cli",
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"description": "MCP server for the Storno.ro e-invoicing API — enables AI tools (Claude, Cursor, Windsurf) to manage invoices, clients, companies, and the full e-Factura workflow",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"storno-cli": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"TOOLS.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"model-context-protocol",
|
|
24
|
+
"storno",
|
|
25
|
+
"e-invoicing",
|
|
26
|
+
"e-factura",
|
|
27
|
+
"anaf",
|
|
28
|
+
"invoicing",
|
|
29
|
+
"romania",
|
|
30
|
+
"ai-tools",
|
|
31
|
+
"claude",
|
|
32
|
+
"cursor"
|
|
33
|
+
],
|
|
34
|
+
"author": "Storno.ro",
|
|
35
|
+
"license": "Elastic-2.0",
|
|
36
|
+
"homepage": "https://storno.ro",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/stornoro/storno-cli"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
43
|
+
"zod": "^3.24.2"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^22.13.4",
|
|
47
|
+
"typescript": "^5.7.3"
|
|
48
|
+
},
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=20.0.0"
|
|
51
|
+
}
|
|
52
|
+
}
|