@frihet/mcp-server 1.2.4 → 1.3.1
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 +37 -0
- package/dist/client-interface.d.ts +12 -1
- package/dist/client-interface.d.ts.map +1 -1
- package/dist/client.d.ts +12 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +41 -14
- package/dist/client.js.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +46 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +90 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +28 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +81 -0
- package/dist/metrics.js.map +1 -0
- package/dist/tools/clients.d.ts.map +1 -1
- package/dist/tools/clients.js +40 -62
- package/dist/tools/clients.js.map +1 -1
- package/dist/tools/expenses.d.ts.map +1 -1
- package/dist/tools/expenses.js +51 -64
- package/dist/tools/expenses.js.map +1 -1
- package/dist/tools/invoices.d.ts.map +1 -1
- package/dist/tools/invoices.js +100 -93
- package/dist/tools/invoices.js.map +1 -1
- package/dist/tools/products.d.ts.map +1 -1
- package/dist/tools/products.js +42 -72
- package/dist/tools/products.js.map +1 -1
- package/dist/tools/quotes.d.ts.map +1 -1
- package/dist/tools/quotes.js +61 -70
- package/dist/tools/quotes.js.map +1 -1
- package/dist/tools/shared.d.ts +26 -4
- package/dist/tools/shared.d.ts.map +1 -1
- package/dist/tools/shared.js +57 -8
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/webhooks.d.ts.map +1 -1
- package/dist/tools/webhooks.js +44 -65
- package/dist/tools/webhooks.js.map +1 -1
- package/dist/types.d.ts +5 -5
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/tools/quotes.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Quote tools for the Frihet MCP server.
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod/v4";
|
|
5
|
-
import {
|
|
5
|
+
import { withToolLogging, formatPaginatedResponse, formatRecord, listContent, getContent, mutateContent, READ_ONLY_ANNOTATIONS, CREATE_ANNOTATIONS, UPDATE_ANNOTATIONS, DELETE_ANNOTATIONS, paginatedOutput, deleteResultOutput, quoteItemOutput } from "./shared.js";
|
|
6
6
|
const quoteItemSchema = z.object({
|
|
7
7
|
description: z.string().describe("Description of the line item / Descripcion del concepto"),
|
|
8
8
|
quantity: z.number().describe("Quantity / Cantidad"),
|
|
@@ -12,28 +12,37 @@ export function registerQuoteTools(server, client) {
|
|
|
12
12
|
// -- list_quotes --
|
|
13
13
|
server.registerTool("list_quotes", {
|
|
14
14
|
title: "List Quotes",
|
|
15
|
-
description: "List all quotes/estimates with optional pagination. " +
|
|
15
|
+
description: "List all quotes/estimates with optional pagination and filters. " +
|
|
16
16
|
"Quotes are proposals sent to clients before they become invoices. " +
|
|
17
|
-
"
|
|
18
|
-
"
|
|
17
|
+
"Supports filtering by status (draft/sent/accepted/rejected/expired) and date range. " +
|
|
18
|
+
"Example: status='sent', from='2026-01-01', limit=20 " +
|
|
19
|
+
"/ Lista todos los presupuestos con paginacion y filtros opcionales. " +
|
|
20
|
+
"Soporta filtrado por estado y rango de fechas.",
|
|
19
21
|
annotations: READ_ONLY_ANNOTATIONS,
|
|
20
22
|
inputSchema: {
|
|
23
|
+
status: z
|
|
24
|
+
.enum(["draft", "sent", "accepted", "rejected", "expired"])
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Filter by quote status / Filtrar por estado"),
|
|
27
|
+
from: z
|
|
28
|
+
.string()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Start date filter (YYYY-MM-DD) / Fecha inicio"),
|
|
31
|
+
to: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("End date filter (YYYY-MM-DD) / Fecha fin"),
|
|
21
35
|
limit: z.number().int().min(1).max(100).optional().describe("Max results (1-100) / Resultados maximos"),
|
|
22
36
|
offset: z.number().int().min(0).optional().describe("Offset / Desplazamiento"),
|
|
23
37
|
},
|
|
24
38
|
outputSchema: paginatedOutput(quoteItemOutput),
|
|
25
|
-
}, async ({ limit, offset }) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
return handleToolError(error);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
39
|
+
}, async ({ status, from, to, limit, offset }) => withToolLogging("list_quotes", async () => {
|
|
40
|
+
const result = await client.listQuotes({ limit, offset, status, from, to });
|
|
41
|
+
return {
|
|
42
|
+
content: [listContent(formatPaginatedResponse("quotes", result))],
|
|
43
|
+
structuredContent: result,
|
|
44
|
+
};
|
|
45
|
+
}));
|
|
37
46
|
// -- get_quote --
|
|
38
47
|
server.registerTool("get_quote", {
|
|
39
48
|
title: "Get Quote",
|
|
@@ -44,24 +53,20 @@ export function registerQuoteTools(server, client) {
|
|
|
44
53
|
id: z.string().describe("Quote ID / ID del presupuesto"),
|
|
45
54
|
},
|
|
46
55
|
outputSchema: quoteItemOutput,
|
|
47
|
-
}, async ({ id }) => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
return handleToolError(error);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
56
|
+
}, async ({ id }) => withToolLogging("get_quote", async () => {
|
|
57
|
+
const result = await client.getQuote(id);
|
|
58
|
+
return {
|
|
59
|
+
content: [getContent(formatRecord("Quote", result))],
|
|
60
|
+
structuredContent: result,
|
|
61
|
+
};
|
|
62
|
+
}));
|
|
59
63
|
// -- create_quote --
|
|
60
64
|
server.registerTool("create_quote", {
|
|
61
65
|
title: "Create Quote",
|
|
62
66
|
description: "Create a new quote/estimate for a client. Requires client name and at least one line item. " +
|
|
63
|
-
"Quotes can later be converted to invoices. " +
|
|
64
|
-
"
|
|
67
|
+
"Quotes can later be converted to invoices. Defaults to draft status. " +
|
|
68
|
+
"Example: clientName='Acme Corp', items=[{description:'Design', quantity:1, unitPrice:3000}], validUntil='2026-04-30' " +
|
|
69
|
+
"/ Crea un nuevo presupuesto. Requiere nombre del cliente y al menos un concepto. " +
|
|
65
70
|
"Los presupuestos se pueden convertir en facturas despues.",
|
|
66
71
|
annotations: CREATE_ANNOTATIONS,
|
|
67
72
|
inputSchema: {
|
|
@@ -69,41 +74,37 @@ export function registerQuoteTools(server, client) {
|
|
|
69
74
|
items: z
|
|
70
75
|
.array(quoteItemSchema)
|
|
71
76
|
.min(1)
|
|
72
|
-
.describe("Line items / Conceptos del presupuesto"),
|
|
77
|
+
.describe("Line items (each with description, quantity, unitPrice) / Conceptos del presupuesto"),
|
|
73
78
|
validUntil: z
|
|
74
79
|
.string()
|
|
75
80
|
.optional()
|
|
76
81
|
.describe("Expiry date in ISO 8601 (YYYY-MM-DD) / Fecha de validez"),
|
|
77
|
-
notes: z.string().optional().describe("Additional notes / Notas adicionales"),
|
|
82
|
+
notes: z.string().optional().describe("Additional notes shown on the quote / Notas adicionales"),
|
|
78
83
|
status: z
|
|
79
84
|
.enum(["draft", "sent", "accepted", "rejected", "expired"])
|
|
80
85
|
.optional()
|
|
81
86
|
.describe("Quote status (default: draft) / Estado del presupuesto"),
|
|
82
87
|
},
|
|
83
88
|
outputSchema: quoteItemOutput,
|
|
84
|
-
}, async (input) => {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
return handleToolError(error);
|
|
94
|
-
}
|
|
95
|
-
});
|
|
89
|
+
}, async (input) => withToolLogging("create_quote", async () => {
|
|
90
|
+
const result = await client.createQuote(input);
|
|
91
|
+
return {
|
|
92
|
+
content: [mutateContent(formatRecord("Quote created", result))],
|
|
93
|
+
structuredContent: result,
|
|
94
|
+
};
|
|
95
|
+
}));
|
|
96
96
|
// -- update_quote --
|
|
97
97
|
server.registerTool("update_quote", {
|
|
98
98
|
title: "Update Quote",
|
|
99
|
-
description: "Update an existing quote. Only the provided fields will be changed. " +
|
|
99
|
+
description: "Update an existing quote using PATCH semantics. Only the provided fields will be changed. " +
|
|
100
|
+
"Example: id='abc123', status='accepted' to mark a quote as accepted. " +
|
|
100
101
|
"/ Actualiza un presupuesto existente. Solo se modifican los campos proporcionados.",
|
|
101
102
|
annotations: UPDATE_ANNOTATIONS,
|
|
102
103
|
inputSchema: {
|
|
103
104
|
id: z.string().describe("Quote ID / ID del presupuesto"),
|
|
104
105
|
clientName: z.string().optional().describe("Client name / Nombre del cliente"),
|
|
105
106
|
items: z.array(quoteItemSchema).min(1).optional().describe("Line items / Conceptos"),
|
|
106
|
-
validUntil: z.string().optional().describe("Expiry date / Fecha de validez"),
|
|
107
|
+
validUntil: z.string().optional().describe("Expiry date (YYYY-MM-DD) / Fecha de validez"),
|
|
107
108
|
notes: z.string().optional().describe("Notes / Notas"),
|
|
108
109
|
status: z
|
|
109
110
|
.enum(["draft", "sent", "accepted", "rejected", "expired"])
|
|
@@ -111,18 +112,13 @@ export function registerQuoteTools(server, client) {
|
|
|
111
112
|
.describe("Status / Estado"),
|
|
112
113
|
},
|
|
113
114
|
outputSchema: quoteItemOutput,
|
|
114
|
-
}, async ({ id, ...data }) => {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
return handleToolError(error);
|
|
124
|
-
}
|
|
125
|
-
});
|
|
115
|
+
}, async ({ id, ...data }) => withToolLogging("update_quote", async () => {
|
|
116
|
+
const result = await client.updateQuote(id, data);
|
|
117
|
+
return {
|
|
118
|
+
content: [mutateContent(formatRecord("Quote updated", result))],
|
|
119
|
+
structuredContent: result,
|
|
120
|
+
};
|
|
121
|
+
}));
|
|
126
122
|
// -- delete_quote --
|
|
127
123
|
server.registerTool("delete_quote", {
|
|
128
124
|
title: "Delete Quote",
|
|
@@ -133,17 +129,12 @@ export function registerQuoteTools(server, client) {
|
|
|
133
129
|
id: z.string().describe("Quote ID / ID del presupuesto"),
|
|
134
130
|
},
|
|
135
131
|
outputSchema: deleteResultOutput,
|
|
136
|
-
}, async ({ id }) => {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
return handleToolError(error);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
132
|
+
}, async ({ id }) => withToolLogging("delete_quote", async () => {
|
|
133
|
+
await client.deleteQuote(id);
|
|
134
|
+
return {
|
|
135
|
+
content: [mutateContent(`Quote ${id} deleted successfully. / Presupuesto ${id} eliminado correctamente.`)],
|
|
136
|
+
structuredContent: { success: true, id },
|
|
137
|
+
};
|
|
138
|
+
}));
|
|
148
139
|
}
|
|
149
140
|
//# sourceMappingURL=quotes.js.map
|
package/dist/tools/quotes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.js","sourceRoot":"","sources":["../../src/tools/quotes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtQ,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IAC3F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACpD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;CAC7E,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAqB;IACzE,oBAAoB;IAEpB,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"quotes.js","sourceRoot":"","sources":["../../src/tools/quotes.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/shared.d.ts
CHANGED
|
@@ -29,8 +29,9 @@ export interface AnnotatedTextContent {
|
|
|
29
29
|
export declare function truncateResponse(text: string): string;
|
|
30
30
|
/**
|
|
31
31
|
* Maps an error to a user-friendly MCP tool response with error annotations.
|
|
32
|
+
* Emits structured log entries for all errors.
|
|
32
33
|
*/
|
|
33
|
-
export declare function handleToolError(error: unknown): {
|
|
34
|
+
export declare function handleToolError(error: unknown, toolName?: string): {
|
|
34
35
|
content: AnnotatedTextContent[];
|
|
35
36
|
isError: true;
|
|
36
37
|
};
|
|
@@ -76,8 +77,9 @@ export declare const invoiceItemOutput: z.ZodObject<{
|
|
|
76
77
|
quantity: z.ZodNumber;
|
|
77
78
|
unitPrice: z.ZodNumber;
|
|
78
79
|
}, z.core.$strip>>;
|
|
79
|
-
|
|
80
|
+
issueDate: z.ZodOptional<z.ZodString>;
|
|
80
81
|
dueDate: z.ZodOptional<z.ZodString>;
|
|
82
|
+
status: z.ZodOptional<z.ZodString>;
|
|
81
83
|
notes: z.ZodOptional<z.ZodString>;
|
|
82
84
|
taxRate: z.ZodOptional<z.ZodNumber>;
|
|
83
85
|
total: z.ZodOptional<z.ZodNumber>;
|
|
@@ -104,6 +106,7 @@ export declare const clientItemOutput: z.ZodObject<{
|
|
|
104
106
|
address: z.ZodOptional<z.ZodObject<{
|
|
105
107
|
street: z.ZodOptional<z.ZodString>;
|
|
106
108
|
city: z.ZodOptional<z.ZodString>;
|
|
109
|
+
state: z.ZodOptional<z.ZodString>;
|
|
107
110
|
postalCode: z.ZodOptional<z.ZodString>;
|
|
108
111
|
country: z.ZodOptional<z.ZodString>;
|
|
109
112
|
}, z.core.$strip>>;
|
|
@@ -115,9 +118,7 @@ export declare const productItemOutput: z.ZodObject<{
|
|
|
115
118
|
name: z.ZodString;
|
|
116
119
|
unitPrice: z.ZodNumber;
|
|
117
120
|
description: z.ZodOptional<z.ZodString>;
|
|
118
|
-
unit: z.ZodOptional<z.ZodString>;
|
|
119
121
|
taxRate: z.ZodOptional<z.ZodNumber>;
|
|
120
|
-
sku: z.ZodOptional<z.ZodString>;
|
|
121
122
|
createdAt: z.ZodOptional<z.ZodString>;
|
|
122
123
|
updatedAt: z.ZodOptional<z.ZodString>;
|
|
123
124
|
}, z.core.$loose>;
|
|
@@ -145,4 +146,25 @@ export declare const webhookItemOutput: z.ZodObject<{
|
|
|
145
146
|
createdAt: z.ZodOptional<z.ZodString>;
|
|
146
147
|
updatedAt: z.ZodOptional<z.ZodString>;
|
|
147
148
|
}, z.core.$loose>;
|
|
149
|
+
/** Return type of a tool handler — index signature required by MCP SDK */
|
|
150
|
+
interface ToolResult {
|
|
151
|
+
[x: string]: unknown;
|
|
152
|
+
content: AnnotatedTextContent[];
|
|
153
|
+
structuredContent?: Record<string, unknown>;
|
|
154
|
+
isError?: boolean;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Wraps a tool handler to automatically log execution time, success/failure,
|
|
158
|
+
* and record metrics. Catches errors and routes them through handleToolError.
|
|
159
|
+
*
|
|
160
|
+
* Usage in tool registration files:
|
|
161
|
+
* ```ts
|
|
162
|
+
* async ({ id }) => withToolLogging("get_invoice", async () => {
|
|
163
|
+
* const result = await client.getInvoice(id);
|
|
164
|
+
* return { content: [getContent(formatRecord("Invoice", result))], structuredContent: result };
|
|
165
|
+
* })
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
export declare function withToolLogging(toolName: string, fn: () => Promise<ToolResult>): Promise<ToolResult>;
|
|
169
|
+
export {};
|
|
148
170
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAQrD,eAAO,MAAM,qBAAqB,EAAE,eAAqH,CAAC;AAC1J,eAAO,MAAM,kBAAkB,EAAE,eAAuH,CAAC;AACzJ,eAAO,MAAM,kBAAkB,EAAE,eAAsH,CAAC;AACxJ,eAAO,MAAM,kBAAkB,EAAE,eAAqH,CAAC;AAMvJ,0FAA0F;AAC1F,eAAO,MAAM,wBAAwB,EAAE,WAG7B,CAAC;AAEX,2FAA2F;AAC3F,eAAO,MAAM,uBAAuB,EAAE,WAG5B,CAAC;AAEX,4FAA4F;AAC5F,eAAO,MAAM,0BAA0B,EAAE,WAG/B,CAAC;AAEX,kEAAkE;AAClE,eAAO,MAAM,yBAAyB,EAAE,WAG9B,CAAC;AAMX,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAQD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD;AAmBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAClE,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,OAAO,EAAE,IAAI,CAAC;CACf,CAwDA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACnD,MAAM,CAkBR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAE9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAE7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAEhE;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;;;;;kBAOjE;AAED,2CAA2C;AAC3C,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AAUH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;iBAYd,CAAC;AAEjB,eAAO,MAAM,iBAAiB;;;;;;;;;;iBAUd,CAAC;AAUjB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;iBASb,CAAC;AAEjB,eAAO,MAAM,iBAAiB;;;;;;;;iBAQd,CAAC;AAEjB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;iBAUZ,CAAC;AAEjB,eAAO,MAAM,iBAAiB;;;;;;;;iBAQd,CAAC;AAMjB,0EAA0E;AAC1E,UAAU,UAAU;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAC5B,OAAO,CAAC,UAAU,CAAC,CAcrB"}
|
package/dist/tools/shared.js
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* so it works regardless of which FrihetApiError class threw the error.
|
|
8
8
|
*/
|
|
9
9
|
import { z } from "zod/v4";
|
|
10
|
+
import { log, logToolCall } from "../logger.js";
|
|
11
|
+
import { recordToolCall } from "../metrics.js";
|
|
10
12
|
/* ------------------------------------------------------------------ */
|
|
11
13
|
/* Safety annotations for MCP tool registrations */
|
|
12
14
|
/* ------------------------------------------------------------------ */
|
|
@@ -56,11 +58,21 @@ function isFrihetApiError(error) {
|
|
|
56
58
|
}
|
|
57
59
|
/**
|
|
58
60
|
* Maps an error to a user-friendly MCP tool response with error annotations.
|
|
61
|
+
* Emits structured log entries for all errors.
|
|
59
62
|
*/
|
|
60
|
-
export function handleToolError(error) {
|
|
63
|
+
export function handleToolError(error, toolName) {
|
|
61
64
|
if (isFrihetApiError(error)) {
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
log({
|
|
66
|
+
level: "error",
|
|
67
|
+
message: `API error: ${error.statusCode} ${error.errorCode}: ${error.message}`,
|
|
68
|
+
tool: toolName,
|
|
69
|
+
operation: "tool_error",
|
|
70
|
+
error: {
|
|
71
|
+
message: error.message,
|
|
72
|
+
code: error.errorCode,
|
|
73
|
+
statusCode: error.statusCode,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
64
76
|
const messages = {
|
|
65
77
|
400: "Bad request. Check your input parameters. / Solicitud incorrecta. Revisa los parametros.",
|
|
66
78
|
401: "Authentication failed. Check your API key. / Autenticacion fallida. Revisa tu API key.",
|
|
@@ -83,8 +95,17 @@ export function handleToolError(error) {
|
|
|
83
95
|
isError: true,
|
|
84
96
|
};
|
|
85
97
|
}
|
|
86
|
-
|
|
87
|
-
|
|
98
|
+
const errMsg = error instanceof Error ? error.stack ?? error.message : String(error);
|
|
99
|
+
log({
|
|
100
|
+
level: "error",
|
|
101
|
+
message: `Unexpected error: ${errMsg}`,
|
|
102
|
+
tool: toolName,
|
|
103
|
+
operation: "tool_error",
|
|
104
|
+
error: {
|
|
105
|
+
message: error instanceof Error ? error.message : String(error),
|
|
106
|
+
code: error instanceof Error ? error.name : "unknown",
|
|
107
|
+
},
|
|
108
|
+
});
|
|
88
109
|
return {
|
|
89
110
|
content: [{ type: "text", text: "Error: An unexpected error occurred. Contact support if this persists.", annotations: ERROR_CONTENT_ANNOTATIONS }],
|
|
90
111
|
isError: true,
|
|
@@ -160,8 +181,9 @@ export const invoiceItemOutput = z.object({
|
|
|
160
181
|
id: z.string(),
|
|
161
182
|
clientName: z.string(),
|
|
162
183
|
items: z.array(lineItemSchema),
|
|
163
|
-
|
|
184
|
+
issueDate: z.string().optional(),
|
|
164
185
|
dueDate: z.string().optional(),
|
|
186
|
+
status: z.string().optional(),
|
|
165
187
|
notes: z.string().optional(),
|
|
166
188
|
taxRate: z.number().optional(),
|
|
167
189
|
total: z.number().optional(),
|
|
@@ -182,6 +204,7 @@ export const expenseItemOutput = z.object({
|
|
|
182
204
|
const addressOutputSchema = z.object({
|
|
183
205
|
street: z.string().optional(),
|
|
184
206
|
city: z.string().optional(),
|
|
207
|
+
state: z.string().optional(),
|
|
185
208
|
postalCode: z.string().optional(),
|
|
186
209
|
country: z.string().optional(),
|
|
187
210
|
}).optional();
|
|
@@ -200,9 +223,7 @@ export const productItemOutput = z.object({
|
|
|
200
223
|
name: z.string(),
|
|
201
224
|
unitPrice: z.number(),
|
|
202
225
|
description: z.string().optional(),
|
|
203
|
-
unit: z.string().optional(),
|
|
204
226
|
taxRate: z.number().optional(),
|
|
205
|
-
sku: z.string().optional(),
|
|
206
227
|
createdAt: z.string().optional(),
|
|
207
228
|
updatedAt: z.string().optional(),
|
|
208
229
|
}).passthrough();
|
|
@@ -226,4 +247,32 @@ export const webhookItemOutput = z.object({
|
|
|
226
247
|
createdAt: z.string().optional(),
|
|
227
248
|
updatedAt: z.string().optional(),
|
|
228
249
|
}).passthrough();
|
|
250
|
+
/**
|
|
251
|
+
* Wraps a tool handler to automatically log execution time, success/failure,
|
|
252
|
+
* and record metrics. Catches errors and routes them through handleToolError.
|
|
253
|
+
*
|
|
254
|
+
* Usage in tool registration files:
|
|
255
|
+
* ```ts
|
|
256
|
+
* async ({ id }) => withToolLogging("get_invoice", async () => {
|
|
257
|
+
* const result = await client.getInvoice(id);
|
|
258
|
+
* return { content: [getContent(formatRecord("Invoice", result))], structuredContent: result };
|
|
259
|
+
* })
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
export async function withToolLogging(toolName, fn) {
|
|
263
|
+
const startTime = Date.now();
|
|
264
|
+
try {
|
|
265
|
+
const result = await fn();
|
|
266
|
+
const durationMs = Math.round(Date.now() - startTime);
|
|
267
|
+
logToolCall(toolName, startTime, true);
|
|
268
|
+
recordToolCall(toolName, durationMs, true);
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
const durationMs = Math.round(Date.now() - startTime);
|
|
273
|
+
logToolCall(toolName, startTime, false, error instanceof Error ? error : new Error(String(error)));
|
|
274
|
+
recordToolCall(toolName, durationMs, false);
|
|
275
|
+
return handleToolError(error, toolName);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
229
278
|
//# sourceMappingURL=shared.js.map
|
package/dist/tools/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG5D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG5D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAoJnF"}
|
package/dist/tools/webhooks.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Webhook management tools for the Frihet MCP server.
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod/v4";
|
|
5
|
-
import {
|
|
5
|
+
import { withToolLogging, formatPaginatedResponse, formatRecord, listContent, getContent, mutateContent, READ_ONLY_ANNOTATIONS, CREATE_ANNOTATIONS, UPDATE_ANNOTATIONS, DELETE_ANNOTATIONS, paginatedOutput, deleteResultOutput, webhookItemOutput } from "./shared.js";
|
|
6
6
|
export function registerWebhookTools(server, client) {
|
|
7
7
|
// -- list_webhooks --
|
|
8
8
|
server.registerTool("list_webhooks", {
|
|
@@ -15,18 +15,13 @@ export function registerWebhookTools(server, client) {
|
|
|
15
15
|
offset: z.number().int().min(0).optional().describe("Offset / Desplazamiento"),
|
|
16
16
|
},
|
|
17
17
|
outputSchema: paginatedOutput(webhookItemOutput),
|
|
18
|
-
}, async ({ limit, offset }) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
catch (error) {
|
|
27
|
-
return handleToolError(error);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
18
|
+
}, async ({ limit, offset }) => withToolLogging("list_webhooks", async () => {
|
|
19
|
+
const result = await client.listWebhooks({ limit, offset });
|
|
20
|
+
return {
|
|
21
|
+
content: [listContent(formatPaginatedResponse("webhooks", result))],
|
|
22
|
+
structuredContent: result,
|
|
23
|
+
};
|
|
24
|
+
}));
|
|
30
25
|
// -- get_webhook --
|
|
31
26
|
server.registerTool("get_webhook", {
|
|
32
27
|
title: "Get Webhook",
|
|
@@ -37,25 +32,23 @@ export function registerWebhookTools(server, client) {
|
|
|
37
32
|
id: z.string().describe("Webhook ID / ID del webhook"),
|
|
38
33
|
},
|
|
39
34
|
outputSchema: webhookItemOutput,
|
|
40
|
-
}, async ({ id }) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
return handleToolError(error);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
35
|
+
}, async ({ id }) => withToolLogging("get_webhook", async () => {
|
|
36
|
+
const result = await client.getWebhook(id);
|
|
37
|
+
return {
|
|
38
|
+
content: [getContent(formatRecord("Webhook", result))],
|
|
39
|
+
structuredContent: result,
|
|
40
|
+
};
|
|
41
|
+
}));
|
|
52
42
|
// -- create_webhook --
|
|
53
43
|
server.registerTool("create_webhook", {
|
|
54
44
|
title: "Create Webhook",
|
|
55
45
|
description: "Register a new webhook endpoint. You must specify the URL to receive notifications " +
|
|
56
|
-
"and which events to subscribe to
|
|
57
|
-
"
|
|
58
|
-
"
|
|
46
|
+
"and which events to subscribe to. " +
|
|
47
|
+
"Available events: invoice.created, invoice.updated, invoice.paid, invoice.deleted, " +
|
|
48
|
+
"expense.created, expense.updated, expense.deleted, client.created, client.updated, " +
|
|
49
|
+
"quote.created, quote.updated, quote.accepted. " +
|
|
50
|
+
"Example: url='https://example.com/webhook', events=['invoice.created','invoice.paid'], secret='my-secret' " +
|
|
51
|
+
"/ Registra un nuevo endpoint de webhook. Especifica la URL y los eventos a suscribir.",
|
|
59
52
|
annotations: CREATE_ANNOTATIONS,
|
|
60
53
|
inputSchema: {
|
|
61
54
|
url: z.string().url().describe("Webhook endpoint URL / URL del endpoint del webhook"),
|
|
@@ -74,22 +67,18 @@ export function registerWebhookTools(server, client) {
|
|
|
74
67
|
.describe("Signing secret for payload verification / Secreto para verificar las notificaciones"),
|
|
75
68
|
},
|
|
76
69
|
outputSchema: webhookItemOutput,
|
|
77
|
-
}, async (input) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
return handleToolError(error);
|
|
87
|
-
}
|
|
88
|
-
});
|
|
70
|
+
}, async (input) => withToolLogging("create_webhook", async () => {
|
|
71
|
+
const result = await client.createWebhook(input);
|
|
72
|
+
return {
|
|
73
|
+
content: [mutateContent(formatRecord("Webhook created", result))],
|
|
74
|
+
structuredContent: result,
|
|
75
|
+
};
|
|
76
|
+
}));
|
|
89
77
|
// -- update_webhook --
|
|
90
78
|
server.registerTool("update_webhook", {
|
|
91
79
|
title: "Update Webhook",
|
|
92
|
-
description: "Update an existing webhook configuration. Only
|
|
80
|
+
description: "Update an existing webhook configuration using PATCH semantics. Only provided fields change. " +
|
|
81
|
+
"Example: id='abc123', active=false to disable a webhook. " +
|
|
93
82
|
"/ Actualiza la configuracion de un webhook. Solo se modifican los campos proporcionados.",
|
|
94
83
|
annotations: UPDATE_ANNOTATIONS,
|
|
95
84
|
inputSchema: {
|
|
@@ -100,18 +89,13 @@ export function registerWebhookTools(server, client) {
|
|
|
100
89
|
secret: z.string().optional().describe("Signing secret / Secreto"),
|
|
101
90
|
},
|
|
102
91
|
outputSchema: webhookItemOutput,
|
|
103
|
-
}, async ({ id, ...data }) => {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
return handleToolError(error);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
92
|
+
}, async ({ id, ...data }) => withToolLogging("update_webhook", async () => {
|
|
93
|
+
const result = await client.updateWebhook(id, data);
|
|
94
|
+
return {
|
|
95
|
+
content: [mutateContent(formatRecord("Webhook updated", result))],
|
|
96
|
+
structuredContent: result,
|
|
97
|
+
};
|
|
98
|
+
}));
|
|
115
99
|
// -- delete_webhook --
|
|
116
100
|
server.registerTool("delete_webhook", {
|
|
117
101
|
title: "Delete Webhook",
|
|
@@ -122,17 +106,12 @@ export function registerWebhookTools(server, client) {
|
|
|
122
106
|
id: z.string().describe("Webhook ID / ID del webhook"),
|
|
123
107
|
},
|
|
124
108
|
outputSchema: deleteResultOutput,
|
|
125
|
-
}, async ({ id }) => {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
catch (error) {
|
|
134
|
-
return handleToolError(error);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
109
|
+
}, async ({ id }) => withToolLogging("delete_webhook", async () => {
|
|
110
|
+
await client.deleteWebhook(id);
|
|
111
|
+
return {
|
|
112
|
+
content: [mutateContent(`Webhook ${id} deleted successfully. / Webhook ${id} eliminado correctamente.`)],
|
|
113
|
+
structuredContent: { success: true, id },
|
|
114
|
+
};
|
|
115
|
+
}));
|
|
137
116
|
}
|
|
138
117
|
//# sourceMappingURL=webhooks.js.map
|