@daften/fireflyiii-mcp 0.1.1 → 0.2.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/.env.example +15 -0
- package/CHANGELOG.md +14 -2
- package/README.md +71 -2
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +47 -15
- package/dist/args.js.map +1 -1
- package/dist/client.d.ts +19 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -1
- package/dist/http.js +2 -2
- package/dist/http.js.map +1 -1
- package/dist/tools/_helpers.d.ts +54 -0
- package/dist/tools/_helpers.d.ts.map +1 -1
- package/dist/tools/_helpers.js +69 -0
- package/dist/tools/_helpers.js.map +1 -1
- package/dist/tools/accounts.d.ts +2 -0
- package/dist/tools/accounts.d.ts.map +1 -1
- package/dist/tools/accounts.js +57 -9
- package/dist/tools/accounts.js.map +1 -1
- package/dist/tools/attachments.d.ts +13 -1
- package/dist/tools/attachments.d.ts.map +1 -1
- package/dist/tools/attachments.js +29 -5
- package/dist/tools/attachments.js.map +1 -1
- package/dist/tools/budgets.d.ts +1 -0
- package/dist/tools/budgets.d.ts.map +1 -1
- package/dist/tools/budgets.js +55 -11
- package/dist/tools/budgets.js.map +1 -1
- package/dist/tools/categories.d.ts +1 -0
- package/dist/tools/categories.d.ts.map +1 -1
- package/dist/tools/categories.js +51 -7
- package/dist/tools/categories.js.map +1 -1
- package/package.json +8 -2
package/.env.example
CHANGED
|
@@ -13,3 +13,18 @@ FIREFLY_TOKEN=your-personal-access-token-here
|
|
|
13
13
|
# Required for HTTP transport when not on loopback (e.g. Docker, reverse proxy)
|
|
14
14
|
# Public base URL of THIS MCP server — used to construct OAuth redirect URIs.
|
|
15
15
|
MCP_BASE_URL=https://mcp.example.com
|
|
16
|
+
|
|
17
|
+
# Optional (both transports): emit verbose autocomplete tracing to stderr.
|
|
18
|
+
# FIREFLY_DEBUG=true
|
|
19
|
+
|
|
20
|
+
# Optional tool filtering (fallbacks for --preset / --groups / --read-only).
|
|
21
|
+
# A CLI flag always takes precedence over these. MCP_PRESET and MCP_GROUPS are
|
|
22
|
+
# mutually exclusive.
|
|
23
|
+
# Presets: minimal, default, budgeting, insights, automation, full
|
|
24
|
+
# MCP_PRESET=default
|
|
25
|
+
# Groups: accounts, transactions, budgets, categories, bills, piggy-banks,
|
|
26
|
+
# reports, rules, recurring, attachments, currencies, exports,
|
|
27
|
+
# object-groups, transaction-links
|
|
28
|
+
# MCP_GROUPS=accounts,transactions
|
|
29
|
+
# Accepts "true" or "1" (case-insensitive); any other value is ignored.
|
|
30
|
+
# MCP_READ_ONLY=true
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.0] - 2026-05-30
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Nightly integration tests run automatically against a live Firefly III instance (latest release) via GitHub Actions, covering the transform layer, six tool groups (accounts, transactions, budgets, categories, currencies, tags, summary), and full account and transaction CRUD cycles.
|
|
14
|
+
- [Experimental] Add autocompletion support for account, budget, and category parameters using the MCP Completion API. Note: Standard tool argument completions are not supported by the MCP specification directly, so this is implemented via native Prompts (`category-transactions`, `account-transactions`, `budget-transactions`). This is supported primarily by clients that support Prompt argument autocomplete (such as Claude Code) and may not function in other MCP clients. Suggestions are cached in memory (60s TTL) and scoped per authenticated user, so the cache is safe under multi-user HTTP/OAuth deployments. Set `FIREFLY_DEBUG=true` for verbose autocomplete tracing on stderr.
|
|
15
|
+
- Support tool presets, group filters, and read-only mode via environment variables (`MCP_PRESET`, `MCP_GROUPS`, `MCP_READ_ONLY`).
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- `create_account` now accepts `account_role`, which Firefly III requires when creating asset accounts.
|
|
19
|
+
- `download_attachment` no longer corrupts binary files (PDFs, images): content is read as raw bytes and Base64-encoded instead of decoded as UTF-8 text. Images are now returned as a native MCP image block (rendered by the client); other files as their filename, MIME type, and Base64 content.
|
|
20
|
+
|
|
10
21
|
## [0.1.1] - 2026-05-23
|
|
11
22
|
|
|
12
23
|
### Fixed
|
|
@@ -24,7 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
24
35
|
## [0.1.0] - 2026-05-23
|
|
25
36
|
|
|
26
37
|
### Added
|
|
27
|
-
- Initial release of the Firefly III
|
|
38
|
+
- Initial release of the MCP server for Firefly III.
|
|
28
39
|
- 140 tools across 14 groups: accounts, transactions, budgets, categories, bills, piggy banks, reports (tags + insights), automation rules, recurring transactions, attachments, currencies, data exports, object groups, transaction links.
|
|
29
40
|
- Two transports: stdio (Personal Access Token auth) and HTTP (OAuth 2.0 + PKCE with a built-in proxy for redirect-URI substitution).
|
|
30
41
|
- Tool filtering via `--preset`, `--groups`, and `--read-only` CLI flags. Presets: `minimal`, `default`, `budgeting`, `insights`, `automation`, `full`.
|
|
@@ -32,6 +43,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
32
43
|
- npm publish provenance via GitHub OIDC.
|
|
33
44
|
- GitHub Release auto-created from the tag annotation on each `v*` tag push.
|
|
34
45
|
|
|
35
|
-
[Unreleased]: https://github.com/daften/fireflyiii-mcp/compare/v0.
|
|
46
|
+
[Unreleased]: https://github.com/daften/fireflyiii-mcp/compare/v0.2.0...HEAD
|
|
47
|
+
[0.2.0]: https://github.com/daften/fireflyiii-mcp/compare/v0.1.1...v0.2.0
|
|
36
48
|
[0.1.1]: https://github.com/daften/fireflyiii-mcp/compare/v0.1.0...v0.1.1
|
|
37
49
|
[0.1.0]: https://github.com/daften/fireflyiii-mcp/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Firefly III
|
|
1
|
+
# MCP server for Firefly III
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@daften/fireflyiii-mcp)
|
|
4
4
|
[](https://www.npmjs.com/package/@daften/fireflyiii-mcp)
|
|
@@ -147,6 +147,21 @@ docker run \
|
|
|
147
147
|
|
|
148
148
|
`MCP_BASE_URL` is the externally reachable URL of your container — used to build OAuth redirect URIs. If omitted the server falls back to the `Host` request header, which is unreliable behind a reverse proxy.
|
|
149
149
|
|
|
150
|
+
To limit which tools the container exposes (e.g. to save context or run read-only), add the filtering environment variables — there are no CLI flags to pass in Docker, so these are the way to configure it:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
docker run \
|
|
154
|
+
-e FIREFLY_URL=https://your-firefly-instance.example.com \
|
|
155
|
+
-e FIREFLY_OAUTH_CLIENT_ID=your-client-id \
|
|
156
|
+
-e MCP_BASE_URL=https://mcp.example.com \
|
|
157
|
+
-e MCP_PRESET=default \
|
|
158
|
+
-e MCP_READ_ONLY=true \
|
|
159
|
+
-p 3000:3000 \
|
|
160
|
+
ghcr.io/daften/fireflyiii-mcp:latest
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
See [Filtering Tools](#filtering-tools) for the full list of presets, groups, and the precedence rules.
|
|
164
|
+
|
|
150
165
|
Or with docker-compose (copy `docker-compose.yml` from the repo):
|
|
151
166
|
|
|
152
167
|
```bash
|
|
@@ -244,6 +259,28 @@ Connect Claude as in Option 2, Step 3.
|
|
|
244
259
|
|
|
245
260
|
The server exposes `GET /.well-known/oauth-authorization-server` (no auth required) which returns RFC 8414 metadata. MCP clients use this to discover OAuth endpoints automatically — no manual OAuth configuration needed in the client.
|
|
246
261
|
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Experimental Autocomplete Prompts
|
|
265
|
+
|
|
266
|
+
The server implements native **MCP Prompts** with **experimental autocomplete (completions)** support for common parameters (accounts, budgets, and categories). This allows you to select resources via interactive dropdowns instead of guessing numeric database IDs.
|
|
267
|
+
|
|
268
|
+
> [!WARNING]
|
|
269
|
+
> **Client Compatibility Notice:** The MCP specification does not support autocomplete on regular tool arguments directly. Therefore, autocomplete is implemented using standard MCP Prompts. This feature is **highly experimental** and depends heavily on your MCP client's capabilities:
|
|
270
|
+
> * **Supported:** This is fully supported in advanced agentic clients like **Claude Code** (which renders Prompt dropdown completions during interactive form-filling).
|
|
271
|
+
> * **Not Supported:** Standard chat interfaces like the **Claude Desktop App** do not currently support rendering autocomplete dropdowns for MCP Prompts.
|
|
272
|
+
|
|
273
|
+
### Available Prompts
|
|
274
|
+
* **`account-transactions`**: Fetches transaction records for a specific account. Case-insensitive autocomplete matching across assets, expenses (merchants/contacts like `"Dieter"`), revenues, and liabilities.
|
|
275
|
+
* **`budget-transactions`**: Fetches transaction records for a specific budget.
|
|
276
|
+
* **`category-transactions`**: Fetches transactions matching a specific spending category.
|
|
277
|
+
|
|
278
|
+
Suggestions are pre-fetched (up to 1,000 records) and cached in memory for 60 seconds, returning the top 100 matches per keystroke for instant rendering. The cache is scoped per authenticated user, so it is safe under multi-user HTTP/OAuth deployments. Set `FIREFLY_DEBUG=true` to log autocomplete activity to stderr.
|
|
279
|
+
|
|
280
|
+
To trigger them in a supported client like Claude Code, click the **`+`** icon, select the prompt (e.g. `account-transactions`), and start typing to filter and select your account instantly.
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
247
284
|
## Available Tools
|
|
248
285
|
|
|
249
286
|
### Accounts
|
|
@@ -405,7 +442,7 @@ The server exposes `GET /.well-known/oauth-authorization-server` (no auth requir
|
|
|
405
442
|
| `update_attachment` | Update attachment metadata |
|
|
406
443
|
| `delete_attachment` | Delete an attachment and its file data. This action cannot be undone. |
|
|
407
444
|
| `upload_attachment` | Upload base64-encoded file content for an existing attachment record (step 2 of 2) |
|
|
408
|
-
| `download_attachment` | Download
|
|
445
|
+
| `download_attachment` | Download an attachment by ID; images are returned as a rendered image, other files as their filename, MIME type, and Base64 content |
|
|
409
446
|
|
|
410
447
|
</details>
|
|
411
448
|
|
|
@@ -569,6 +606,38 @@ node dist/index.js --groups rules --read-only
|
|
|
569
606
|
|
|
570
607
|
Without any filter flags the server registers all 140 tools (equivalent to `--preset full`).
|
|
571
608
|
|
|
609
|
+
### Environment variable equivalents
|
|
610
|
+
|
|
611
|
+
Each filter flag has an environment-variable fallback, which is convenient for the npm/stdio and Docker setups where there is no natural place to pass CLI flags. A CLI flag always takes precedence over its environment variable.
|
|
612
|
+
|
|
613
|
+
| Variable | Equivalent flag | Example |
|
|
614
|
+
|----------|-----------------|---------|
|
|
615
|
+
| `MCP_PRESET` | `--preset <name>` | `MCP_PRESET=default` |
|
|
616
|
+
| `MCP_GROUPS` | `--groups <list>` | `MCP_GROUPS=accounts,transactions` |
|
|
617
|
+
| `MCP_READ_ONLY` | `--read-only` | `MCP_READ_ONLY=true` (also accepts `1`) |
|
|
618
|
+
|
|
619
|
+
As with the flags, `MCP_PRESET` and `MCP_GROUPS` are mutually exclusive.
|
|
620
|
+
|
|
621
|
+
In a stdio MCP client config:
|
|
622
|
+
|
|
623
|
+
```jsonc
|
|
624
|
+
"env": {
|
|
625
|
+
"FIREFLY_URL": "https://your-firefly-instance.example.com",
|
|
626
|
+
"FIREFLY_TOKEN": "your-personal-access-token-here",
|
|
627
|
+
"MCP_PRESET": "default",
|
|
628
|
+
"MCP_READ_ONLY": "true"
|
|
629
|
+
}
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
In Docker — where there are no CLI flags to pass — set them as container environment variables, either via `docker run -e MCP_PRESET=default …` (see [Docker setup](#option-3-docker--http-self-hosted)) or in `docker-compose.yml`, which already forwards them from your shell or `.env` file:
|
|
633
|
+
|
|
634
|
+
```yaml
|
|
635
|
+
environment:
|
|
636
|
+
MCP_PRESET: ${MCP_PRESET:-}
|
|
637
|
+
MCP_GROUPS: ${MCP_GROUPS:-}
|
|
638
|
+
MCP_READ_ONLY: ${MCP_READ_ONLY:-}
|
|
639
|
+
```
|
|
640
|
+
|
|
572
641
|
---
|
|
573
642
|
|
|
574
643
|
## Development
|
package/dist/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,iBAAiB,EAAkB,MAAM,kBAAkB,CAAC;AAEjH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,iBAAiB,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,iBAAiB,EAAkB,MAAM,kBAAkB,CAAC;AAEjH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,iBAAiB,CAAC;CAClC;AAgCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgEpD"}
|
package/dist/args.js
CHANGED
|
@@ -1,4 +1,32 @@
|
|
|
1
1
|
import { PRESETS, TOOL_GROUPS } from './tools/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate a preset name from either a CLI flag or an environment variable.
|
|
4
|
+
* `source` is appended to the error message (e.g. " from MCP_PRESET") to make
|
|
5
|
+
* misconfiguration easy to trace; pass "" for CLI flags.
|
|
6
|
+
*/
|
|
7
|
+
function validatePreset(val, source = '') {
|
|
8
|
+
if (!(val in PRESETS)) {
|
|
9
|
+
throw new Error(`Unknown preset "${val}"${source}. Valid presets: ${Object.keys(PRESETS).join(', ')}`);
|
|
10
|
+
}
|
|
11
|
+
return val;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parse a comma-separated group list from a CLI flag or environment variable.
|
|
15
|
+
* Whitespace and empty entries are ignored; an unknown group throws. Returns
|
|
16
|
+
* an empty array when the input contains no usable group names.
|
|
17
|
+
*/
|
|
18
|
+
function parseGroups(raw, source = '') {
|
|
19
|
+
const parts = raw
|
|
20
|
+
.split(',')
|
|
21
|
+
.map((g) => g.trim())
|
|
22
|
+
.filter(Boolean);
|
|
23
|
+
for (const g of parts) {
|
|
24
|
+
if (!TOOL_GROUPS.includes(g)) {
|
|
25
|
+
throw new Error(`Unknown group "${g}"${source}. Valid groups: ${TOOL_GROUPS.join(', ')}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return parts;
|
|
29
|
+
}
|
|
2
30
|
export function parseArgs(args) {
|
|
3
31
|
let transport = 'stdio';
|
|
4
32
|
let host = '127.0.0.1';
|
|
@@ -28,28 +56,32 @@ export function parseArgs(args) {
|
|
|
28
56
|
portWasExplicit = true;
|
|
29
57
|
}
|
|
30
58
|
else if (arg === '--preset' && args[i + 1]) {
|
|
31
|
-
|
|
32
|
-
if (!(val in PRESETS)) {
|
|
33
|
-
throw new Error(`Unknown preset "${val}". Valid presets: ${Object.keys(PRESETS).join(', ')}`);
|
|
34
|
-
}
|
|
35
|
-
preset = val;
|
|
59
|
+
preset = validatePreset(args[++i]);
|
|
36
60
|
}
|
|
37
61
|
else if (arg === '--groups' && args[i + 1]) {
|
|
38
|
-
|
|
39
|
-
.split(',')
|
|
40
|
-
.map((g) => g.trim())
|
|
41
|
-
.filter(Boolean);
|
|
42
|
-
for (const g of parts) {
|
|
43
|
-
if (!TOOL_GROUPS.includes(g)) {
|
|
44
|
-
throw new Error(`Unknown group "${g}". Valid groups: ${TOOL_GROUPS.join(', ')}`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
groups = parts;
|
|
62
|
+
groups = parseGroups(args[++i]);
|
|
48
63
|
}
|
|
49
64
|
else if (arg === '--read-only') {
|
|
50
65
|
readOnly = true;
|
|
51
66
|
}
|
|
52
67
|
}
|
|
68
|
+
// Environment-variable fallbacks. CLI flags always take precedence: each is
|
|
69
|
+
// consulted only when the corresponding flag was omitted.
|
|
70
|
+
if (preset === undefined && process.env.MCP_PRESET?.trim()) {
|
|
71
|
+
preset = validatePreset(process.env.MCP_PRESET.trim(), ' from MCP_PRESET');
|
|
72
|
+
}
|
|
73
|
+
if (groups === undefined && process.env.MCP_GROUPS) {
|
|
74
|
+
const parsed = parseGroups(process.env.MCP_GROUPS, ' from MCP_GROUPS');
|
|
75
|
+
// An empty/whitespace-only value (e.g. "," or " ") is treated as unset
|
|
76
|
+
// rather than "select no groups", which would silently register no tools.
|
|
77
|
+
if (parsed.length > 0)
|
|
78
|
+
groups = parsed;
|
|
79
|
+
}
|
|
80
|
+
if (!readOnly) {
|
|
81
|
+
const flag = process.env.MCP_READ_ONLY?.trim().toLowerCase();
|
|
82
|
+
if (flag === 'true' || flag === '1')
|
|
83
|
+
readOnly = true;
|
|
84
|
+
}
|
|
53
85
|
if (preset !== undefined && groups !== undefined) {
|
|
54
86
|
throw new Error('Cannot use both --preset and --groups. Choose one.');
|
|
55
87
|
}
|
package/dist/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,WAAW,EAA0C,MAAM,kBAAkB,CAAC;AAUjH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,SAAS,GAAqB,OAAO,CAAC;IAC1C,IAAI,IAAI,GAAG,WAAW,CAAC;IACvB,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,MAA8B,CAAC;IACnC,IAAI,MAA+B,CAAC;IACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,aAAa,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,GAAG,CAAC,CAAC;YACzE,CAAC;YACD,SAAS,GAAG,GAAG,CAAC;QAClB,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3C,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,GAAG,MAAM,CAAC;YACd,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -5,6 +5,14 @@ export declare class FireflyError extends Error {
|
|
|
5
5
|
readonly body: string;
|
|
6
6
|
constructor(status: number, url: string, body: string);
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Extract a filename from a Content-Disposition header. Handles the RFC 5987
|
|
10
|
+
* extended form (`filename*=UTF-8''…`, percent-decoded) and the plain
|
|
11
|
+
* `filename=` form (quoted or unquoted, used verbatim). Returns "file" when no
|
|
12
|
+
* usable filename is present. `decodeURIComponent` is applied only to the
|
|
13
|
+
* extended form — a plain filename containing a literal "%" must not be decoded.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseContentDispositionFilename(header: string | null | undefined): string;
|
|
8
16
|
export declare function formatError(err: unknown): string;
|
|
9
17
|
export declare class FireflyClient {
|
|
10
18
|
private readonly tokenResolver;
|
|
@@ -12,6 +20,12 @@ export declare class FireflyClient {
|
|
|
12
20
|
private readonly timeoutMs;
|
|
13
21
|
constructor(baseUrl: string, tokenResolver: string | (() => string));
|
|
14
22
|
private getToken;
|
|
23
|
+
/**
|
|
24
|
+
* Stable, non-reversible per-identity key derived from the current bearer token. Used to scope
|
|
25
|
+
* in-memory caches per user — essential in HTTP mode, where one client instance serves every
|
|
26
|
+
* request and the token is resolved per request from the async context.
|
|
27
|
+
*/
|
|
28
|
+
cacheKey(): string;
|
|
15
29
|
private buildUrl;
|
|
16
30
|
private rawFetch;
|
|
17
31
|
private request;
|
|
@@ -21,5 +35,10 @@ export declare class FireflyClient {
|
|
|
21
35
|
delete(path: string): Promise<void>;
|
|
22
36
|
postBinary(path: string, body: Uint8Array): Promise<void>;
|
|
23
37
|
getText(path: string, params?: QueryParams): Promise<string>;
|
|
38
|
+
getBinary(path: string, params?: QueryParams): Promise<{
|
|
39
|
+
data: Buffer;
|
|
40
|
+
contentType: string;
|
|
41
|
+
filename: string;
|
|
42
|
+
}>;
|
|
24
43
|
}
|
|
25
44
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,YAAa,SAAQ,KAAK;aAEnB,MAAM,EAAE,MAAM;aACd,GAAG,EAAE,MAAM;aACX,IAAI,EAAE,MAAM;gBAFZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM;CAK/B;AAgBD;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAczF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAiBhD;AAED,qBAAa,aAAa;IAMtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IALhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAGlC,OAAO,EAAE,MAAM,EACE,aAAa,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;IAKzD,OAAO,CAAC,QAAQ;IAIhB;;;;OAIG;IACH,QAAQ,IAAI,MAAM;IAIlB,OAAO,CAAC,QAAQ;YAeF,QAAQ;YAqBR,OAAO;IAcf,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhE,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5D,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAcpE"}
|
package/dist/client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
1
2
|
export class FireflyError extends Error {
|
|
2
3
|
status;
|
|
3
4
|
url;
|
|
@@ -24,6 +25,30 @@ function parseFieldErrors(body) {
|
|
|
24
25
|
}
|
|
25
26
|
return null;
|
|
26
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Extract a filename from a Content-Disposition header. Handles the RFC 5987
|
|
30
|
+
* extended form (`filename*=UTF-8''…`, percent-decoded) and the plain
|
|
31
|
+
* `filename=` form (quoted or unquoted, used verbatim). Returns "file" when no
|
|
32
|
+
* usable filename is present. `decodeURIComponent` is applied only to the
|
|
33
|
+
* extended form — a plain filename containing a literal "%" must not be decoded.
|
|
34
|
+
*/
|
|
35
|
+
export function parseContentDispositionFilename(header) {
|
|
36
|
+
if (!header)
|
|
37
|
+
return 'file';
|
|
38
|
+
const extended = header.match(/filename\*=(?:[\w-]+'[^']*')?([^;]+)/i);
|
|
39
|
+
if (extended?.[1]) {
|
|
40
|
+
const raw = extended[1].trim().replace(/^["']|["']$/g, '');
|
|
41
|
+
try {
|
|
42
|
+
return decodeURIComponent(raw);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return raw; // malformed percent-encoding — fall back to the raw value
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const plain = header.match(/filename=("([^"]*)"|([^;]+))/i);
|
|
49
|
+
const value = (plain?.[2] ?? plain?.[3] ?? '').trim();
|
|
50
|
+
return value || 'file';
|
|
51
|
+
}
|
|
27
52
|
export function formatError(err) {
|
|
28
53
|
if (err instanceof FireflyError) {
|
|
29
54
|
if (err.status === 400) {
|
|
@@ -57,6 +82,14 @@ export class FireflyClient {
|
|
|
57
82
|
getToken() {
|
|
58
83
|
return typeof this.tokenResolver === 'function' ? this.tokenResolver() : this.tokenResolver;
|
|
59
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Stable, non-reversible per-identity key derived from the current bearer token. Used to scope
|
|
87
|
+
* in-memory caches per user — essential in HTTP mode, where one client instance serves every
|
|
88
|
+
* request and the token is resolved per request from the async context.
|
|
89
|
+
*/
|
|
90
|
+
cacheKey() {
|
|
91
|
+
return createHash('sha256').update(this.getToken()).digest('hex');
|
|
92
|
+
}
|
|
60
93
|
buildUrl(path, params) {
|
|
61
94
|
const url = new URL(`${this.baseUrl}/api/v1${path}`);
|
|
62
95
|
if (params) {
|
|
@@ -142,5 +175,19 @@ export class FireflyClient {
|
|
|
142
175
|
});
|
|
143
176
|
return response.text();
|
|
144
177
|
}
|
|
178
|
+
async getBinary(path, params) {
|
|
179
|
+
const response = await this.rawFetch(this.buildUrl(path, params), {
|
|
180
|
+
method: 'GET',
|
|
181
|
+
headers: {
|
|
182
|
+
Authorization: `Bearer ${this.getToken()}`,
|
|
183
|
+
Accept: '*/*',
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
187
|
+
const data = Buffer.from(arrayBuffer);
|
|
188
|
+
const contentType = response.headers.get('Content-Type') ?? 'application/octet-stream';
|
|
189
|
+
const filename = parseContentDispositionFilename(response.headers.get('Content-Disposition'));
|
|
190
|
+
return { data, contentType, filename };
|
|
191
|
+
}
|
|
145
192
|
}
|
|
146
193
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/http.js
CHANGED
|
@@ -181,7 +181,7 @@ export function createOAuthHandler(fireflyUrl, oauthClientId, mcpHandler) {
|
|
|
181
181
|
const token = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null;
|
|
182
182
|
if (!token) {
|
|
183
183
|
res.writeHead(401, {
|
|
184
|
-
'WWW-Authenticate': 'Bearer resource="Firefly III
|
|
184
|
+
'WWW-Authenticate': 'Bearer resource="MCP server for Firefly III"',
|
|
185
185
|
'Content-Type': 'application/json',
|
|
186
186
|
});
|
|
187
187
|
res.end(JSON.stringify({ error: 'unauthorized', error_description: 'Bearer token required' }));
|
|
@@ -263,7 +263,7 @@ export async function startHttpServer(createMcpServer, host, requestedPort, port
|
|
|
263
263
|
httpServer.on('error', (err) => {
|
|
264
264
|
process.stderr.write(`HTTP server error: ${err}\n`);
|
|
265
265
|
});
|
|
266
|
-
process.stdout.write(`Firefly III
|
|
266
|
+
process.stdout.write(`MCP server for Firefly III listening on http://${host}:${port}\n`);
|
|
267
267
|
if (moved) {
|
|
268
268
|
process.stdout.write(`(port ${requestedPort} was in use — moved up automatically)\n`);
|
|
269
269
|
}
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/_helpers.d.ts
CHANGED
|
@@ -12,6 +12,60 @@ type ToolConfig = {
|
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
14
|
export declare function defineTool(server: McpServer, name: string, config: ToolConfig, fetch: (args: Record<string, unknown>) => Promise<unknown>): void;
|
|
15
|
+
/** A pre-built MCP tool result. Used by tools that return native content blocks
|
|
16
|
+
* (e.g. an `image` block) instead of letting {@link defineTool} JSON-stringify a
|
|
17
|
+
* plain value into a single text block. */
|
|
18
|
+
export type ContentResult = {
|
|
19
|
+
content: Array<{
|
|
20
|
+
type: 'text';
|
|
21
|
+
text: string;
|
|
22
|
+
} | {
|
|
23
|
+
type: 'image';
|
|
24
|
+
data: string;
|
|
25
|
+
mimeType: string;
|
|
26
|
+
}>;
|
|
27
|
+
isError?: boolean;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Like {@link defineTool}, but the handler returns a ready-made MCP result
|
|
31
|
+
* (content blocks) rather than a plain value. Error handling is identical:
|
|
32
|
+
* thrown errors become an `isError` text block via {@link formatError}.
|
|
33
|
+
*/
|
|
34
|
+
export declare function defineContentTool(server: McpServer, name: string, config: ToolConfig, fetch: (args: Record<string, unknown>) => Promise<ContentResult>): void;
|
|
15
35
|
export declare const dateSchema: z.ZodString;
|
|
36
|
+
/**
|
|
37
|
+
* Extracts a leading numeric ID from an autocomplete label such as `"42 (Checking - asset)"`.
|
|
38
|
+
*
|
|
39
|
+
* This relies on the completion-label format (the numeric ID always comes first). When the value
|
|
40
|
+
* has no leading digits it is returned unchanged. Note that a free-typed value like `"42 Main St"`
|
|
41
|
+
* would resolve to `"42"`, so callers should prefer values picked from autocomplete suggestions
|
|
42
|
+
* rather than arbitrary user input.
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseId(id: string): string;
|
|
45
|
+
export declare const AUTOCOMPLETE_FETCH_LIMIT = 1000;
|
|
46
|
+
export declare const AUTOCOMPLETE_MAX_SUGGESTIONS = 100;
|
|
47
|
+
/**
|
|
48
|
+
* Writes to stderr only when FIREFLY_DEBUG is set. Never touches stdout, so it is safe under the
|
|
49
|
+
* stdio transport. Used for the verbose autocomplete tracing that would otherwise fire on every
|
|
50
|
+
* keystroke (and echo user search terms) in normal operation.
|
|
51
|
+
*/
|
|
52
|
+
export declare function debugLog(...args: unknown[]): void;
|
|
53
|
+
export interface TtlCache<T> {
|
|
54
|
+
/**
|
|
55
|
+
* Returns the cached promise for `key` if it is still fresh, otherwise runs `fetchFn`, caches the
|
|
56
|
+
* resulting promise, and returns it. Promise-level caching collapses the burst of concurrent
|
|
57
|
+
* requests that autocomplete fires during rapid typing into a single fetch. A rejected promise is
|
|
58
|
+
* evicted so the next call retries instead of replaying a cached failure.
|
|
59
|
+
*/
|
|
60
|
+
get(key: string, fetchFn: () => Promise<T>): Promise<T>;
|
|
61
|
+
/** Drops all cached entries. */
|
|
62
|
+
clear(): void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates a module-scoped TTL cache keyed by an opaque identity string. The key MUST scope entries
|
|
66
|
+
* per authenticated user (e.g. a hash of the bearer token): in HTTP mode a single client instance
|
|
67
|
+
* serves every request, so an unkeyed cache would leak one user's data to another.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createTtlCache<T>(ttlMs?: number): TtlCache<T>;
|
|
16
70
|
export {};
|
|
17
71
|
//# sourceMappingURL=_helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../src/tools/_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,KAAK,UAAU,GAAG;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE;QACZ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH,CAAC;AAEF,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GACzD,IAAI,CAkBN;AAED,eAAO,MAAM,UAAU,aAAqE,CAAC"}
|
|
1
|
+
{"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../src/tools/_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,KAAK,UAAU,GAAG;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE;QACZ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH,CAAC;AAEF,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GACzD,IAAI,CAkBN;AAED;;2CAE2C;AAC3C,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnG,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,GAC/D,IAAI,CASN;AAED,eAAO,MAAM,UAAU,aAAqE,CAAC;AAE7F;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG1C;AAGD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAKhD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAEjD;AAOD,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxD,gCAAgC;IAChC,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,SAA4B,GAAG,QAAQ,CAAC,CAAC,CAAC,CAmBhF"}
|
package/dist/tools/_helpers.js
CHANGED
|
@@ -20,5 +20,74 @@ export function defineTool(server, name, config, fetch) {
|
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Like {@link defineTool}, but the handler returns a ready-made MCP result
|
|
25
|
+
* (content blocks) rather than a plain value. Error handling is identical:
|
|
26
|
+
* thrown errors become an `isError` text block via {@link formatError}.
|
|
27
|
+
*/
|
|
28
|
+
export function defineContentTool(server, name, config, fetch) {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
server.registerTool(name, config, async (args) => {
|
|
31
|
+
try {
|
|
32
|
+
return await fetch(args);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return { content: [{ type: 'text', text: formatError(err) }], isError: true };
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
23
39
|
export const dateSchema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be YYYY-MM-DD');
|
|
40
|
+
/**
|
|
41
|
+
* Extracts a leading numeric ID from an autocomplete label such as `"42 (Checking - asset)"`.
|
|
42
|
+
*
|
|
43
|
+
* This relies on the completion-label format (the numeric ID always comes first). When the value
|
|
44
|
+
* has no leading digits it is returned unchanged. Note that a free-typed value like `"42 Main St"`
|
|
45
|
+
* would resolve to `"42"`, so callers should prefer values picked from autocomplete suggestions
|
|
46
|
+
* rather than arbitrary user input.
|
|
47
|
+
*/
|
|
48
|
+
export function parseId(id) {
|
|
49
|
+
const match = id.match(/^(\d+)/);
|
|
50
|
+
return match ? match[1] : id;
|
|
51
|
+
}
|
|
52
|
+
// Autocomplete tuning shared by every completion handler.
|
|
53
|
+
export const AUTOCOMPLETE_FETCH_LIMIT = 1000; // max records pulled from the API per refresh
|
|
54
|
+
export const AUTOCOMPLETE_MAX_SUGGESTIONS = 100; // max labels returned to the client per keystroke
|
|
55
|
+
const AUTOCOMPLETE_CACHE_TTL_MS = 60_000; // 1 minute
|
|
56
|
+
const DEBUG_ENABLED = process.env.FIREFLY_DEBUG === 'true' || process.env.FIREFLY_DEBUG === '1';
|
|
57
|
+
/**
|
|
58
|
+
* Writes to stderr only when FIREFLY_DEBUG is set. Never touches stdout, so it is safe under the
|
|
59
|
+
* stdio transport. Used for the verbose autocomplete tracing that would otherwise fire on every
|
|
60
|
+
* keystroke (and echo user search terms) in normal operation.
|
|
61
|
+
*/
|
|
62
|
+
export function debugLog(...args) {
|
|
63
|
+
if (DEBUG_ENABLED)
|
|
64
|
+
console.error(...args);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Creates a module-scoped TTL cache keyed by an opaque identity string. The key MUST scope entries
|
|
68
|
+
* per authenticated user (e.g. a hash of the bearer token): in HTTP mode a single client instance
|
|
69
|
+
* serves every request, so an unkeyed cache would leak one user's data to another.
|
|
70
|
+
*/
|
|
71
|
+
export function createTtlCache(ttlMs = AUTOCOMPLETE_CACHE_TTL_MS) {
|
|
72
|
+
const entries = new Map();
|
|
73
|
+
return {
|
|
74
|
+
get(key, fetchFn) {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
const existing = entries.get(key);
|
|
77
|
+
if (existing && now - existing.fetchedAt <= ttlMs)
|
|
78
|
+
return existing.promise;
|
|
79
|
+
const promise = fetchFn().catch((err) => {
|
|
80
|
+
// Evict the failed promise so a later attempt re-fetches rather than caching the rejection.
|
|
81
|
+
if (entries.get(key)?.promise === promise)
|
|
82
|
+
entries.delete(key);
|
|
83
|
+
throw err;
|
|
84
|
+
});
|
|
85
|
+
entries.set(key, { promise, fetchedAt: now });
|
|
86
|
+
return promise;
|
|
87
|
+
},
|
|
88
|
+
clear() {
|
|
89
|
+
entries.clear();
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
24
93
|
//# sourceMappingURL=_helpers.js.map
|