@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/README.md
CHANGED
|
@@ -146,6 +146,35 @@ Talk to your ERP. These are real prompts, not marketing copy.
|
|
|
146
146
|
|
|
147
147
|
---
|
|
148
148
|
|
|
149
|
+
## What to expect
|
|
150
|
+
|
|
151
|
+
This MCP is a **structured data interface** -- you describe what you want in natural language, and the AI creates, queries, or modifies business records in Frihet. All 31 tools are CRUD operations over the REST API.
|
|
152
|
+
|
|
153
|
+
**Works great:**
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
"Create an invoice for TechStart SL, 40h consulting at 75 EUR/h" --> creates the invoice
|
|
157
|
+
"Show unpaid invoices over 1,000 EUR" --> queries and filters
|
|
158
|
+
"Log a 120 EUR expense for the Madrid train, category: travel" --> records the expense
|
|
159
|
+
"Update client Acme's email to billing@acme.es" --> modifies the record
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Does not do:**
|
|
163
|
+
|
|
164
|
+
- OCR or PDF scanning -- you cannot upload an invoice image and have it read
|
|
165
|
+
- File upload or attachment handling
|
|
166
|
+
- Image processing of any kind
|
|
167
|
+
|
|
168
|
+
If you need to digitize paper invoices or receipts, extract the data first (e.g., Claude Vision API, a dedicated OCR service, or manual entry), then use the MCP to create the record:
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
1. Scan/photograph the invoice
|
|
172
|
+
2. Use Claude Vision: "Read this invoice image and extract the vendor, items, amounts, and dates"
|
|
173
|
+
3. Then: "Create an expense in Frihet for [extracted data]"
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
149
178
|
## Tools (31)
|
|
150
179
|
|
|
151
180
|
### Invoices (6)
|
|
@@ -353,6 +382,14 @@ npm run build # must pass before submitting
|
|
|
353
382
|
|
|
354
383
|
---
|
|
355
384
|
|
|
385
|
+
## Current limitations
|
|
386
|
+
|
|
387
|
+
- **No OCR or file upload** -- the MCP works with structured data, not images or PDFs. Planned for a future release.
|
|
388
|
+
- **Single company** -- one API key maps to one Frihet workspace. Multi-company support is not yet available.
|
|
389
|
+
- **Frihet account required** -- you need an active account at [app.frihet.io](https://app.frihet.io) and an API key (starts with `fri_`).
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
356
393
|
## Links
|
|
357
394
|
|
|
358
395
|
- [Frihet](https://frihet.io) -- The product
|
|
@@ -10,18 +10,26 @@ export interface IFrihetClient {
|
|
|
10
10
|
listInvoices(params?: {
|
|
11
11
|
limit?: number;
|
|
12
12
|
offset?: number;
|
|
13
|
+
status?: string;
|
|
14
|
+
from?: string;
|
|
15
|
+
to?: string;
|
|
13
16
|
}): Promise<PaginatedResponse<Record<string, unknown>>>;
|
|
14
17
|
getInvoice(id: string): Promise<Record<string, unknown>>;
|
|
15
18
|
createInvoice(data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
16
19
|
updateInvoice(id: string, data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
17
20
|
deleteInvoice(id: string): Promise<void>;
|
|
18
|
-
searchInvoices(
|
|
21
|
+
searchInvoices(query: string, params?: {
|
|
19
22
|
limit?: number;
|
|
20
23
|
offset?: number;
|
|
24
|
+
status?: string;
|
|
25
|
+
from?: string;
|
|
26
|
+
to?: string;
|
|
21
27
|
}): Promise<PaginatedResponse<Record<string, unknown>>>;
|
|
22
28
|
listExpenses(params?: {
|
|
23
29
|
limit?: number;
|
|
24
30
|
offset?: number;
|
|
31
|
+
from?: string;
|
|
32
|
+
to?: string;
|
|
25
33
|
}): Promise<PaginatedResponse<Record<string, unknown>>>;
|
|
26
34
|
getExpense(id: string): Promise<Record<string, unknown>>;
|
|
27
35
|
createExpense(data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
@@ -46,6 +54,9 @@ export interface IFrihetClient {
|
|
|
46
54
|
listQuotes(params?: {
|
|
47
55
|
limit?: number;
|
|
48
56
|
offset?: number;
|
|
57
|
+
status?: string;
|
|
58
|
+
from?: string;
|
|
59
|
+
to?: string;
|
|
49
60
|
}): Promise<PaginatedResponse<Record<string, unknown>>>;
|
|
50
61
|
getQuote(id: string): Promise<Record<string, unknown>>;
|
|
51
62
|
createQuote(data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-interface.d.ts","sourceRoot":"","sources":["../src/client-interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,aAAa;IAE5B,YAAY,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"client-interface.d.ts","sourceRoot":"","sources":["../src/client-interface.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -20,18 +20,26 @@ export declare class FrihetClient {
|
|
|
20
20
|
listInvoices(params?: {
|
|
21
21
|
limit?: number;
|
|
22
22
|
offset?: number;
|
|
23
|
+
status?: string;
|
|
24
|
+
from?: string;
|
|
25
|
+
to?: string;
|
|
23
26
|
}): Promise<PaginatedResponse<Record<string, unknown>>>;
|
|
24
27
|
getInvoice(id: string): Promise<Record<string, unknown>>;
|
|
25
28
|
createInvoice(data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
26
29
|
updateInvoice(id: string, data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
27
30
|
deleteInvoice(id: string): Promise<void>;
|
|
28
|
-
searchInvoices(
|
|
31
|
+
searchInvoices(query: string, params?: {
|
|
29
32
|
limit?: number;
|
|
30
33
|
offset?: number;
|
|
34
|
+
status?: string;
|
|
35
|
+
from?: string;
|
|
36
|
+
to?: string;
|
|
31
37
|
}): Promise<PaginatedResponse<Record<string, unknown>>>;
|
|
32
38
|
listExpenses(params?: {
|
|
33
39
|
limit?: number;
|
|
34
40
|
offset?: number;
|
|
41
|
+
from?: string;
|
|
42
|
+
to?: string;
|
|
35
43
|
}): Promise<PaginatedResponse<Record<string, unknown>>>;
|
|
36
44
|
getExpense(id: string): Promise<Record<string, unknown>>;
|
|
37
45
|
createExpense(data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
@@ -56,6 +64,9 @@ export declare class FrihetClient {
|
|
|
56
64
|
listQuotes(params?: {
|
|
57
65
|
limit?: number;
|
|
58
66
|
offset?: number;
|
|
67
|
+
status?: string;
|
|
68
|
+
from?: string;
|
|
69
|
+
to?: string;
|
|
59
70
|
}): Promise<PaginatedResponse<Record<string, unknown>>>;
|
|
60
71
|
getQuote(id: string): Promise<Record<string, unknown>>;
|
|
61
72
|
createQuote(data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAY,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles authentication, pagination, rate-limit retries, and error mapping.
|
|
5
5
|
*/
|
|
6
|
+
import { logApiCall, logRetry } from "./logger.js";
|
|
6
7
|
const BASE_URL = "https://api.frihet.io/v1";
|
|
7
8
|
const MAX_RETRIES = 3;
|
|
8
9
|
const DEFAULT_RETRY_DELAY_MS = 1000;
|
|
@@ -45,6 +46,7 @@ export class FrihetClient {
|
|
|
45
46
|
};
|
|
46
47
|
const controller = new AbortController();
|
|
47
48
|
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
49
|
+
const startTime = Date.now();
|
|
48
50
|
let response;
|
|
49
51
|
try {
|
|
50
52
|
response = await fetch(url.toString(), {
|
|
@@ -55,16 +57,21 @@ export class FrihetClient {
|
|
|
55
57
|
});
|
|
56
58
|
}
|
|
57
59
|
catch (error) {
|
|
60
|
+
const durationMs = Math.round(Date.now() - startTime);
|
|
58
61
|
if (error instanceof Error && error.name === "AbortError") {
|
|
62
|
+
logApiCall(method, path, 408, durationMs);
|
|
59
63
|
throw new FrihetApiError(408, "request_timeout", `Request timed out after ${REQUEST_TIMEOUT_MS / 1000} seconds`);
|
|
60
64
|
}
|
|
65
|
+
logApiCall(method, path, 0, durationMs);
|
|
61
66
|
throw error;
|
|
62
67
|
}
|
|
63
68
|
finally {
|
|
64
69
|
clearTimeout(timeoutId);
|
|
65
70
|
}
|
|
71
|
+
const durationMs = Math.round(Date.now() - startTime);
|
|
66
72
|
// Rate limit handling
|
|
67
73
|
if (response.status === 429) {
|
|
74
|
+
logApiCall(method, path, 429, durationMs);
|
|
68
75
|
if (retryCount >= MAX_RETRIES) {
|
|
69
76
|
throw new FrihetApiError(429, "rate_limit_exceeded", "Rate limit exceeded after multiple retries. Please try again later.");
|
|
70
77
|
}
|
|
@@ -72,11 +79,13 @@ export class FrihetClient {
|
|
|
72
79
|
const delayMs = retryAfter
|
|
73
80
|
? parseInt(retryAfter, 10) * 1000
|
|
74
81
|
: DEFAULT_RETRY_DELAY_MS * Math.pow(2, retryCount);
|
|
82
|
+
logRetry(method, path, retryCount, delayMs);
|
|
75
83
|
await this.sleep(delayMs);
|
|
76
84
|
return this.request(method, path, body, query, retryCount + 1);
|
|
77
85
|
}
|
|
78
86
|
// Error responses
|
|
79
87
|
if (!response.ok) {
|
|
88
|
+
logApiCall(method, path, response.status, durationMs);
|
|
80
89
|
let errorBody;
|
|
81
90
|
try {
|
|
82
91
|
errorBody = (await response.json());
|
|
@@ -89,6 +98,7 @@ export class FrihetClient {
|
|
|
89
98
|
}
|
|
90
99
|
throw new FrihetApiError(response.status, errorBody.error, errorBody.message ?? errorBody.error);
|
|
91
100
|
}
|
|
101
|
+
logApiCall(method, path, response.status, durationMs);
|
|
92
102
|
// 204 No Content (e.g. DELETE)
|
|
93
103
|
if (response.status === 204) {
|
|
94
104
|
return undefined;
|
|
@@ -113,11 +123,15 @@ export class FrihetClient {
|
|
|
113
123
|
}
|
|
114
124
|
// ---------------------------------------------------------------- Public
|
|
115
125
|
// ----------------------------------------------------------------
|
|
116
|
-
// Invoices
|
|
126
|
+
// ---------------------------------------------------------------- Invoices
|
|
127
|
+
// ----------------------------------------------------------------
|
|
117
128
|
async listInvoices(params) {
|
|
118
129
|
return this.requestPaginated("GET", "/invoices", undefined, {
|
|
119
130
|
limit: params?.limit,
|
|
120
131
|
offset: params?.offset,
|
|
132
|
+
status: params?.status,
|
|
133
|
+
from: params?.from,
|
|
134
|
+
to: params?.to,
|
|
121
135
|
});
|
|
122
136
|
}
|
|
123
137
|
async getInvoice(id) {
|
|
@@ -127,23 +141,29 @@ export class FrihetClient {
|
|
|
127
141
|
return this.request("POST", "/invoices", data);
|
|
128
142
|
}
|
|
129
143
|
async updateInvoice(id, data) {
|
|
130
|
-
return this.request("
|
|
144
|
+
return this.request("PATCH", `/invoices/${encodeURIComponent(id)}`, data);
|
|
131
145
|
}
|
|
132
146
|
async deleteInvoice(id) {
|
|
133
147
|
return this.request("DELETE", `/invoices/${encodeURIComponent(id)}`);
|
|
134
148
|
}
|
|
135
|
-
async searchInvoices(
|
|
149
|
+
async searchInvoices(query, params) {
|
|
136
150
|
return this.requestPaginated("GET", "/invoices", undefined, {
|
|
137
|
-
|
|
151
|
+
q: query,
|
|
138
152
|
limit: params?.limit,
|
|
139
153
|
offset: params?.offset,
|
|
154
|
+
status: params?.status,
|
|
155
|
+
from: params?.from,
|
|
156
|
+
to: params?.to,
|
|
140
157
|
});
|
|
141
158
|
}
|
|
142
|
-
// Expenses
|
|
159
|
+
// ---------------------------------------------------------------- Expenses
|
|
160
|
+
// ----------------------------------------------------------------
|
|
143
161
|
async listExpenses(params) {
|
|
144
162
|
return this.requestPaginated("GET", "/expenses", undefined, {
|
|
145
163
|
limit: params?.limit,
|
|
146
164
|
offset: params?.offset,
|
|
165
|
+
from: params?.from,
|
|
166
|
+
to: params?.to,
|
|
147
167
|
});
|
|
148
168
|
}
|
|
149
169
|
async getExpense(id) {
|
|
@@ -153,12 +173,13 @@ export class FrihetClient {
|
|
|
153
173
|
return this.request("POST", "/expenses", data);
|
|
154
174
|
}
|
|
155
175
|
async updateExpense(id, data) {
|
|
156
|
-
return this.request("
|
|
176
|
+
return this.request("PATCH", `/expenses/${encodeURIComponent(id)}`, data);
|
|
157
177
|
}
|
|
158
178
|
async deleteExpense(id) {
|
|
159
179
|
return this.request("DELETE", `/expenses/${encodeURIComponent(id)}`);
|
|
160
180
|
}
|
|
161
|
-
// Clients
|
|
181
|
+
// ---------------------------------------------------------------- Clients
|
|
182
|
+
// ----------------------------------------------------------------
|
|
162
183
|
async listClients(params) {
|
|
163
184
|
return this.requestPaginated("GET", "/clients", undefined, {
|
|
164
185
|
limit: params?.limit,
|
|
@@ -172,12 +193,13 @@ export class FrihetClient {
|
|
|
172
193
|
return this.request("POST", "/clients", data);
|
|
173
194
|
}
|
|
174
195
|
async updateClient(id, data) {
|
|
175
|
-
return this.request("
|
|
196
|
+
return this.request("PATCH", `/clients/${encodeURIComponent(id)}`, data);
|
|
176
197
|
}
|
|
177
198
|
async deleteClient(id) {
|
|
178
199
|
return this.request("DELETE", `/clients/${encodeURIComponent(id)}`);
|
|
179
200
|
}
|
|
180
|
-
// Products
|
|
201
|
+
// ---------------------------------------------------------------- Products
|
|
202
|
+
// ----------------------------------------------------------------
|
|
181
203
|
async listProducts(params) {
|
|
182
204
|
return this.requestPaginated("GET", "/products", undefined, {
|
|
183
205
|
limit: params?.limit,
|
|
@@ -191,16 +213,20 @@ export class FrihetClient {
|
|
|
191
213
|
return this.request("POST", "/products", data);
|
|
192
214
|
}
|
|
193
215
|
async updateProduct(id, data) {
|
|
194
|
-
return this.request("
|
|
216
|
+
return this.request("PATCH", `/products/${encodeURIComponent(id)}`, data);
|
|
195
217
|
}
|
|
196
218
|
async deleteProduct(id) {
|
|
197
219
|
return this.request("DELETE", `/products/${encodeURIComponent(id)}`);
|
|
198
220
|
}
|
|
199
|
-
// Quotes
|
|
221
|
+
// ---------------------------------------------------------------- Quotes
|
|
222
|
+
// ----------------------------------------------------------------
|
|
200
223
|
async listQuotes(params) {
|
|
201
224
|
return this.requestPaginated("GET", "/quotes", undefined, {
|
|
202
225
|
limit: params?.limit,
|
|
203
226
|
offset: params?.offset,
|
|
227
|
+
status: params?.status,
|
|
228
|
+
from: params?.from,
|
|
229
|
+
to: params?.to,
|
|
204
230
|
});
|
|
205
231
|
}
|
|
206
232
|
async getQuote(id) {
|
|
@@ -210,12 +236,13 @@ export class FrihetClient {
|
|
|
210
236
|
return this.request("POST", "/quotes", data);
|
|
211
237
|
}
|
|
212
238
|
async updateQuote(id, data) {
|
|
213
|
-
return this.request("
|
|
239
|
+
return this.request("PATCH", `/quotes/${encodeURIComponent(id)}`, data);
|
|
214
240
|
}
|
|
215
241
|
async deleteQuote(id) {
|
|
216
242
|
return this.request("DELETE", `/quotes/${encodeURIComponent(id)}`);
|
|
217
243
|
}
|
|
218
|
-
// Webhooks
|
|
244
|
+
// ---------------------------------------------------------------- Webhooks
|
|
245
|
+
// ----------------------------------------------------------------
|
|
219
246
|
async listWebhooks(params) {
|
|
220
247
|
return this.requestPaginated("GET", "/webhooks", undefined, {
|
|
221
248
|
limit: params?.limit,
|
|
@@ -229,7 +256,7 @@ export class FrihetClient {
|
|
|
229
256
|
return this.request("POST", "/webhooks", data);
|
|
230
257
|
}
|
|
231
258
|
async updateWebhook(id, data) {
|
|
232
|
-
return this.request("
|
|
259
|
+
return this.request("PATCH", `/webhooks/${encodeURIComponent(id)}`, data);
|
|
233
260
|
}
|
|
234
261
|
async deleteWebhook(id) {
|
|
235
262
|
return this.request("DELETE", `/webhooks/${encodeURIComponent(id)}`);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,8 @@ import { FrihetClient } from "./client.js";
|
|
|
14
14
|
import { registerAllTools } from "./tools/register-all.js";
|
|
15
15
|
import { registerAllResources } from "./resources/register-all.js";
|
|
16
16
|
import { registerAllPrompts } from "./prompts/register-all.js";
|
|
17
|
+
import { log } from "./logger.js";
|
|
18
|
+
import { registerShutdownHook } from "./metrics.js";
|
|
17
19
|
function main() {
|
|
18
20
|
const apiKey = process.env.FRIHET_API_KEY;
|
|
19
21
|
if (!apiKey) {
|
|
@@ -58,12 +60,24 @@ function main() {
|
|
|
58
60
|
registerAllResources(server);
|
|
59
61
|
// Register 5 workflow prompts (monthly close, onboard client, tax prep, overdue follow-up, expense batch)
|
|
60
62
|
registerAllPrompts(server);
|
|
63
|
+
// Register shutdown hook to log final metrics summary
|
|
64
|
+
registerShutdownHook();
|
|
61
65
|
// Connect via stdio transport
|
|
62
66
|
const transport = new StdioServerTransport();
|
|
63
67
|
server.connect(transport).then(() => {
|
|
64
|
-
|
|
68
|
+
log({
|
|
69
|
+
level: "info",
|
|
70
|
+
message: "Frihet MCP server running on stdio",
|
|
71
|
+
operation: "startup",
|
|
72
|
+
metadata: { version: "1.2.4", transport: "stdio" },
|
|
73
|
+
});
|
|
65
74
|
}).catch((error) => {
|
|
66
|
-
|
|
75
|
+
log({
|
|
76
|
+
level: "error",
|
|
77
|
+
message: "Failed to start Frihet MCP server",
|
|
78
|
+
operation: "startup",
|
|
79
|
+
error: { message: error instanceof Error ? error.message : String(error) },
|
|
80
|
+
});
|
|
67
81
|
process.exit(1);
|
|
68
82
|
});
|
|
69
83
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging utility for the Frihet MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Outputs JSON to stderr (MCP protocol uses stdout for messages).
|
|
5
|
+
* Works in both Node.js (stdio) and Cloudflare Workers (fetch handler) environments.
|
|
6
|
+
*
|
|
7
|
+
* Set FRIHET_MCP_DEBUG=1 to enable debug-level logs.
|
|
8
|
+
*/
|
|
9
|
+
export interface LogEntry {
|
|
10
|
+
level: "debug" | "info" | "warn" | "error";
|
|
11
|
+
message: string;
|
|
12
|
+
service: "frihet-mcp";
|
|
13
|
+
timestamp: string;
|
|
14
|
+
tool?: string;
|
|
15
|
+
operation?: string;
|
|
16
|
+
durationMs?: number;
|
|
17
|
+
error?: {
|
|
18
|
+
message: string;
|
|
19
|
+
code?: string;
|
|
20
|
+
statusCode?: number;
|
|
21
|
+
};
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
type LogInput = Omit<LogEntry, "service" | "timestamp">;
|
|
25
|
+
/**
|
|
26
|
+
* Emit a structured log entry as JSON to stderr.
|
|
27
|
+
* In Cloudflare Workers, console.error automatically routes to Workers Logs.
|
|
28
|
+
*/
|
|
29
|
+
export declare function log(entry: LogInput): void;
|
|
30
|
+
/**
|
|
31
|
+
* Log the result of a tool call with timing.
|
|
32
|
+
*/
|
|
33
|
+
export declare function logToolCall(tool: string, startTime: number, success: boolean, error?: Error & {
|
|
34
|
+
statusCode?: number;
|
|
35
|
+
errorCode?: string;
|
|
36
|
+
}): void;
|
|
37
|
+
/**
|
|
38
|
+
* Log an outbound API call with timing.
|
|
39
|
+
*/
|
|
40
|
+
export declare function logApiCall(method: string, path: string, statusCode: number, durationMs: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Log a rate-limit retry.
|
|
43
|
+
*/
|
|
44
|
+
export declare function logRetry(method: string, path: string, retryCount: number, delayMs: number): void;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,KAAK,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;AAiBxD;;;GAGG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAiBzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,KAAK,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,IAAI,CAyBN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,IAAI,CAON"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging utility for the Frihet MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Outputs JSON to stderr (MCP protocol uses stdout for messages).
|
|
5
|
+
* Works in both Node.js (stdio) and Cloudflare Workers (fetch handler) environments.
|
|
6
|
+
*
|
|
7
|
+
* Set FRIHET_MCP_DEBUG=1 to enable debug-level logs.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Returns true if debug logging is enabled.
|
|
11
|
+
* Checks env var in Node.js; always false in Workers unless overridden.
|
|
12
|
+
*/
|
|
13
|
+
function isDebugEnabled() {
|
|
14
|
+
// Node.js environment
|
|
15
|
+
if (typeof process !== "undefined" && process?.env) {
|
|
16
|
+
return process.env.FRIHET_MCP_DEBUG === "1" || process.env.FRIHET_MCP_DEBUG === "true";
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Emit a structured log entry as JSON to stderr.
|
|
22
|
+
* In Cloudflare Workers, console.error automatically routes to Workers Logs.
|
|
23
|
+
*/
|
|
24
|
+
export function log(entry) {
|
|
25
|
+
if (entry.level === "debug" && !isDebugEnabled()) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const full = {
|
|
29
|
+
...entry,
|
|
30
|
+
service: "frihet-mcp",
|
|
31
|
+
timestamp: new Date().toISOString(),
|
|
32
|
+
};
|
|
33
|
+
// Remove undefined fields for cleaner output
|
|
34
|
+
const cleaned = JSON.stringify(full, (_key, value) => value === undefined ? undefined : value);
|
|
35
|
+
console.error(cleaned);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Log the result of a tool call with timing.
|
|
39
|
+
*/
|
|
40
|
+
export function logToolCall(tool, startTime, success, error) {
|
|
41
|
+
const durationMs = Math.round(Date.now() - startTime);
|
|
42
|
+
if (!success && error) {
|
|
43
|
+
log({
|
|
44
|
+
level: "error",
|
|
45
|
+
message: `Tool ${tool} failed`,
|
|
46
|
+
tool,
|
|
47
|
+
operation: "tool_call",
|
|
48
|
+
durationMs,
|
|
49
|
+
error: {
|
|
50
|
+
message: error.message,
|
|
51
|
+
code: error.errorCode ?? error.name,
|
|
52
|
+
statusCode: error.statusCode,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
log({
|
|
58
|
+
level: "info",
|
|
59
|
+
message: `Tool ${tool} completed`,
|
|
60
|
+
tool,
|
|
61
|
+
operation: "tool_call",
|
|
62
|
+
durationMs,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Log an outbound API call with timing.
|
|
68
|
+
*/
|
|
69
|
+
export function logApiCall(method, path, statusCode, durationMs) {
|
|
70
|
+
const level = statusCode >= 500 ? "error" : statusCode >= 400 ? "warn" : "info";
|
|
71
|
+
log({
|
|
72
|
+
level,
|
|
73
|
+
message: `${method} ${path} ${statusCode} ${durationMs}ms`,
|
|
74
|
+
operation: "api_call",
|
|
75
|
+
durationMs,
|
|
76
|
+
metadata: { method, path, statusCode },
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Log a rate-limit retry.
|
|
81
|
+
*/
|
|
82
|
+
export function logRetry(method, path, retryCount, delayMs) {
|
|
83
|
+
log({
|
|
84
|
+
level: "warn",
|
|
85
|
+
message: `Rate limited, retrying ${method} ${path} (attempt ${retryCount + 1}, delay ${delayMs}ms)`,
|
|
86
|
+
operation: "api_retry",
|
|
87
|
+
metadata: { method, path, retryCount: retryCount + 1, delayMs },
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory tool usage metrics for the Frihet MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Tracks per-tool call counts, error counts, and average duration.
|
|
5
|
+
* Metrics are logged on graceful shutdown (SIGINT/SIGTERM in Node.js)
|
|
6
|
+
* or can be retrieved at any time via getMetrics().
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Record a completed tool call.
|
|
10
|
+
*/
|
|
11
|
+
export declare function recordToolCall(tool: string, durationMs: number, success: boolean): void;
|
|
12
|
+
/**
|
|
13
|
+
* Get current metrics snapshot.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getMetrics(): {
|
|
16
|
+
tools: Record<string, {
|
|
17
|
+
calls: number;
|
|
18
|
+
errors: number;
|
|
19
|
+
avgMs: number;
|
|
20
|
+
}>;
|
|
21
|
+
uptime: number;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Register shutdown handlers (Node.js only).
|
|
25
|
+
* In Workers, metrics are per-request and logged via console automatically.
|
|
26
|
+
*/
|
|
27
|
+
export declare function registerShutdownHook(): void;
|
|
28
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,MAAM,EAAE,MAAM,CAAC;CAChB,CAeA;AA4BD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAW3C"}
|