actual-mcp-server 0.6.49 → 0.6.52
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 +5 -5
- package/dist/package.json +2 -2
- package/dist/src/config.js +1 -1
- package/dist/src/lib/constants.js +4 -2
- package/dist/src/lib/loggerFactory.js +2 -2
- package/dist/src/lib/schemas/recur.js +24 -0
- package/dist/src/tools/schedules_create.js +1 -18
- package/dist/src/tools/schedules_update.js +6 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -84,12 +84,12 @@ docker run -d \
|
|
|
84
84
|
-e ACTUAL_PASSWORD=your_password \
|
|
85
85
|
-e ACTUAL_BUDGET_SYNC_ID=your_sync_id \
|
|
86
86
|
-e MCP_SSE_AUTHORIZATION=your_secret_token \
|
|
87
|
-
-v actual-mcp-data:/data \ # required, see note below
|
|
87
|
+
-v actual-mcp-data:/app/data \ # required, see note below
|
|
88
88
|
-v actual-mcp-logs:/app/logs \
|
|
89
89
|
ghcr.io/agigante80/actual-mcp-server:latest
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
> **Why the `/data` volume is required:** Actual Budget does not expose a REST API. The official `@actual-app/api` library (used internally by this server) works by downloading a local copy of your budget data, running all queries on that local copy, then syncing changes back. The `/data` volume gives the container a persistent, writable place to store that local copy. Without it the container has nowhere to write and will fail on startup. See the [Actual API docs](https://actualbudget.org/docs/api/) for details.
|
|
92
|
+
> **Why the `/app/data` volume is required:** Actual Budget does not expose a REST API. The official `@actual-app/api` library (used internally by this server) works by downloading a local copy of your budget data, running all queries on that local copy, then syncing changes back. The `/app/data` volume gives the container a persistent, writable place to store that local copy (it is the directory the image creates and owns as the runtime user). Without it the container has nowhere to write and will fail on startup. See the [Actual API docs](https://actualbudget.org/docs/api/) for details.
|
|
93
93
|
>
|
|
94
94
|
> **actual-mcp does not need to run on the same machine as Actual Budget.** You can have Actual Budget on one server and actual-mcp on another - as long as `ACTUAL_SERVER_URL` points to your Actual Budget instance, everything works.
|
|
95
95
|
|
|
@@ -147,7 +147,7 @@ npm run build
|
|
|
147
147
|
npm run dev -- --http
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
Server starts at `http://localhost:
|
|
150
|
+
Server starts at `http://localhost:3600/http` by default (the listen port is `MCP_BRIDGE_PORT`, default `3600`).
|
|
151
151
|
|
|
152
152
|
### Option D: stdio (Claude Desktop native, no Docker or HTTP server needed)
|
|
153
153
|
|
|
@@ -429,7 +429,7 @@ All configuration is via environment variables. Copy `.env.example` to `.env` to
|
|
|
429
429
|
| `ACTUAL_BUDGET_SYNC_ID` | _(none)_ | Yes | Budget Sync ID from Actual (Settings then Sync ID) |
|
|
430
430
|
| `ACTUAL_BUDGET_PASSWORD` | _(none)_ | No | Optional encryption password for encrypted budgets |
|
|
431
431
|
| **MCP Server Settings** ||||
|
|
432
|
-
| `MCP_BRIDGE_PORT` | `
|
|
432
|
+
| `MCP_BRIDGE_PORT` | `3600` | No | Port for MCP server to listen on |
|
|
433
433
|
| `MCP_BRIDGE_BIND_HOST` | `0.0.0.0` | No | Host address to bind server to (`0.0.0.0` = all interfaces) |
|
|
434
434
|
| `MCP_BRIDGE_DATA_DIR` | `./actual-data` | No | Directory to store Actual Budget local data (SQLite). **Required to be a persistent path.** The `@actual-app/api` library downloads a local copy of your budget here to run queries; use a volume mount in Docker to persist it across restarts |
|
|
435
435
|
| `MCP_BRIDGE_PUBLIC_HOST` | auto-detected | No | Public hostname/IP for server (shown in logs) |
|
|
@@ -751,4 +751,4 @@ The software is provided **as-is**, without warranty of any kind. The author acc
|
|
|
751
751
|
|
|
752
752
|
---
|
|
753
753
|
|
|
754
|
-
**Version:** 0.6.
|
|
754
|
+
**Version:** 0.6.52 | **Tool Count:** 71 (verified LibreChat-compatible)
|
package/dist/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "actual-mcp-server",
|
|
3
3
|
"displayName": "Actual MCP Server",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.52",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.0.0",
|
|
7
7
|
"npm": ">=10.0.0"
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"verify-tools": "npm run build && node scripts/verify-tools.js",
|
|
31
31
|
"check:coverage": "node scripts/list-actual-api-methods.mjs",
|
|
32
32
|
"direct-sync": "node scripts/direct-sync/bank-sync-direct.mjs",
|
|
33
|
-
"test:unit-js": "node tests/unit/transactions_create.test.js && node tests/unit/generated_tools.smoke.test.js && node tests/unit/schema_validation.test.js && node tests/unit/config_https_validation.test.js && node tests/unit/config_insecure_upstream.test.js && node tests/unit/auth-acl.test.js && node tests/unit/bug76.test.js && node tests/unit/budgets_setAmount.test.js && node tests/unit/budgets_transfer.test.js && node tests/unit/transactions_uncategorized.test.js && node tests/unit/httpServer_session_init.test.js && node tests/unit/httpServer_session_not_found.test.js && node tests/unit/manual_mcp_client_retry.test.js && node tests/unit/manual_mcp_client_session.test.js && node tests/unit/manual_mcp_client_circuit.test.js && node tests/unit/manual_runner_killswitch.test.js && node tests/unit/adapter_auth_rate_limit.test.js && node tests/unit/adapter_session_reuse.test.js && node tests/unit/retry_classifier.test.js && node tests/unit/adapter_module_surface.test.js && node tests/unit/adapter_nonidempotent_no_retry.test.js && node tests/unit/pool_liveness.test.js && node tests/unit/pool_shutdown_all.test.js && node tests/unit/query_where_operators.test.js && node tests/unit/query_run_validation.test.js && node tests/unit/adapter_with_write_session.test.js && node tests/unit/category_groups_delete.test.js && node tests/unit/rules_delete.test.js && node tests/unit/schedules_delete.test.js && node tests/unit/payees_delete.test.js && node tests/unit/rules_create_or_update.test.js && node tests/unit/unhandled-rejection.test.js && node tests/unit/rejection-allowlist-purity.test.js && node tests/unit/httpServer_bearer_auth.test.js && node tests/unit/httpServer_oidc_audience.test.js && node tests/unit/httpServer_oidc_auth_verification.test.js && node tests/unit/httpServer_body_limit.test.js && node tests/unit/adapter_write_pool_cooperation.test.js && node tests/unit/budget_acl_enforcement.test.js && node tests/unit/budget_preference_store.test.js && node tests/unit/budget_preference_restore.test.js && node tests/unit/tags_list.test.js && node tests/unit/tags_create.test.js && node tests/unit/tags_update.test.js && node tests/unit/tags_delete.test.js && node tests/unit/notes_get.test.js && node tests/unit/notes_update.test.js && node tests/unit/payees_common_list.test.js && node tests/unit/transactions_update_guard.test.js && node tests/unit/entities_search.test.js && node tests/unit/transactions_import_schema.test.js && node tests/unit/tool_schema_shape.test.js && node tests/unit/zod_error_format.test.js && node tests/unit/tool_count_sync.test.js && node tests/unit/stdio_transport.test.js && node tests/unit/logger_structured.test.js && node tests/unit/logger_redaction.test.js && node tests/unit/logger_correlation.test.js && node tests/unit/check_coverage.test.js",
|
|
33
|
+
"test:unit-js": "node tests/unit/transactions_create.test.js && node tests/unit/generated_tools.smoke.test.js && node tests/unit/schema_validation.test.js && node tests/unit/config_https_validation.test.js && node tests/unit/config_data_dir.test.js && node tests/unit/port_alignment.test.js && node tests/unit/dockerfile_data_dir_alignment.test.js && node tests/unit/config_insecure_upstream.test.js && node tests/unit/auth-acl.test.js && node tests/unit/bug76.test.js && node tests/unit/budgets_setAmount.test.js && node tests/unit/budgets_transfer.test.js && node tests/unit/transactions_uncategorized.test.js && node tests/unit/httpServer_session_init.test.js && node tests/unit/httpServer_session_not_found.test.js && node tests/unit/manual_mcp_client_retry.test.js && node tests/unit/manual_mcp_client_session.test.js && node tests/unit/manual_mcp_client_circuit.test.js && node tests/unit/manual_runner_killswitch.test.js && node tests/unit/adapter_auth_rate_limit.test.js && node tests/unit/adapter_session_reuse.test.js && node tests/unit/retry_classifier.test.js && node tests/unit/adapter_module_surface.test.js && node tests/unit/adapter_nonidempotent_no_retry.test.js && node tests/unit/pool_liveness.test.js && node tests/unit/pool_shutdown_all.test.js && node tests/unit/query_where_operators.test.js && node tests/unit/query_run_validation.test.js && node tests/unit/adapter_with_write_session.test.js && node tests/unit/category_groups_delete.test.js && node tests/unit/rules_delete.test.js && node tests/unit/schedules_delete.test.js && node tests/unit/payees_delete.test.js && node tests/unit/rules_create_or_update.test.js && node tests/unit/unhandled-rejection.test.js && node tests/unit/rejection-allowlist-purity.test.js && node tests/unit/httpServer_bearer_auth.test.js && node tests/unit/httpServer_oidc_audience.test.js && node tests/unit/httpServer_oidc_auth_verification.test.js && node tests/unit/httpServer_body_limit.test.js && node tests/unit/adapter_write_pool_cooperation.test.js && node tests/unit/budget_acl_enforcement.test.js && node tests/unit/budget_preference_store.test.js && node tests/unit/budget_preference_restore.test.js && node tests/unit/tags_list.test.js && node tests/unit/tags_create.test.js && node tests/unit/tags_update.test.js && node tests/unit/tags_delete.test.js && node tests/unit/notes_get.test.js && node tests/unit/notes_update.test.js && node tests/unit/payees_common_list.test.js && node tests/unit/transactions_update_guard.test.js && node tests/unit/entities_search.test.js && node tests/unit/transactions_import_schema.test.js && node tests/unit/tool_schema_shape.test.js && node tests/unit/zod_error_format.test.js && node tests/unit/tool_count_sync.test.js && node tests/unit/stdio_transport.test.js && node tests/unit/logger_structured.test.js && node tests/unit/logger_redaction.test.js && node tests/unit/logger_correlation.test.js && node tests/unit/check_coverage.test.js",
|
|
34
34
|
"test:adapter": "npm run build && node dist/src/tests_adapter_runner.js",
|
|
35
35
|
"test:e2e": "npx playwright test",
|
|
36
36
|
"test:e2e:docker": "./tests/e2e/run-docker-e2e.sh",
|
package/dist/src/config.js
CHANGED
|
@@ -10,7 +10,7 @@ export const configSchema = z.object({
|
|
|
10
10
|
// Off by default so a plaintext upstream + encryption password is refused.
|
|
11
11
|
ALLOW_INSECURE_UPSTREAM: z.string().optional().transform(val => val === 'true'),
|
|
12
12
|
MCP_BRIDGE_DATA_DIR: z.string().default('./actual-data'),
|
|
13
|
-
MCP_BRIDGE_PORT: z.string().default('
|
|
13
|
+
MCP_BRIDGE_PORT: z.string().default('3600'),
|
|
14
14
|
MCP_TRANSPORT_MODE: z.enum(['--http']).default('--http'),
|
|
15
15
|
MCP_SSE_AUTHORIZATION: z.string().optional(),
|
|
16
16
|
MCP_ENABLE_HTTPS: z.string().optional().transform(val => val === 'true'),
|
|
@@ -62,9 +62,11 @@ export const WRITE_SESSION_DELAY_MS = 100;
|
|
|
62
62
|
*/
|
|
63
63
|
export const DEFAULT_BIND_HOST = 'localhost';
|
|
64
64
|
/**
|
|
65
|
-
* Default HTTP port for MCP server
|
|
65
|
+
* Default HTTP port for MCP server. Canonical default is 3600 (#230): it matches
|
|
66
|
+
* the listen-port fallback in src/index.ts, the Dockerfile EXPOSE/HEALTHCHECK, the
|
|
67
|
+
* published image, .env.example, and every deployment guide.
|
|
66
68
|
*/
|
|
67
|
-
export const DEFAULT_HTTP_PORT =
|
|
69
|
+
export const DEFAULT_HTTP_PORT = 3600;
|
|
68
70
|
/**
|
|
69
71
|
* Default HTTP path for MCP server endpoint
|
|
70
72
|
*/
|
|
@@ -17,8 +17,8 @@ import logger from '../logger.js';
|
|
|
17
17
|
* import { createModuleLogger } from '../lib/loggerFactory.js';
|
|
18
18
|
*
|
|
19
19
|
* const log = createModuleLogger('HTTP');
|
|
20
|
-
* log.info('Server started', { port:
|
|
21
|
-
* // Output: [HTTP] Server started { port:
|
|
20
|
+
* log.info('Server started', { port: 3600 });
|
|
21
|
+
* // Output: [HTTP] Server started { port: 3600 }
|
|
22
22
|
*
|
|
23
23
|
* log.error('Connection failed', new Error('Timeout'), { retries: 3 });
|
|
24
24
|
* // Output: [HTTP] Connection failed { error: 'Timeout', stack: '...', retries: 3 }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// Shared recurrence-config schema for Actual schedules. Used by both actual_schedules_create
|
|
3
|
+
// and actual_schedules_update so the two tools agree on the same shape and publish a typed
|
|
4
|
+
// `date` branch in tools/list (#225). This mirrors the config Actual's `@actual-app/api`
|
|
5
|
+
// accepts for a recurring schedule; it is a closed object so a malformed config gets an
|
|
6
|
+
// actionable validation error rather than being forwarded unshaped.
|
|
7
|
+
export const RecurConfigSchema = z.object({
|
|
8
|
+
frequency: z.enum(['daily', 'weekly', 'monthly', 'yearly'])
|
|
9
|
+
.describe('How often the schedule repeats'),
|
|
10
|
+
start: z.string().regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
11
|
+
.describe('Start date in YYYY-MM-DD format'),
|
|
12
|
+
endMode: z.enum(['never', 'after_n_occurrences', 'on_date'])
|
|
13
|
+
.describe('When the schedule stops: never, after N occurrences, or on a specific date'),
|
|
14
|
+
interval: z.number().int().positive().optional()
|
|
15
|
+
.describe('Every N periods. Default: 1 (every period)'),
|
|
16
|
+
skipWeekend: z.boolean().optional()
|
|
17
|
+
.describe('If true, occurrence is moved when it falls on a weekend'),
|
|
18
|
+
weekendSolveMode: z.enum(['before', 'after']).optional()
|
|
19
|
+
.describe('Move to Friday before or Monday after the weekend. Requires skipWeekend: true'),
|
|
20
|
+
endOccurrences: z.number().int().positive().optional()
|
|
21
|
+
.describe('Number of occurrences before stopping. Required when endMode is after_n_occurrences'),
|
|
22
|
+
endDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional()
|
|
23
|
+
.describe('Date (YYYY-MM-DD) after which the schedule stops. Required when endMode is on_date'),
|
|
24
|
+
});
|
|
@@ -1,24 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import adapter from '../lib/actual-adapter.js';
|
|
3
3
|
import { UUID_PATTERN } from '../lib/constants.js';
|
|
4
|
-
|
|
5
|
-
frequency: z.enum(['daily', 'weekly', 'monthly', 'yearly'])
|
|
6
|
-
.describe('How often the schedule repeats'),
|
|
7
|
-
start: z.string().regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
8
|
-
.describe('Start date in YYYY-MM-DD format'),
|
|
9
|
-
endMode: z.enum(['never', 'after_n_occurrences', 'on_date'])
|
|
10
|
-
.describe('When the schedule stops: never, after N occurrences, or on a specific date'),
|
|
11
|
-
interval: z.number().int().positive().optional()
|
|
12
|
-
.describe('Every N periods. Default: 1 (every period)'),
|
|
13
|
-
skipWeekend: z.boolean().optional()
|
|
14
|
-
.describe('If true, occurrence is moved when it falls on a weekend'),
|
|
15
|
-
weekendSolveMode: z.enum(['before', 'after']).optional()
|
|
16
|
-
.describe('Move to Friday before or Monday after the weekend. Requires skipWeekend: true'),
|
|
17
|
-
endOccurrences: z.number().int().positive().optional()
|
|
18
|
-
.describe('Number of occurrences before stopping. Required when endMode is after_n_occurrences'),
|
|
19
|
-
endDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional()
|
|
20
|
-
.describe('Date (YYYY-MM-DD) after which the schedule stops. Required when endMode is on_date'),
|
|
21
|
-
});
|
|
4
|
+
import { RecurConfigSchema } from '../lib/schemas/recur.js';
|
|
22
5
|
const InputSchema = z.object({
|
|
23
6
|
name: z.string().optional()
|
|
24
7
|
.describe('Unique display name for the schedule'),
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import adapter from '../lib/actual-adapter.js';
|
|
3
3
|
import { UUID_PATTERN } from '../lib/constants.js';
|
|
4
|
+
import { RecurConfigSchema } from '../lib/schemas/recur.js';
|
|
4
5
|
const InputSchema = z.object({
|
|
5
6
|
id: z.string().regex(UUID_PATTERN, 'Invalid UUID format')
|
|
6
7
|
.describe('UUID of the schedule to update (from actual_schedules_get)'),
|
|
@@ -15,10 +16,12 @@ const InputSchema = z.object({
|
|
|
15
16
|
amountOp: z.enum(['is', 'isapprox', 'isbetween']).optional()
|
|
16
17
|
.describe('How to match the amount'),
|
|
17
18
|
date: z.union([
|
|
18
|
-
z.string().regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
19
|
-
|
|
19
|
+
z.string().regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
20
|
+
.describe('YYYY-MM-DD: one-off schedule on this specific date'),
|
|
21
|
+
RecurConfigSchema
|
|
22
|
+
.describe('RecurConfig object (frequency, start, endMode, ...): recurring schedule'),
|
|
20
23
|
]).optional()
|
|
21
|
-
.describe('New date string (YYYY-MM-DD) or RecurConfig object'),
|
|
24
|
+
.describe('New date string (YYYY-MM-DD) or RecurConfig object. Set resetNextDate: true when changing this.'),
|
|
22
25
|
posts_transaction: z.boolean().optional()
|
|
23
26
|
.describe('Whether Actual auto-posts a transaction on each occurrence'),
|
|
24
27
|
completed: z.boolean().optional()
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "actual-mcp-server",
|
|
3
3
|
"displayName": "Actual MCP Server",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.52",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.0.0",
|
|
7
7
|
"npm": ">=10.0.0"
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"verify-tools": "npm run build && node scripts/verify-tools.js",
|
|
31
31
|
"check:coverage": "node scripts/list-actual-api-methods.mjs",
|
|
32
32
|
"direct-sync": "node scripts/direct-sync/bank-sync-direct.mjs",
|
|
33
|
-
"test:unit-js": "node tests/unit/transactions_create.test.js && node tests/unit/generated_tools.smoke.test.js && node tests/unit/schema_validation.test.js && node tests/unit/config_https_validation.test.js && node tests/unit/config_insecure_upstream.test.js && node tests/unit/auth-acl.test.js && node tests/unit/bug76.test.js && node tests/unit/budgets_setAmount.test.js && node tests/unit/budgets_transfer.test.js && node tests/unit/transactions_uncategorized.test.js && node tests/unit/httpServer_session_init.test.js && node tests/unit/httpServer_session_not_found.test.js && node tests/unit/manual_mcp_client_retry.test.js && node tests/unit/manual_mcp_client_session.test.js && node tests/unit/manual_mcp_client_circuit.test.js && node tests/unit/manual_runner_killswitch.test.js && node tests/unit/adapter_auth_rate_limit.test.js && node tests/unit/adapter_session_reuse.test.js && node tests/unit/retry_classifier.test.js && node tests/unit/adapter_module_surface.test.js && node tests/unit/adapter_nonidempotent_no_retry.test.js && node tests/unit/pool_liveness.test.js && node tests/unit/pool_shutdown_all.test.js && node tests/unit/query_where_operators.test.js && node tests/unit/query_run_validation.test.js && node tests/unit/adapter_with_write_session.test.js && node tests/unit/category_groups_delete.test.js && node tests/unit/rules_delete.test.js && node tests/unit/schedules_delete.test.js && node tests/unit/payees_delete.test.js && node tests/unit/rules_create_or_update.test.js && node tests/unit/unhandled-rejection.test.js && node tests/unit/rejection-allowlist-purity.test.js && node tests/unit/httpServer_bearer_auth.test.js && node tests/unit/httpServer_oidc_audience.test.js && node tests/unit/httpServer_oidc_auth_verification.test.js && node tests/unit/httpServer_body_limit.test.js && node tests/unit/adapter_write_pool_cooperation.test.js && node tests/unit/budget_acl_enforcement.test.js && node tests/unit/budget_preference_store.test.js && node tests/unit/budget_preference_restore.test.js && node tests/unit/tags_list.test.js && node tests/unit/tags_create.test.js && node tests/unit/tags_update.test.js && node tests/unit/tags_delete.test.js && node tests/unit/notes_get.test.js && node tests/unit/notes_update.test.js && node tests/unit/payees_common_list.test.js && node tests/unit/transactions_update_guard.test.js && node tests/unit/entities_search.test.js && node tests/unit/transactions_import_schema.test.js && node tests/unit/tool_schema_shape.test.js && node tests/unit/zod_error_format.test.js && node tests/unit/tool_count_sync.test.js && node tests/unit/stdio_transport.test.js && node tests/unit/logger_structured.test.js && node tests/unit/logger_redaction.test.js && node tests/unit/logger_correlation.test.js && node tests/unit/check_coverage.test.js",
|
|
33
|
+
"test:unit-js": "node tests/unit/transactions_create.test.js && node tests/unit/generated_tools.smoke.test.js && node tests/unit/schema_validation.test.js && node tests/unit/config_https_validation.test.js && node tests/unit/config_data_dir.test.js && node tests/unit/port_alignment.test.js && node tests/unit/dockerfile_data_dir_alignment.test.js && node tests/unit/config_insecure_upstream.test.js && node tests/unit/auth-acl.test.js && node tests/unit/bug76.test.js && node tests/unit/budgets_setAmount.test.js && node tests/unit/budgets_transfer.test.js && node tests/unit/transactions_uncategorized.test.js && node tests/unit/httpServer_session_init.test.js && node tests/unit/httpServer_session_not_found.test.js && node tests/unit/manual_mcp_client_retry.test.js && node tests/unit/manual_mcp_client_session.test.js && node tests/unit/manual_mcp_client_circuit.test.js && node tests/unit/manual_runner_killswitch.test.js && node tests/unit/adapter_auth_rate_limit.test.js && node tests/unit/adapter_session_reuse.test.js && node tests/unit/retry_classifier.test.js && node tests/unit/adapter_module_surface.test.js && node tests/unit/adapter_nonidempotent_no_retry.test.js && node tests/unit/pool_liveness.test.js && node tests/unit/pool_shutdown_all.test.js && node tests/unit/query_where_operators.test.js && node tests/unit/query_run_validation.test.js && node tests/unit/adapter_with_write_session.test.js && node tests/unit/category_groups_delete.test.js && node tests/unit/rules_delete.test.js && node tests/unit/schedules_delete.test.js && node tests/unit/payees_delete.test.js && node tests/unit/rules_create_or_update.test.js && node tests/unit/unhandled-rejection.test.js && node tests/unit/rejection-allowlist-purity.test.js && node tests/unit/httpServer_bearer_auth.test.js && node tests/unit/httpServer_oidc_audience.test.js && node tests/unit/httpServer_oidc_auth_verification.test.js && node tests/unit/httpServer_body_limit.test.js && node tests/unit/adapter_write_pool_cooperation.test.js && node tests/unit/budget_acl_enforcement.test.js && node tests/unit/budget_preference_store.test.js && node tests/unit/budget_preference_restore.test.js && node tests/unit/tags_list.test.js && node tests/unit/tags_create.test.js && node tests/unit/tags_update.test.js && node tests/unit/tags_delete.test.js && node tests/unit/notes_get.test.js && node tests/unit/notes_update.test.js && node tests/unit/payees_common_list.test.js && node tests/unit/transactions_update_guard.test.js && node tests/unit/entities_search.test.js && node tests/unit/transactions_import_schema.test.js && node tests/unit/tool_schema_shape.test.js && node tests/unit/zod_error_format.test.js && node tests/unit/tool_count_sync.test.js && node tests/unit/stdio_transport.test.js && node tests/unit/logger_structured.test.js && node tests/unit/logger_redaction.test.js && node tests/unit/logger_correlation.test.js && node tests/unit/check_coverage.test.js",
|
|
34
34
|
"test:adapter": "npm run build && node dist/src/tests_adapter_runner.js",
|
|
35
35
|
"test:e2e": "npx playwright test",
|
|
36
36
|
"test:e2e:docker": "./tests/e2e/run-docker-e2e.sh",
|