@dizzlkheinz/ynab-mcpb 0.13.1 → 0.15.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/.code/agents/01a13ef4-3f23-4f52-b33b-3585b73cfa60/error.txt +3 -0
- package/.code/agents/084fd32f-e298-4728-9103-a78d7dc39613/error.txt +3 -0
- package/.code/agents/0fed51e1-a943-4b97-a2a8-a6f0f27c844d/status.txt +1 -0
- package/.code/agents/1059b6bd-5ccd-4d83-a12c-7c9d89137399/error.txt +5 -0
- package/.code/agents/110/exec-call_F9BDNG7JfxKkq7Vc8ESAvdft.txt +1569 -0
- package/.code/agents/11ebcef3-b13f-4e44-ad80-d94a866804b7/error.txt +3 -0
- package/.code/agents/1398/exec-call_CjItcWMU1G6JoPshX62QvpaR.txt +2832 -0
- package/.code/agents/1398/exec-call_SUVq2ivmONQ5LMCmd7ngmOqr.txt +2709 -0
- package/.code/agents/1398/exec-call_SdNY4NOffdcC5pRYjVXHjPCK.txt +2832 -0
- package/.code/agents/1398/exec-call_qblJo9et1gsFFB63TtLOiji2.txt +2832 -0
- package/.code/agents/1398/exec-call_zaRrzlGz7GJcNzVfkAmML7Zg.txt +2709 -0
- package/.code/agents/171834fd-5905-42fc-bbcc-2c755145b0fc/status.txt +1 -0
- package/.code/agents/1724/exec-call_HvHQe0w5CCG3T7Q3ULT6MO3g.txt +5217 -0
- package/.code/agents/1724/exec-call_QwUNESVzfxxk78K1frh1Vahb.txt +2594 -0
- package/.code/agents/1724/exec-call_aJ1Xwz71XmIpD4SBxSHERzLe.txt +2594 -0
- package/.code/agents/1d7d7ab7-7473-4b69-8b97-6e914f56056a/result.txt +231 -0
- package/.code/agents/210/exec-call_0tQCsKNJ1WTuIchb8wlcFJpW.txt +2590 -0
- package/.code/agents/210/exec-call_8ZlY9cUc8Ft1twi4ch8UJ6IN.txt +5195 -0
- package/.code/agents/2188/exec-call_5HqayBxIteJtoI8oPTiLWgvJ.txt +286 -0
- package/.code/agents/2188/exec-call_XRbBKBq3adZe6dcppAvQtM7G.txt +218 -0
- package/.code/agents/2188/exec-call_ehA0SjpYtrUi6GJXmibLjp4i.txt +180 -0
- package/.code/agents/21902821-ecaf-4759-bb9d-222b90921af5/error.txt +3 -0
- package/.code/agents/232073be-aa0e-46da-b478-5b64dbf03cf5/status.txt +1 -0
- package/.code/agents/234ff534-2336-4771-a8d9-aa04421a63be/result.txt +747 -0
- package/.code/agents/253e2695-dc36-4022-b436-27655e0fc6c7/status.txt +1 -0
- package/.code/agents/2583/exec-call_M59I4eDjpjlBIWBiSxyS0YlJ.txt +2594 -0
- package/.code/agents/2583/exec-call_usLRGh7OhVHtsRBL4iUwRhjq.txt +2594 -0
- package/.code/agents/292aa3ff-dbab-470f-97c9-e7e8fd65e0db/result.txt +144 -0
- package/.code/agents/3134/exec-call_IgCAMGx19lWfuo8zfYIt5FFC.txt +416 -0
- package/.code/agents/3134/exec-call_IxvLR2Oo7kba2QTsI1gHVko8.txt +2590 -0
- package/.code/agents/3134/exec-call_jYvc8hksZChSiysbzKjl2ZbB.txt +2590 -0
- package/.code/agents/329/exec-call_4QdP3SfSO7HGPCwVcqZIth6s.txt +2590 -0
- package/.code/agents/472/exec-call_4AxzEEcWwkKhpqRB3bE8Ha4L.txt +790 -0
- package/.code/agents/472/exec-call_CB3LPYQA8QIZRi8I6kj4J17A.txt +766 -0
- package/.code/agents/472/exec-call_YeoUWvaFoktay2nqVUsa9KKX.txt +790 -0
- package/.code/agents/472/exec-call_jPWgKVquBBXTg0T3Lks5ZfkK.txt +2594 -0
- package/.code/agents/472/exec-call_qBkvunpGBDEHph2jPmTwtcsb.txt +1000 -0
- package/.code/agents/472/exec-call_v0ffRV1p0kTckBmJPzzHAEy0.txt +3489 -0
- package/.code/agents/472/exec-call_xAX5FXqWIlk02d9WubHbHWh8.txt +766 -0
- package/.code/agents/5346/exec-call_9q0muXUuLaucwEqI51Pt7idT.txt +2594 -0
- package/.code/agents/5346/exec-call_B2el3B79rVkq9LhWTI2VYlz7.txt +2456 -0
- package/.code/agents/5346/exec-call_BfX08f02qkZI9uJD5dvCvuoj.txt +2594 -0
- package/.code/agents/543328d0-61d6-4fd1-a723-bb168656e2e2/error.txt +18 -0
- package/.code/agents/5580c02c-1383-4d18-9cbd-cc8a06e3408d/result.txt +48 -0
- package/.code/agents/60ce1a22-5126-44b2-b977-1d5b56142a7b/status.txt +1 -0
- package/.code/agents/6215d9db-7fa9-4429-aeec-3835c3212291/error.txt +1 -0
- package/.code/agents/6743db55-30e5-4b4e-9366-a8214fc7f714/error.txt +1 -0
- package/.code/agents/6bf9591b-b9c9-422c-b0a5-e968c7d8422a/status.txt +1 -0
- package/.code/agents/7/exec-call_eww3GfdEiJZx61sJEQ9wNmt3.txt +1271 -0
- package/.code/agents/70/exec-call_owUtDMYiVgqDf8vsz1i32PFf.txt +1570 -0
- package/.code/agents/8/exec-call_UtrjAcLbhYLatxR4O97fZgnm.txt +2590 -0
- package/.code/agents/82490bc9-f34e-4b1b-8a8e-bccc2e6254f5/error.txt +3 -0
- package/.code/agents/841/exec-call_7nTNhSBCNjTDUIJv7py6CepO.txt +3299 -0
- package/.code/agents/841/exec-call_TLI0yUdUijuUAvI4o3DXEvHO.txt +3299 -0
- package/.code/agents/9/exec-call_XaABQT1hIlRpnKZ2uyBMWsTC.txt +1882 -0
- package/.code/agents/941/exec-call_GuGHRx7NNXWIDAnxUG2NEWPa.txt +2594 -0
- package/.code/agents/95d9fbab-19a2-48af-83f9-c792566a347f/error.txt +1 -0
- package/.code/agents/b0098cb8-cb32-4ada-9bc4-37c587518896/result.txt +170 -0
- package/.code/agents/b4fe59a4-81df-42e2-a112-0153e504faca/error.txt +1 -0
- package/.code/agents/bf4ce152-f623-49d7-aa52-c18631625c3c/error.txt +3 -0
- package/.code/agents/d7d1db75-d7eb-468e-adea-4ef4d916d187/status.txt +1 -0
- package/.code/agents/e2baa9c8-bac3-49e3-a39d-024333e6a990/status.txt +1 -0
- package/.code/agents/e350b8c3-8483-408c-b2bb-94515f492a11/error.txt +3 -0
- package/.code/agents/e63f9919-719f-4ad0-bccf-01b1a596e1e9/status.txt +1 -0
- package/.code/agents/e71695a8-3044-478d-8f12-ed13d02884c7/status.txt +1 -0
- package/.code/agents/f95b7464-3e25-4897-b153-c8dfd63fd605/error.txt +5 -0
- package/.code/agents/fa3c5ddf-cdf7-47a2-930a-b806c6363689/status.txt +1 -0
- package/.github/workflows/publish.yml +3 -3
- package/.github/workflows/release.yml +4 -0
- package/CHANGELOG.md +75 -0
- package/NUL +1 -0
- package/dist/bundle/index.cjs +65 -42
- package/dist/server/errorHandler.d.ts +2 -0
- package/dist/server/errorHandler.js +49 -5
- package/dist/tools/reconcileAdapter.js +10 -5
- package/dist/tools/reconciliation/analyzer.d.ts +8 -2
- package/dist/tools/reconciliation/analyzer.js +127 -409
- package/dist/tools/reconciliation/csvParser.d.ts +51 -0
- package/dist/tools/reconciliation/csvParser.js +413 -0
- package/dist/tools/reconciliation/executor.d.ts +8 -0
- package/dist/tools/reconciliation/executor.js +204 -58
- package/dist/tools/reconciliation/index.d.ts +7 -7
- package/dist/tools/reconciliation/index.js +115 -39
- package/dist/tools/reconciliation/matcher.d.ts +24 -3
- package/dist/tools/reconciliation/matcher.js +175 -133
- package/dist/tools/reconciliation/recommendationEngine.js +22 -18
- package/dist/tools/reconciliation/reportFormatter.js +9 -8
- package/dist/tools/reconciliation/signDetector.d.ts +2 -0
- package/dist/tools/reconciliation/signDetector.js +54 -0
- package/dist/tools/reconciliation/types.d.ts +20 -34
- package/dist/tools/reconciliation/types.js +1 -7
- package/dist/tools/reconciliation/ynabAdapter.d.ts +4 -0
- package/dist/tools/reconciliation/ynabAdapter.js +15 -0
- package/dist/types/reconciliation.d.ts +24 -0
- package/dist/types/reconciliation.js +1 -0
- package/docs/guides/ARCHITECTURE.md +12 -129
- package/docs/plans/2025-11-21-v014-hardening.md +153 -0
- package/docs/plans/reconciliation-v2-redesign.md +1571 -0
- package/package.json +6 -1
- package/scripts/test-recommendations.ts +1 -1
- package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +129 -0
- package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +53 -0
- package/src/server/errorHandler.ts +52 -5
- package/src/tools/reconcileAdapter.ts +10 -5
- package/src/tools/reconciliation/__tests__/adapter.test.ts +28 -22
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +114 -180
- package/src/tools/reconciliation/__tests__/csvParser.test.ts +87 -0
- package/src/tools/reconciliation/__tests__/executor.integration.test.ts +1 -1
- package/src/tools/reconciliation/__tests__/executor.test.ts +88 -61
- package/src/tools/reconciliation/__tests__/matcher.test.ts +68 -54
- package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +37 -30
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +6 -5
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +30 -11
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +50 -15
- package/src/tools/reconciliation/__tests__/signDetector.test.ts +211 -0
- package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +61 -0
- package/src/tools/reconciliation/analyzer.ts +191 -550
- package/src/tools/reconciliation/csvParser.ts +617 -0
- package/src/tools/reconciliation/executor.ts +249 -66
- package/src/tools/reconciliation/index.ts +148 -54
- package/src/tools/reconciliation/matcher.ts +234 -214
- package/src/tools/reconciliation/recommendationEngine.ts +23 -19
- package/src/tools/reconciliation/reportFormatter.ts +16 -11
- package/src/tools/reconciliation/signDetector.ts +117 -0
- package/src/tools/reconciliation/types.ts +39 -61
- package/src/tools/reconciliation/ynabAdapter.ts +33 -0
- package/src/types/reconciliation.ts +49 -0
- package/test-exports/ynab_since_2025-10-16_account_53298e13_238items_2025-11-28_13-46-20.json +3662 -0
- package/.code/agents/0427d95e-edca-431f-a214-5e53264e29c4/error.txt +0 -8
- package/.code/agents/0d675174-d1e1-41c3-9975-4c2e275819a9/error.txt +0 -3
- package/.code/agents/0d8c5afd-4787-422b-abf8-2e5943fc7e67/error.txt +0 -3
- package/.code/agents/0ec34a70-ed5d-4b9e-bee4-bb0e4cccbc4b/error.txt +0 -1
- package/.code/agents/0ef51a21-1ab1-49d7-9561-0eaa43875ebc/error.txt +0 -12
- package/.code/agents/15db95d7-abad-4b4d-9c3b-8446089cb61d/error.txt +0 -1
- package/.code/agents/19ab9acb-f675-4ff0-902a-09a5476f8149/error.txt +0 -1
- package/.code/agents/1ef7e12d-f6ff-4897-8a9b-152d523d898e/error.txt +0 -5
- package/.code/agents/2465/exec-call_lroN9KKzJVWC7t5423DK1nT9.txt +0 -1453
- package/.code/agents/28edb6fe-95a9-41a0-ae69-aa0100d26c0c/error.txt +0 -8
- package/.code/agents/2ae40cf5-b4bf-42e2-92bf-7ea350a7755e/error.txt +0 -9
- package/.code/agents/2bfc4e1f-ac4b-45a5-b6df-bf89d4dbb54c/error.txt +0 -1
- package/.code/agents/2e2e1134-eff0-49be-ba25-8e2c3468a564/error.txt +0 -5
- package/.code/agents/3/exec-call_203OC4TNVkLxW7z2HCVEQ1cM.txt +0 -81
- package/.code/agents/3/exec-call_SS5T0XSiXB4LSNzUKTl75wkh.txt +0 -610
- package/.code/agents/3322c003-ce5e-48e3-a342-f5049c5bf9a2/error.txt +0 -1
- package/.code/agents/391e9b08-1ebc-468c-9bcd-6d0cc3193b37/error.txt +0 -1
- package/.code/agents/3ab0aa84-b7bb-4054-afa3-40b8fd7d3be0/error.txt +0 -1
- package/.code/agents/3bed368d-50fe-477e-aee3-a6707eaa1ab9/error.txt +0 -3
- package/.code/agents/3e40b925-db12-442f-8d7a-a25fc69a6672/error.txt +0 -8
- package/.code/agents/414d5776-cf58-41f3-9328-a6daed503a50/error.txt +0 -5
- package/.code/agents/42687751-4565-4610-b240-67835b17d861/error.txt +0 -1
- package/.code/agents/46b98876-1a39-43c9-9e2f-507ca6d47335/error.txt +0 -9
- package/.code/agents/4a7d9491-b26f-43dd-850d-2ecdc49b5d1b/error.txt +0 -1
- package/.code/agents/4e60f00a-1b3e-447f-87f3-7faf9deddec3/error.txt +0 -13
- package/.code/agents/5138fc1c-4d49-4b74-a7da-ccdb3a8e44e7/error.txt +0 -14
- package/.code/agents/521cff39-a7a3-42e5-a557-134f0f7daaa0/error.txt +0 -5
- package/.code/agents/53302dc5-3857-4413-9a47-9e0f64a51dc4/error.txt +0 -5
- package/.code/agents/567c7c2e-6a6f-4761-a08d-d36deeb2e0ac/error.txt +0 -5
- package/.code/agents/57b00845-80dc-47c9-953c-3028d16275d6/error.txt +0 -3
- package/.code/agents/593d9005-c2a5-48fd-8813-ece0d3f2de96/error.txt +0 -1
- package/.code/agents/5a112e66-0e1a-42f9-877c-53af56ea3551/error.txt +0 -1
- package/.code/agents/5b05e8ed-7788-4738-b7ee-9faa8180f992/error.txt +0 -5
- package/.code/agents/5f888d6f-d7ca-4ac8-be23-9ea1bf753951/error.txt +0 -5
- package/.code/agents/607db3ab-e4b0-435b-b497-93e9aa525549/error.txt +0 -8
- package/.code/agents/67dcb2a2-900f-4c78-b3fc-80b5213e0ddf/error.txt +0 -8
- package/.code/agents/69ad848c-4e98-49b3-b16c-0094ac2d1759/error.txt +0 -5
- package/.code/agents/6c9cfc5f-0d0b-445c-b121-9f60082c4f70/error.txt +0 -1
- package/.code/agents/6f6f8f77-4ab0-4f6e-9f30-40e8be0bd8f5/error.txt +0 -1
- package/.code/agents/72a7cde4-fa8a-4024-9038-27faa550539b/error.txt +0 -1
- package/.code/agents/7b48335c-8247-43aa-9949-5f820ba8e199/error.txt +0 -1
- package/.code/agents/80944249-bea9-4ac5-87de-a666c4df306e/error.txt +0 -1
- package/.code/agents/826099df-1b66-4186-a915-7eb59f9db19d/error.txt +0 -5
- package/.code/agents/8291d158-18a8-4a92-b799-4e9a4d9cce88/error.txt +0 -1
- package/.code/agents/82fb71a3-20fb-4341-804a-a2fc900f95bc/error.txt +0 -1
- package/.code/agents/855790ea-54ee-43e4-8209-a66994e37590/error.txt +0 -1
- package/.code/agents/88ce3a2e-04f2-42be-9062-bf97aa798da0/error.txt +0 -3
- package/.code/agents/9a17e398-b6ed-4218-bb55-bc64a8d38ce8/error.txt +0 -8
- package/.code/agents/9a4f4bfc-a2a6-4f40-a896-9335b41a7ed1/error.txt +0 -1
- package/.code/agents/9b633e55-ef84-47d6-94bb-fd3dd172ad97/error.txt +0 -1
- package/.code/agents/9b81f3ab-c72b-4a81-9a8f-28a49ddba84a/error.txt +0 -8
- package/.code/agents/a35daf29-b2d1-4aef-9b42-dad63a76bd47/error.txt +0 -3
- package/.code/agents/a81990cc-69ee-44d2-b907-17403c9bc5d7/error.txt +0 -5
- package/.code/agents/ab56260a-4a83-4ad4-9410-f88a23d6520a/error.txt +0 -1
- package/.code/agents/ad722c31-2d1d-45f7-bae2-3f02ca455b60/error.txt +0 -1
- package/.code/agents/b62e8690-3324-4b97-9309-731bee79416b/error.txt +0 -5
- package/.code/agents/baf60a3a-752b-4ad8-99d6-df32423ed2eb/error.txt +0 -1
- package/.code/agents/be049042-7dcb-4ac8-9beb-c8f1aea67742/error.txt +0 -14
- package/.code/agents/bed1dcb4-bfce-4a9f-8594-0f994962aafd/error.txt +0 -1
- package/.code/agents/c324a6cf-e935-4ede-9529-b3ebc18e8d6b/error.txt +0 -5
- package/.code/agents/c37c06ff-dfe3-43f2-9bbc-3ec73ec8f41d/error.txt +0 -5
- package/.code/agents/c8cd6671-433a-456b-9f88-e51cb2df6bfc/error.txt +0 -11
- package/.code/agents/ca2ccb67-2f24-428e-b27d-9365beadd140/error.txt +0 -1
- package/.code/agents/cf08c0c8-e7f0-423e-93ba-547e8e818340/error.txt +0 -8
- package/.code/agents/d579c74f-874b-40a4-9d56-ced1eb6a701d/error.txt +0 -1
- package/.code/agents/df412c98-7378-4deb-8e1e-76c416931181/error.txt +0 -3
- package/.code/agents/e5134eb3-2af4-45b0-8998-051cb4afdb45/error.txt +0 -3
- package/.code/agents/e6308471-aa45-4e9e-9496-2e9404164d97/error.txt +0 -8
- package/.code/agents/e7bd8bc7-23fb-4f46-98dc-b0dcf11b75a1/error.txt +0 -1
- package/.code/agents/e92bec35-378d-4fe1-8ac0-6e1bb3c86911/error.txt +0 -5
- package/.code/agents/ed918fbf-2dc4-4aa2-bfc5-04b65d9471ea/error.txt +0 -1
- package/.code/agents/ef1d756f-b272-48fc-8729-f05c494674f7/error.txt +0 -1
- package/.code/agents/ef359853-0249-4e41-a804-c0fc459fe456/error.txt +0 -1
- package/.code/agents/effc7b4a-4b90-40a0-8c86-a7a99d2d5fd2/error.txt +0 -1
- package/.code/agents/fa15f8d5-8359-4a8b-83a3-2f2056b3ff40/error.txt +0 -3
- package/.code/agents/fbef4193-eadf-4c8a-83ff-4878a6310f25/error.txt +0 -8
- package/.code/agents/fd0a4b4a-fda4-4964-a6d6-2b8a2da387c6/error.txt +0 -1
- package/.gemini/settings.json +0 -8
- package/WARP.md +0 -245
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Failed to execute code-gpt-5.1-codex-mini: program not found
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
I'm using the writing-plans skill to create the implementation plan.
|
|
2
|
+
|
|
3
|
+
# MCP Resilience Implementation Plan
|
|
4
|
+
|
|
5
|
+
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
|
6
|
+
|
|
7
|
+
**Goal:** Harden the MCP server by validating every tool’s metadata schema and making `clear_cache` fully reset delta/caching state so knowledge doesn’t drift while keeping diagnostics accurate.
|
|
8
|
+
|
|
9
|
+
**Architecture:** Validate metadata against generated `zod` schemas inside `ToolRegistry`, expose mismatches immediately, and delegate cache clearing to `DeltaCache.forceFullRefresh()` so both the LRU cache and `ServerKnowledgeStore` reset before diagnostics observe the new state.
|
|
10
|
+
|
|
11
|
+
**Tech Stack:** TypeScript 5/Node 18+, `zod`/`zod-validation-error`, MCP SDK server wiring in `src/server`, Vitest for fast unit/integration suites, and Markdown docs in `docs/reference/TOOLS.md`.
|
|
12
|
+
|
|
13
|
+
### Task 1: Tighten tool metadata schema validation
|
|
14
|
+
|
|
15
|
+
**Files:**
|
|
16
|
+
- Modify: `src/server/toolRegistry.ts`
|
|
17
|
+
- Modify: `src/server/__tests__/toolRegistry.test.ts`
|
|
18
|
+
|
|
19
|
+
**Step 1: Write the failing test**
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
it('rejects registration when metadata inputJsonSchema diverges from the handler schema', () => {
|
|
23
|
+
const registry = new ToolRegistry({
|
|
24
|
+
withSecurityWrapper: vi.fn().mockReturnValue(() => async (handler) => handler({})),
|
|
25
|
+
errorHandler: mockedErrorHandler,
|
|
26
|
+
responseFormatter: responseFormatter,
|
|
27
|
+
});
|
|
28
|
+
const mismatchedMetadata = { type: 'object', properties: { bogus: { type: 'string' } } };
|
|
29
|
+
expect(() =>
|
|
30
|
+
registry.register({
|
|
31
|
+
name: 'budget-sync',
|
|
32
|
+
description: 'Sync budget data',
|
|
33
|
+
inputSchema: z.object({ budget_id: z.string().min(1) }).strict(),
|
|
34
|
+
handler: async () => ({ content: [{ type: 'text', text: responseFormatter.format({}) }] }),
|
|
35
|
+
metadata: { inputJsonSchema: mismatchedMetadata },
|
|
36
|
+
}),
|
|
37
|
+
).toThrow('metadata input schema must match generated schema for tool "budget-sync"');
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Step 2: Run the test to verify it fails**
|
|
42
|
+
|
|
43
|
+
Run: `npm run test:unit -- --runInBand src/server/__tests__/toolRegistry.test.ts --testNamePattern "metadata input schema"`
|
|
44
|
+
Expected: FAIL because the registry currently accepts mismatched metadata.
|
|
45
|
+
|
|
46
|
+
**Step 3: Implement the minimal enforcement**
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
private ensureMetadataSchemaMatches(definition: ToolDefinition): void {
|
|
50
|
+
const generatedSchema = this.generateJsonSchema(definition.inputSchema, 'input');
|
|
51
|
+
if (definition.metadata?.inputJsonSchema) {
|
|
52
|
+
if (JSON.stringify(generatedSchema) !== JSON.stringify(definition.metadata.inputJsonSchema)) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
`metadata input schema must match generated schema for tool "${definition.name}"`,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
definition.metadata = {
|
|
59
|
+
...definition.metadata,
|
|
60
|
+
inputJsonSchema: generatedSchema,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Call `this.ensureMetadataSchemaMatches(definition);` near the top of `register` before storing the tool so `metadata.inputJsonSchema` is always populated (and validated) for `listTools()`. This also means `ToolRegistry.listTools()` no longer needs to fall back to `generateJsonSchema` when metadata is present.
|
|
67
|
+
|
|
68
|
+
**Step 4: Run the test to confirm it now passes**
|
|
69
|
+
|
|
70
|
+
Run: `npm run test:unit -- --runInBand src/server/__tests__/toolRegistry.test.ts --testNamePattern "metadata input schema"`
|
|
71
|
+
Expected: PASS.
|
|
72
|
+
|
|
73
|
+
**Step 5: Commit**
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git add src/server/toolRegistry.ts src/server/__tests__/toolRegistry.test.ts
|
|
77
|
+
git commit -m "fix: validate tool metadata schemas at registration"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Task 2: Reset delta knowledge when clearing the cache
|
|
81
|
+
|
|
82
|
+
**Files:**
|
|
83
|
+
- Modify: `src/server/YNABMCPServer.ts`
|
|
84
|
+
- Modify: `src/server/__tests__/YNABMCPServer.integration.test.ts`
|
|
85
|
+
- Modify: `docs/reference/TOOLS.md`
|
|
86
|
+
|
|
87
|
+
**Step 1: Write the failing integration test**
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
it(
|
|
91
|
+
'resets delta knowledge entries when clear_cache runs',
|
|
92
|
+
{ meta: { tier: 'domain', domain: 'server' } },
|
|
93
|
+
async (ctx) => {
|
|
94
|
+
await skipOnRateLimit(async () => {
|
|
95
|
+
const token = accessToken();
|
|
96
|
+
await registry.executeTool({
|
|
97
|
+
name: 'list_accounts',
|
|
98
|
+
accessToken: token,
|
|
99
|
+
arguments: { budget_id: budgetsResult?.budgets?.[0]?.id },
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const before = await registry.executeTool({
|
|
103
|
+
name: 'diagnostic_info',
|
|
104
|
+
accessToken: token,
|
|
105
|
+
arguments: { include_delta: true },
|
|
106
|
+
});
|
|
107
|
+
const beforeData = JSON.parse(before.content?.[0]?.text ?? '{}');
|
|
108
|
+
expect(beforeData.delta?.knowledge_entries).toBeGreaterThan(0);
|
|
109
|
+
|
|
110
|
+
await registry.executeTool({ name: 'clear_cache', accessToken: token, arguments: {} });
|
|
111
|
+
|
|
112
|
+
const after = await registry.executeTool({
|
|
113
|
+
name: 'diagnostic_info',
|
|
114
|
+
accessToken: token,
|
|
115
|
+
arguments: { include_delta: true },
|
|
116
|
+
});
|
|
117
|
+
const afterData = JSON.parse(after.content?.[0]?.text ?? '{}');
|
|
118
|
+
expect(afterData.delta?.knowledge_entries).toBe(0);
|
|
119
|
+
}, ctx);
|
|
120
|
+
},
|
|
121
|
+
);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Step 2: Run the integration test to verify it fails**
|
|
125
|
+
|
|
126
|
+
Run: `npm run test:integration:domain -- --testNamePattern "clear cache runs"`
|
|
127
|
+
Expected: FAIL because `clear_cache` currently only clears `cacheManager`, leaving `ServerKnowledgeStore` populated.
|
|
128
|
+
|
|
129
|
+
**Step 3: Implement the minimal fix**
|
|
130
|
+
|
|
131
|
+
- Update the `clear_cache` handler in `setupToolRegistry` to call `this.deltaCache.forceFullRefresh()` instead of directly `cacheManager.clear()`, ensuring both the cache and knowledge store reset:
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
handler: async () => {
|
|
135
|
+
this.deltaCache.forceFullRefresh();
|
|
136
|
+
return {
|
|
137
|
+
content: [{ type: 'text', text: responseFormatter.format({ success: true }) }],
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
- Update `docs/reference/TOOLS.md` entry to explain the stronger guarantee:
|
|
143
|
+
|
|
144
|
+
```md
|
|
145
|
+
| `clear_cache` | Clear the cache and reset delta knowledge so clients can start fresh | None |
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Step 4: Run the integration test to confirm it passes**
|
|
149
|
+
|
|
150
|
+
Run: `npm run test:integration:domain -- --testNamePattern "clear cache runs"`
|
|
151
|
+
Expected: PASS.
|
|
152
|
+
|
|
153
|
+
**Step 5: Commit**
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
git add src/server/YNABMCPServer.ts src/server/__tests__/YNABMCPServer.integration.test.ts docs/reference/TOOLS.md
|
|
157
|
+
git commit -m "feat: reset delta knowledge when cache is cleared"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
Because the sandbox is read-only, I couldn’t save this plan to `docs/plans/2025-11-21-mcp-resilience.md`; please copy the above Markdown there in a workspace-write session before executing the tasks.
|
|
163
|
+
|
|
164
|
+
- **Plan scope:** Adds schema validation in `src/server/toolRegistry.ts` plus a new regression test in `src/server/__tests__/toolRegistry.test.ts`, and modifies `clear_cache` in `src/server/YNABMCPServer.ts` with an integration test addition and doc update in `docs/reference/TOOLS.md`.
|
|
165
|
+
- **Testing:** Run the targeted unit test via `npm run test:unit -- --runInBand src/server/__tests__/toolRegistry.test.ts --testNamePattern "metadata input schema"` and the integration slice via `npm run test:integration:domain -- --testNamePattern "clear cache runs"` after making the code changes.
|
|
166
|
+
|
|
167
|
+
Next steps:
|
|
168
|
+
1. Execute the described plan in a writable worktree (create `docs/plans/2025-11-21-mcp-resilience.md` with the above content first) and implement Task 1’s schema validation.
|
|
169
|
+
2. Run the targeted unit test from Task 1 to confirm failure, then fix the code, rerun to confirm success.
|
|
170
|
+
3. Implement Task 2, add the integration test, update `clear_cache`, refresh `docs/reference/TOOLS.md`, and run `npm run test:integration:domain -- --testNamePattern "clear cache runs"`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Required agent 'gemini' is not installed or not in PATH
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Command failed: Error loading configuration: config profile `Smoke test: from the current repo, run `pwd` and `git status -sb`, then list top-level files/directories and print a short summary. No file writes or edits.
|
|
2
|
+
|
|
3
|
+
[Running in read-only mode - no modifications allowed]` not found
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Agent cancelled
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Agent cancelled
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Command failed: Error loading configuration: config profile `You are helping craft an implementation plan for the YNAB MCP Server repo (Model Context Protocol server for YNAB). Repo root at C:/Users/ksutk/projects/ynab-mcpb. Key info: TypeScript/Node 18+, ts source in src/, server wiring in src/server, tools in src/tools, utils in src/utils, entry at src/index.ts. Build: npm run build (lint+tsc+bundle) outputs dist/. Tests use Vitest with projects (unit, integration, e2e). package.json scripts include build:prod, lint:fix, test:unit, test:integration, test:e2e, package:mcpb. Docs in docs/. Current version 0.13.4. Goal: propose a concrete step-by-step implementation plan for the next iteration to improve the project. Include where to change code (paths), suggested tests to add/run, and rationale. Assume current tests passing (test-results show success). Focus on actionable tasks (2-5 min steps) using TDD mindset. Deliver plan structure we can hand to engineer. Do not assume write access.
|
|
2
|
+
|
|
3
|
+
[Running in read-only mode - no modifications allowed]` not found
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Agent cancelled
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Agent cancelled
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Command failed: Error loading configuration: config profile `Context: cwd: C:\Users\ksutk\projects\ynab-mcpb. This is only to verify whether a gemini-3-pro backed agent can successfully start and complete.
|
|
2
|
+
|
|
3
|
+
Agent: Minimal Gemini smoke test: from the ynab-mcpb repo, run `git status -sb` and list top-level directories, then print a short summary and exit. No file writes required.
|
|
4
|
+
|
|
5
|
+
[Running in read-only mode - no modifications allowed]` not found
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Agent cancelled
|
|
@@ -10,6 +10,8 @@ jobs:
|
|
|
10
10
|
permissions:
|
|
11
11
|
contents: read
|
|
12
12
|
id-token: write
|
|
13
|
+
env:
|
|
14
|
+
YNAB_ACCESS_TOKEN: ${{ secrets.YNAB_ACCESS_TOKEN }}
|
|
13
15
|
steps:
|
|
14
16
|
- uses: actions/checkout@v4
|
|
15
17
|
|
|
@@ -25,9 +27,7 @@ jobs:
|
|
|
25
27
|
run: npm run build
|
|
26
28
|
|
|
27
29
|
- name: Publish to npm
|
|
28
|
-
env:
|
|
29
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
30
30
|
run: |
|
|
31
|
-
echo "
|
|
31
|
+
echo "Using npm Trusted Publishing (OIDC)"
|
|
32
32
|
npm run test:unit
|
|
33
33
|
npm publish --provenance --access public
|
|
@@ -87,3 +87,7 @@ jobs:
|
|
|
87
87
|
files: ${{ steps.meta.outputs.file }}
|
|
88
88
|
generate_release_notes: true
|
|
89
89
|
fail_on_unmatched_files: true
|
|
90
|
+
# Use WORKFLOW_PAT to allow triggering the publish workflow
|
|
91
|
+
# PAT needs: repo, workflow permissions
|
|
92
|
+
# Falls back to GITHUB_TOKEN if PAT not configured
|
|
93
|
+
token: ${{ secrets.WORKFLOW_PAT || github.token }}
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,81 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.15.0] - 2025-11-30
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Version Bump** - Minor version increment
|
|
15
|
+
|
|
16
|
+
## [0.14.0] - 2025-11-26
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- **Reconciliation V2 Architecture** - Complete redesign of reconciliation system
|
|
21
|
+
- Canonical transaction types with milliunits-based amounts (eliminates float precision issues)
|
|
22
|
+
- New CSV parser using PapaParse with Canadian bank presets (TD, RBC, Scotiabank, Wealthsimple, Tangerine)
|
|
23
|
+
- Advanced fuzzy matching engine using fuzzball for merchant name matching
|
|
24
|
+
- Configurable scoring system with amount/date/payee weights and bonuses
|
|
25
|
+
- Enhanced date parsing with chrono-node supporting multiple formats
|
|
26
|
+
- Auto-detection of CSV formats with comprehensive error reporting
|
|
27
|
+
- Support for debit/credit column formats and European number formats
|
|
28
|
+
- New dependencies: `chrono-node`, `dayjs`, `fuzzball`, `papaparse`
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- **Matching Algorithm** - Improved accuracy and configurability
|
|
33
|
+
- Default amount tolerance: 1 cent (10 milliunits, down from 50)
|
|
34
|
+
- Default date tolerance: 7 days (up from 2 days for bank posting delays)
|
|
35
|
+
- Rebalanced weights: amount 50%, payee 35%, date 15%
|
|
36
|
+
- Auto-match threshold: 85% (down from 90% for better match rates)
|
|
37
|
+
- Token-set-ratio matching for payee names handles bank merchant variations
|
|
38
|
+
|
|
39
|
+
- **Code Quality** - Eliminated duplication and improved maintainability
|
|
40
|
+
- Exported `normalizeConfig` function from matcher for reuse
|
|
41
|
+
- Removed 23 lines of duplicated config construction in analyzer
|
|
42
|
+
- Updated all documentation to reflect V2 implementation
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- **Documentation** - Corrected outdated references and mismatches
|
|
47
|
+
- Fixed file path references (removed non-existent `matcher.v2.ts`)
|
|
48
|
+
- Corrected config value documentation (amountToleranceMilliunits)
|
|
49
|
+
- Fixed Markdown table formatting in reconciliation plan
|
|
50
|
+
|
|
51
|
+
## [0.13.4] - 2025-11-21
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- **npm Trusted Publishing** - Switched to OIDC-based authentication
|
|
56
|
+
- More secure than token-based authentication
|
|
57
|
+
- No secrets to manage or rotate
|
|
58
|
+
- Automatic authentication via GitHub Actions OIDC
|
|
59
|
+
|
|
60
|
+
## [0.13.3] - 2025-11-21
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
|
|
64
|
+
- **Publish Workflow** - Added YNAB_ACCESS_TOKEN to npm publish workflow
|
|
65
|
+
- Performance tests now have required token during publish
|
|
66
|
+
- Ensures all unit tests pass before npm publish
|
|
67
|
+
|
|
68
|
+
## [0.13.2] - 2025-11-21
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
|
|
72
|
+
- **Improved CI/CD Workflows** - Enhanced reliability and automation
|
|
73
|
+
- Integration tests now optional with `continue-on-error` (won't block merges)
|
|
74
|
+
- Increased integration test timeout to 90 minutes for rate-limited YNAB API calls
|
|
75
|
+
- Added WORKFLOW_PAT support for automatic npm publish on release
|
|
76
|
+
- Release workflow can now trigger publish workflow automatically
|
|
77
|
+
|
|
78
|
+
### Fixed
|
|
79
|
+
|
|
80
|
+
- **CI Timeout Issues** - Resolved integration test timeouts in GitHub Actions
|
|
81
|
+
- Tests hitting YNAB API rate limits (200/hour) no longer cause failures
|
|
82
|
+
- 60-minute rate limit reset waits are now accommodated
|
|
83
|
+
- CI provides visibility without blocking development
|
|
84
|
+
|
|
10
85
|
## [0.13.1] - 2025-11-21
|
|
11
86
|
|
|
12
87
|
### Fixed
|
package/NUL
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dir: cannot access '/B': No such file or directory
|