@dizzlkheinz/ynab-mcpb 0.17.0 → 0.17.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.
Files changed (142) hide show
  1. package/.env.example +33 -33
  2. package/.github/workflows/ci-tests.yml +45 -45
  3. package/.github/workflows/claude-code-review.yml +57 -57
  4. package/.github/workflows/claude.yml +50 -50
  5. package/.github/workflows/full-integration.yml +22 -22
  6. package/.github/workflows/publish.yml +11 -2
  7. package/CLAUDE.md +7 -6
  8. package/dist/bundle/index.cjs +52 -52
  9. package/dist/server/YNABMCPServer.d.ts +120 -54
  10. package/dist/server/securityMiddleware.d.ts +37 -8
  11. package/dist/tools/schemas/outputs/index.d.ts +2 -2
  12. package/dist/tools/schemas/outputs/index.js +2 -2
  13. package/dist/tools/schemas/outputs/utilityOutputs.d.ts +0 -15
  14. package/dist/tools/schemas/outputs/utilityOutputs.js +0 -9
  15. package/dist/tools/utilityTools.d.ts +0 -7
  16. package/dist/tools/utilityTools.js +1 -50
  17. package/docs/maintainers/npm-publishing.md +27 -0
  18. package/docs/reference/API.md +15 -70
  19. package/docs/technical/reconciliation-system-architecture.md +2251 -2251
  20. package/package.json +5 -5
  21. package/scripts/analyze-bundle.mjs +41 -41
  22. package/scripts/generate-mcpb.ps1 +95 -95
  23. package/scripts/watch-and-restart.ps1 +49 -49
  24. package/src/__tests__/comprehensive.integration.test.ts +0 -28
  25. package/src/__tests__/performance.test.ts +4 -12
  26. package/src/__tests__/setup.ts +45 -14
  27. package/src/__tests__/workflows.e2e.test.ts +0 -44
  28. package/src/server/__tests__/YNABMCPServer.test.ts +0 -1
  29. package/src/server/__tests__/toolRegistration.test.ts +2 -2
  30. package/src/tools/__tests__/transactionTools.integration.test.ts +63 -3
  31. package/src/tools/__tests__/utilityTools.integration.test.ts +1 -85
  32. package/src/tools/__tests__/utilityTools.test.ts +1 -123
  33. package/src/tools/schemas/outputs/index.ts +0 -3
  34. package/src/tools/schemas/outputs/utilityOutputs.ts +2 -43
  35. package/src/tools/toolCategories.ts +0 -1
  36. package/src/tools/utilityTools.ts +5 -76
  37. package/vitest.config.ts +2 -1
  38. package/.chunkhound.json +0 -11
  39. package/.code/agents/0098661e-0fa3-4990-beb9-c0cbf3f123aa/status.txt +0 -1
  40. package/.code/agents/01a13ef4-3f23-4f52-b33b-3585b73cfa60/error.txt +0 -3
  41. package/.code/agents/084fd32f-e298-4728-9103-a78d7dc39613/error.txt +0 -3
  42. package/.code/agents/0fed51e1-a943-4b97-a2a8-a6f0f27c844d/status.txt +0 -1
  43. package/.code/agents/1059b6bd-5ccd-4d83-a12c-7c9d89137399/error.txt +0 -5
  44. package/.code/agents/110/exec-call_F9BDNG7JfxKkq7Vc8ESAvdft.txt +0 -1569
  45. package/.code/agents/11ebcef3-b13f-4e44-ad80-d94a866804b7/error.txt +0 -3
  46. package/.code/agents/1324/exec-call_tIpx9uV1TpARbAMZonRQm8AO.txt +0 -757
  47. package/.code/agents/1398/exec-call_CjItcWMU1G6JoPshX62QvpaR.txt +0 -2832
  48. package/.code/agents/1398/exec-call_SUVq2ivmONQ5LMCmd7ngmOqr.txt +0 -2709
  49. package/.code/agents/1398/exec-call_SdNY4NOffdcC5pRYjVXHjPCK.txt +0 -2832
  50. package/.code/agents/1398/exec-call_qblJo9et1gsFFB63TtLOiji2.txt +0 -2832
  51. package/.code/agents/1398/exec-call_zaRrzlGz7GJcNzVfkAmML7Zg.txt +0 -2709
  52. package/.code/agents/1572/exec-call_GjVFBFOWcY7lE0idc5nWlLNh.txt +0 -781
  53. package/.code/agents/171834fd-5905-42fc-bbcc-2c755145b0fc/status.txt +0 -1
  54. package/.code/agents/1724/exec-call_HvHQe0w5CCG3T7Q3ULT6MO3g.txt +0 -5217
  55. package/.code/agents/1724/exec-call_QwUNESVzfxxk78K1frh1Vahb.txt +0 -2594
  56. package/.code/agents/1724/exec-call_aJ1Xwz71XmIpD4SBxSHERzLe.txt +0 -2594
  57. package/.code/agents/1846/exec-call_1YNAVD18RjrMN7JnfkkQhUP3.txt +0 -766
  58. package/.code/agents/1846/exec-call_lh3lDzE4WJAh1lFiomiiZ73D.txt +0 -766
  59. package/.code/agents/1d7d7ab7-7473-4b69-8b97-6e914f56056a/result.txt +0 -231
  60. package/.code/agents/2038/exec-call_DYwOukaYsL8VCONWmV2rUW5u.txt +0 -766
  61. package/.code/agents/2038/exec-call_c7fOQ7UrpVcTtvdfGBRM146V.txt +0 -652
  62. package/.code/agents/2038/exec-call_ySNyq9Mm55jWE480s54r5QcA.txt +0 -766
  63. package/.code/agents/210/exec-call_0tQCsKNJ1WTuIchb8wlcFJpW.txt +0 -2590
  64. package/.code/agents/210/exec-call_8ZlY9cUc8Ft1twi4ch8UJ6IN.txt +0 -5195
  65. package/.code/agents/2188/exec-call_5HqayBxIteJtoI8oPTiLWgvJ.txt +0 -286
  66. package/.code/agents/2188/exec-call_XRbBKBq3adZe6dcppAvQtM7G.txt +0 -218
  67. package/.code/agents/2188/exec-call_ehA0SjpYtrUi6GJXmibLjp4i.txt +0 -180
  68. package/.code/agents/21902821-ecaf-4759-bb9d-222b90921af5/error.txt +0 -3
  69. package/.code/agents/2256/exec-call_AtPcRWPmFPMcmX6qOFm1fCEY.txt +0 -766
  70. package/.code/agents/232073be-aa0e-46da-b478-5b64dbf03cf5/status.txt +0 -1
  71. package/.code/agents/234ff534-2336-4771-a8d9-aa04421a63be/result.txt +0 -747
  72. package/.code/agents/2454/exec-call_aFJpupwjfZeOBm7ixI5Vc8z2.txt +0 -766
  73. package/.code/agents/2454/exec-call_wogZ4HfXTodTEXvdgXlVUBpv.txt +0 -766
  74. package/.code/agents/253e2695-dc36-4022-b436-27655e0fc6c7/status.txt +0 -1
  75. package/.code/agents/2583/exec-call_M59I4eDjpjlBIWBiSxyS0YlJ.txt +0 -2594
  76. package/.code/agents/2583/exec-call_usLRGh7OhVHtsRBL4iUwRhjq.txt +0 -2594
  77. package/.code/agents/292aa3ff-dbab-470f-97c9-e7e8fd65e0db/result.txt +0 -144
  78. package/.code/agents/2e905864-aa07-4314-bcf9-c5b32277e4ac/result.txt +0 -36
  79. package/.code/agents/3073/exec-call_Peeagc9DxGYLgE6pNdMZhqIE.txt +0 -766
  80. package/.code/agents/3073/exec-call_d2YSE3hXF08KRSoUM3qd8Z3x.txt +0 -766
  81. package/.code/agents/3134/exec-call_IgCAMGx19lWfuo8zfYIt5FFC.txt +0 -416
  82. package/.code/agents/3134/exec-call_IxvLR2Oo7kba2QTsI1gHVko8.txt +0 -2590
  83. package/.code/agents/3134/exec-call_jYvc8hksZChSiysbzKjl2ZbB.txt +0 -2590
  84. package/.code/agents/329/exec-call_4QdP3SfSO7HGPCwVcqZIth6s.txt +0 -2590
  85. package/.code/agents/335aa031-466d-4fb7-925f-3cd864e264d0/result.txt +0 -191
  86. package/.code/agents/3364/exec-call_NbhIrsM5HhyDZDmJZG5CuCYL.txt +0 -766
  87. package/.code/agents/3364/exec-call_cKtJg0NrXiwXEFwlsE3uPZRA.txt +0 -766
  88. package/.code/agents/36d98414-5cde-4d9d-9a67-a240a18c1f07/result.txt +0 -189
  89. package/.code/agents/4604e866-b7b8-44f5-992f-2f683b0a523b/status.txt +0 -1
  90. package/.code/agents/472/exec-call_4AxzEEcWwkKhpqRB3bE8Ha4L.txt +0 -790
  91. package/.code/agents/472/exec-call_CB3LPYQA8QIZRi8I6kj4J17A.txt +0 -766
  92. package/.code/agents/472/exec-call_YeoUWvaFoktay2nqVUsa9KKX.txt +0 -790
  93. package/.code/agents/472/exec-call_jPWgKVquBBXTg0T3Lks5ZfkK.txt +0 -2594
  94. package/.code/agents/472/exec-call_qBkvunpGBDEHph2jPmTwtcsb.txt +0 -1000
  95. package/.code/agents/472/exec-call_v0ffRV1p0kTckBmJPzzHAEy0.txt +0 -3489
  96. package/.code/agents/472/exec-call_xAX5FXqWIlk02d9WubHbHWh8.txt +0 -766
  97. package/.code/agents/5346/exec-call_9q0muXUuLaucwEqI51Pt7idT.txt +0 -2594
  98. package/.code/agents/5346/exec-call_B2el3B79rVkq9LhWTI2VYlz7.txt +0 -2456
  99. package/.code/agents/5346/exec-call_BfX08f02qkZI9uJD5dvCvuoj.txt +0 -2594
  100. package/.code/agents/543328d0-61d6-4fd1-a723-bb168656e2e2/error.txt +0 -18
  101. package/.code/agents/5580c02c-1383-4d18-9cbd-cc8a06e3408d/result.txt +0 -48
  102. package/.code/agents/5f8dc01c-47b3-4163-b0b3-aa31be89fcdc/status.txt +0 -1
  103. package/.code/agents/60ce1a22-5126-44b2-b977-1d5b56142a7b/status.txt +0 -1
  104. package/.code/agents/6215d9db-7fa9-4429-aeec-3835c3212291/error.txt +0 -1
  105. package/.code/agents/6743db55-30e5-4b4e-9366-a8214fc7f714/error.txt +0 -1
  106. package/.code/agents/6bf9591b-b9c9-422c-b0a5-e968c7d8422a/status.txt +0 -1
  107. package/.code/agents/7/exec-call_HltHpkDox0Zm1vGEjdksUgpE.txt +0 -1120
  108. package/.code/agents/7/exec-call_LCATrOPPAgbxW9Q1z0XaVi2E.txt +0 -2646
  109. package/.code/agents/7/exec-call_W8DeRfNG9hvbgVFvf0clBf6R.txt +0 -2646
  110. package/.code/agents/7/exec-call_eww3GfdEiJZx61sJEQ9wNmt3.txt +0 -1271
  111. package/.code/agents/70/exec-call_owUtDMYiVgqDf8vsz1i32PFf.txt +0 -1570
  112. package/.code/agents/8/exec-call_UtrjAcLbhYLatxR4O97fZgnm.txt +0 -2590
  113. package/.code/agents/82490bc9-f34e-4b1b-8a8e-bccc2e6254f5/error.txt +0 -3
  114. package/.code/agents/841/exec-call_7nTNhSBCNjTDUIJv7py6CepO.txt +0 -3299
  115. package/.code/agents/841/exec-call_TLI0yUdUijuUAvI4o3DXEvHO.txt +0 -3299
  116. package/.code/agents/9/exec-call_XaABQT1hIlRpnKZ2uyBMWsTC.txt +0 -1882
  117. package/.code/agents/941/exec-call_GuGHRx7NNXWIDAnxUG2NEWPa.txt +0 -2594
  118. package/.code/agents/94a0ddf3-a304-4ec3-913e-3cceef509948/error.txt +0 -1
  119. package/.code/agents/95d9fbab-19a2-48af-83f9-c792566a347f/error.txt +0 -1
  120. package/.code/agents/b0098cb8-cb32-4ada-9bc4-37c587518896/result.txt +0 -170
  121. package/.code/agents/b4fe59a4-81df-42e2-a112-0153e504faca/error.txt +0 -1
  122. package/.code/agents/bf4ce152-f623-49d7-aa52-c18631625c3c/error.txt +0 -3
  123. package/.code/agents/d7d1db75-d7eb-468e-adea-4ef4d916d187/status.txt +0 -1
  124. package/.code/agents/e2baa9c8-bac3-49e3-a39d-024333e6a990/status.txt +0 -1
  125. package/.code/agents/e2c752b7-711d-423a-af57-f53c809deb84/result.txt +0 -160
  126. package/.code/agents/e350b8c3-8483-408c-b2bb-94515f492a11/error.txt +0 -3
  127. package/.code/agents/e63f9919-719f-4ad0-bccf-01b1a596e1e9/status.txt +0 -1
  128. package/.code/agents/e6601719-c31f-4a0e-8c71-d70787d0ab71/status.txt +0 -1
  129. package/.code/agents/e71695a8-3044-478d-8f12-ed13d02884c7/status.txt +0 -1
  130. package/.code/agents/f250b7ed-5bd5-4036-aa8c-ce63caee7d61/result.txt +0 -20
  131. package/.code/agents/f95b7464-3e25-4897-b153-c8dfd63fd605/error.txt +0 -5
  132. package/.code/agents/fa3c5ddf-cdf7-47a2-930a-b806c6363689/status.txt +0 -1
  133. package/AGENTS.md +0 -1
  134. package/NUL +0 -0
  135. package/package.json.tmp +0 -105
  136. package/temp-recon.ts +0 -126
  137. package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_09-04-53.json +0 -23
  138. package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_10-37-42.json +0 -23
  139. package/test-exports/ynab_account_e9ddc2a6_minimal_4items_2025-11-19_09-02-09.json +0 -44
  140. package/test-exports/ynab_account_e9ddc2a6_minimal_6items_2025-11-19_10-37-52.json +0 -58
  141. package/test-exports/ynab_since_2025-10-16_account_53298e13_238items_2025-11-28_13-46-20.json +0 -3662
  142. package/test-exports/ynab_since_2025-11-01_account_4c18e9f0_minimal_14items_2025-11-16_10-07-10.json +0 -115
@@ -33,39 +33,43 @@ export declare class YNABMCPServer {
33
33
  private warmCacheForBudget;
34
34
  handleListTools(): Promise<{
35
35
  tools: {
36
- name: string;
37
36
  inputSchema: {
37
+ [x: string]: unknown;
38
38
  type: "object";
39
- required?: string[] | undefined;
40
39
  properties?: {
41
40
  [x: string]: object;
42
41
  } | undefined;
42
+ required?: string[] | undefined;
43
43
  };
44
- _meta?: {
45
- [x: string]: unknown;
46
- } | undefined;
47
- icons?: {
48
- src: string;
49
- mimeType?: string | undefined | undefined;
50
- sizes?: string[] | undefined;
51
- }[] | undefined;
52
- title?: string | undefined | undefined;
53
- description?: string | undefined | undefined;
44
+ name: string;
45
+ description?: string | undefined;
54
46
  outputSchema?: {
47
+ [x: string]: unknown;
55
48
  type: "object";
56
- required?: string[] | undefined;
57
49
  properties?: {
58
50
  [x: string]: object;
59
51
  } | undefined;
60
- additionalProperties?: boolean | undefined | undefined;
52
+ required?: string[] | undefined;
61
53
  } | undefined;
62
54
  annotations?: {
63
- title?: string | undefined | undefined;
64
- readOnlyHint?: boolean | undefined | undefined;
65
- destructiveHint?: boolean | undefined | undefined;
66
- idempotentHint?: boolean | undefined | undefined;
67
- openWorldHint?: boolean | undefined | undefined;
55
+ title?: string | undefined;
56
+ readOnlyHint?: boolean | undefined;
57
+ destructiveHint?: boolean | undefined;
58
+ idempotentHint?: boolean | undefined;
59
+ openWorldHint?: boolean | undefined;
68
60
  } | undefined;
61
+ execution?: {
62
+ taskSupport?: "optional" | "forbidden" | "required" | undefined;
63
+ } | undefined;
64
+ _meta?: {
65
+ [x: string]: unknown;
66
+ } | undefined;
67
+ icons?: {
68
+ src: string;
69
+ mimeType?: string | undefined;
70
+ sizes?: string[] | undefined;
71
+ }[] | undefined;
72
+ title?: string | undefined;
69
73
  }[];
70
74
  }>;
71
75
  handleListResources(): Promise<{
@@ -78,6 +82,11 @@ export declare class YNABMCPServer {
78
82
  content: ({
79
83
  type: "text";
80
84
  text: string;
85
+ annotations?: {
86
+ audience?: ("user" | "assistant")[] | undefined;
87
+ priority?: number | undefined;
88
+ lastModified?: string | undefined;
89
+ } | undefined;
81
90
  _meta?: {
82
91
  [x: string]: unknown;
83
92
  } | undefined;
@@ -85,6 +94,11 @@ export declare class YNABMCPServer {
85
94
  type: "image";
86
95
  data: string;
87
96
  mimeType: string;
97
+ annotations?: {
98
+ audience?: ("user" | "assistant")[] | undefined;
99
+ priority?: number | undefined;
100
+ lastModified?: string | undefined;
101
+ } | undefined;
88
102
  _meta?: {
89
103
  [x: string]: unknown;
90
104
  } | undefined;
@@ -92,47 +106,66 @@ export declare class YNABMCPServer {
92
106
  type: "audio";
93
107
  data: string;
94
108
  mimeType: string;
109
+ annotations?: {
110
+ audience?: ("user" | "assistant")[] | undefined;
111
+ priority?: number | undefined;
112
+ lastModified?: string | undefined;
113
+ } | undefined;
95
114
  _meta?: {
96
115
  [x: string]: unknown;
97
116
  } | undefined;
98
117
  } | {
99
- type: "resource_link";
100
- name: string;
101
118
  uri: string;
119
+ name: string;
120
+ type: "resource_link";
121
+ description?: string | undefined;
122
+ mimeType?: string | undefined;
123
+ annotations?: {
124
+ audience?: ("user" | "assistant")[] | undefined;
125
+ priority?: number | undefined;
126
+ lastModified?: string | undefined;
127
+ } | undefined;
102
128
  _meta?: {
103
129
  [x: string]: unknown;
104
130
  } | undefined;
105
- mimeType?: string | undefined | undefined;
106
131
  icons?: {
107
132
  src: string;
108
- mimeType?: string | undefined | undefined;
133
+ mimeType?: string | undefined;
109
134
  sizes?: string[] | undefined;
110
135
  }[] | undefined;
111
- title?: string | undefined | undefined;
112
- description?: string | undefined | undefined;
136
+ title?: string | undefined;
113
137
  } | {
114
138
  type: "resource";
115
139
  resource: {
116
140
  uri: string;
117
141
  text: string;
142
+ mimeType?: string | undefined;
118
143
  _meta?: {
119
144
  [x: string]: unknown;
120
145
  } | undefined;
121
- mimeType?: string | undefined | undefined;
122
146
  } | {
123
147
  uri: string;
124
148
  blob: string;
149
+ mimeType?: string | undefined;
125
150
  _meta?: {
126
151
  [x: string]: unknown;
127
152
  } | undefined;
128
- mimeType?: string | undefined | undefined;
129
153
  };
154
+ annotations?: {
155
+ audience?: ("user" | "assistant")[] | undefined;
156
+ priority?: number | undefined;
157
+ lastModified?: string | undefined;
158
+ } | undefined;
130
159
  _meta?: {
131
160
  [x: string]: unknown;
132
161
  } | undefined;
133
162
  })[];
134
163
  _meta?: {
135
164
  [x: string]: unknown;
165
+ "io.modelcontextprotocol/related-task"?: {
166
+ [x: string]: unknown;
167
+ taskId: string;
168
+ } | undefined;
136
169
  } | undefined;
137
170
  structuredContent?: {
138
171
  [x: string]: unknown;
@@ -152,6 +185,11 @@ export declare class YNABMCPServer {
152
185
  content: ({
153
186
  type: "text";
154
187
  text: string;
188
+ annotations?: {
189
+ audience?: ("user" | "assistant")[] | undefined;
190
+ priority?: number | undefined;
191
+ lastModified?: string | undefined;
192
+ } | undefined;
155
193
  _meta?: {
156
194
  [x: string]: unknown;
157
195
  } | undefined;
@@ -159,6 +197,11 @@ export declare class YNABMCPServer {
159
197
  type: "image";
160
198
  data: string;
161
199
  mimeType: string;
200
+ annotations?: {
201
+ audience?: ("user" | "assistant")[] | undefined;
202
+ priority?: number | undefined;
203
+ lastModified?: string | undefined;
204
+ } | undefined;
162
205
  _meta?: {
163
206
  [x: string]: unknown;
164
207
  } | undefined;
@@ -166,47 +209,66 @@ export declare class YNABMCPServer {
166
209
  type: "audio";
167
210
  data: string;
168
211
  mimeType: string;
212
+ annotations?: {
213
+ audience?: ("user" | "assistant")[] | undefined;
214
+ priority?: number | undefined;
215
+ lastModified?: string | undefined;
216
+ } | undefined;
169
217
  _meta?: {
170
218
  [x: string]: unknown;
171
219
  } | undefined;
172
220
  } | {
173
- type: "resource_link";
174
- name: string;
175
221
  uri: string;
222
+ name: string;
223
+ type: "resource_link";
224
+ description?: string | undefined;
225
+ mimeType?: string | undefined;
226
+ annotations?: {
227
+ audience?: ("user" | "assistant")[] | undefined;
228
+ priority?: number | undefined;
229
+ lastModified?: string | undefined;
230
+ } | undefined;
176
231
  _meta?: {
177
232
  [x: string]: unknown;
178
233
  } | undefined;
179
- mimeType?: string | undefined | undefined;
180
234
  icons?: {
181
235
  src: string;
182
- mimeType?: string | undefined | undefined;
236
+ mimeType?: string | undefined;
183
237
  sizes?: string[] | undefined;
184
238
  }[] | undefined;
185
- title?: string | undefined | undefined;
186
- description?: string | undefined | undefined;
239
+ title?: string | undefined;
187
240
  } | {
188
241
  type: "resource";
189
242
  resource: {
190
243
  uri: string;
191
244
  text: string;
245
+ mimeType?: string | undefined;
192
246
  _meta?: {
193
247
  [x: string]: unknown;
194
248
  } | undefined;
195
- mimeType?: string | undefined | undefined;
196
249
  } | {
197
250
  uri: string;
198
251
  blob: string;
252
+ mimeType?: string | undefined;
199
253
  _meta?: {
200
254
  [x: string]: unknown;
201
255
  } | undefined;
202
- mimeType?: string | undefined | undefined;
203
256
  };
257
+ annotations?: {
258
+ audience?: ("user" | "assistant")[] | undefined;
259
+ priority?: number | undefined;
260
+ lastModified?: string | undefined;
261
+ } | undefined;
204
262
  _meta?: {
205
263
  [x: string]: unknown;
206
264
  } | undefined;
207
265
  })[];
208
266
  _meta?: {
209
267
  [x: string]: unknown;
268
+ "io.modelcontextprotocol/related-task"?: {
269
+ [x: string]: unknown;
270
+ taskId: string;
271
+ } | undefined;
210
272
  } | undefined;
211
273
  structuredContent?: {
212
274
  [x: string]: unknown;
@@ -214,39 +276,43 @@ export declare class YNABMCPServer {
214
276
  isError?: boolean | undefined;
215
277
  } | import("./prompts.js").PromptResponse | {
216
278
  tools: {
217
- name: string;
218
279
  inputSchema: {
280
+ [x: string]: unknown;
219
281
  type: "object";
220
- required?: string[] | undefined;
221
282
  properties?: {
222
283
  [x: string]: object;
223
284
  } | undefined;
285
+ required?: string[] | undefined;
224
286
  };
225
- _meta?: {
226
- [x: string]: unknown;
227
- } | undefined;
228
- icons?: {
229
- src: string;
230
- mimeType?: string | undefined | undefined;
231
- sizes?: string[] | undefined;
232
- }[] | undefined;
233
- title?: string | undefined | undefined;
234
- description?: string | undefined | undefined;
287
+ name: string;
288
+ description?: string | undefined;
235
289
  outputSchema?: {
290
+ [x: string]: unknown;
236
291
  type: "object";
237
- required?: string[] | undefined;
238
292
  properties?: {
239
293
  [x: string]: object;
240
294
  } | undefined;
241
- additionalProperties?: boolean | undefined | undefined;
295
+ required?: string[] | undefined;
242
296
  } | undefined;
243
297
  annotations?: {
244
- title?: string | undefined | undefined;
245
- readOnlyHint?: boolean | undefined | undefined;
246
- destructiveHint?: boolean | undefined | undefined;
247
- idempotentHint?: boolean | undefined | undefined;
248
- openWorldHint?: boolean | undefined | undefined;
298
+ title?: string | undefined;
299
+ readOnlyHint?: boolean | undefined;
300
+ destructiveHint?: boolean | undefined;
301
+ idempotentHint?: boolean | undefined;
302
+ openWorldHint?: boolean | undefined;
303
+ } | undefined;
304
+ execution?: {
305
+ taskSupport?: "optional" | "forbidden" | "required" | undefined;
306
+ } | undefined;
307
+ _meta?: {
308
+ [x: string]: unknown;
249
309
  } | undefined;
310
+ icons?: {
311
+ src: string;
312
+ mimeType?: string | undefined;
313
+ sizes?: string[] | undefined;
314
+ }[] | undefined;
315
+ title?: string | undefined;
250
316
  }[];
251
317
  description: string;
252
318
  messages: {
@@ -24,6 +24,11 @@ export declare function withSecurityWrapper<T extends Record<string, unknown>>(t
24
24
  content: ({
25
25
  type: "text";
26
26
  text: string;
27
+ annotations?: {
28
+ audience?: ("user" | "assistant")[] | undefined;
29
+ priority?: number | undefined;
30
+ lastModified?: string | undefined;
31
+ } | undefined;
27
32
  _meta?: {
28
33
  [x: string]: unknown;
29
34
  } | undefined;
@@ -31,6 +36,11 @@ export declare function withSecurityWrapper<T extends Record<string, unknown>>(t
31
36
  type: "image";
32
37
  data: string;
33
38
  mimeType: string;
39
+ annotations?: {
40
+ audience?: ("user" | "assistant")[] | undefined;
41
+ priority?: number | undefined;
42
+ lastModified?: string | undefined;
43
+ } | undefined;
34
44
  _meta?: {
35
45
  [x: string]: unknown;
36
46
  } | undefined;
@@ -38,47 +48,66 @@ export declare function withSecurityWrapper<T extends Record<string, unknown>>(t
38
48
  type: "audio";
39
49
  data: string;
40
50
  mimeType: string;
51
+ annotations?: {
52
+ audience?: ("user" | "assistant")[] | undefined;
53
+ priority?: number | undefined;
54
+ lastModified?: string | undefined;
55
+ } | undefined;
41
56
  _meta?: {
42
57
  [x: string]: unknown;
43
58
  } | undefined;
44
59
  } | {
45
- type: "resource_link";
46
- name: string;
47
60
  uri: string;
61
+ name: string;
62
+ type: "resource_link";
63
+ description?: string | undefined;
64
+ mimeType?: string | undefined;
65
+ annotations?: {
66
+ audience?: ("user" | "assistant")[] | undefined;
67
+ priority?: number | undefined;
68
+ lastModified?: string | undefined;
69
+ } | undefined;
48
70
  _meta?: {
49
71
  [x: string]: unknown;
50
72
  } | undefined;
51
- mimeType?: string | undefined | undefined;
52
73
  icons?: {
53
74
  src: string;
54
- mimeType?: string | undefined | undefined;
75
+ mimeType?: string | undefined;
55
76
  sizes?: string[] | undefined;
56
77
  }[] | undefined;
57
- title?: string | undefined | undefined;
58
- description?: string | undefined | undefined;
78
+ title?: string | undefined;
59
79
  } | {
60
80
  type: "resource";
61
81
  resource: {
62
82
  uri: string;
63
83
  text: string;
84
+ mimeType?: string | undefined;
64
85
  _meta?: {
65
86
  [x: string]: unknown;
66
87
  } | undefined;
67
- mimeType?: string | undefined | undefined;
68
88
  } | {
69
89
  uri: string;
70
90
  blob: string;
91
+ mimeType?: string | undefined;
71
92
  _meta?: {
72
93
  [x: string]: unknown;
73
94
  } | undefined;
74
- mimeType?: string | undefined | undefined;
75
95
  };
96
+ annotations?: {
97
+ audience?: ("user" | "assistant")[] | undefined;
98
+ priority?: number | undefined;
99
+ lastModified?: string | undefined;
100
+ } | undefined;
76
101
  _meta?: {
77
102
  [x: string]: unknown;
78
103
  } | undefined;
79
104
  })[];
80
105
  _meta?: {
81
106
  [x: string]: unknown;
107
+ "io.modelcontextprotocol/related-task"?: {
108
+ [x: string]: unknown;
109
+ taskId: string;
110
+ } | undefined;
82
111
  } | undefined;
83
112
  structuredContent?: {
84
113
  [x: string]: unknown;
@@ -1,5 +1,5 @@
1
- export { GetUserOutputSchema, type GetUserOutput, ConvertAmountOutputSchema, type ConvertAmountOutput, GetDefaultBudgetOutputSchema, type GetDefaultBudgetOutput, SetDefaultBudgetOutputSchema, type SetDefaultBudgetOutput, ClearCacheOutputSchema, type ClearCacheOutput, SetOutputFormatOutputSchema, type SetOutputFormatOutput, DiagnosticInfoOutputSchema, type DiagnosticInfoOutput, GetBudgetOutputSchema, type GetBudgetOutput, } from './utilityOutputs.js';
2
- export { UserSchema, ConversionSchema, DateFormatSchema, CurrencyFormatSchema, BudgetDetailSchema, ServerInfoSchema, MemoryInfoSchema, EnvironmentInfoSchema, CacheInfoSchema, DeltaInfoSchema, } from './utilityOutputs.js';
1
+ export { GetUserOutputSchema, type GetUserOutput, GetDefaultBudgetOutputSchema, type GetDefaultBudgetOutput, SetDefaultBudgetOutputSchema, type SetDefaultBudgetOutput, ClearCacheOutputSchema, type ClearCacheOutput, SetOutputFormatOutputSchema, type SetOutputFormatOutput, DiagnosticInfoOutputSchema, type DiagnosticInfoOutput, GetBudgetOutputSchema, type GetBudgetOutput, } from './utilityOutputs.js';
2
+ export { UserSchema, DateFormatSchema, CurrencyFormatSchema, BudgetDetailSchema, ServerInfoSchema, MemoryInfoSchema, EnvironmentInfoSchema, CacheInfoSchema, DeltaInfoSchema, } from './utilityOutputs.js';
3
3
  export { ListBudgetsOutputSchema, type ListBudgetsOutput, BudgetSummarySchema, type BudgetSummary, } from './budgetOutputs.js';
4
4
  export { ListAccountsOutputSchema, type ListAccountsOutput, GetAccountOutputSchema, type GetAccountOutput, AccountSchema, type Account, } from './accountOutputs.js';
5
5
  export { ListTransactionsOutputSchema, type ListTransactionsOutput, GetTransactionOutputSchema, type GetTransactionOutput, TransactionSchema, type Transaction, TransactionPreviewSchema, type TransactionPreview, } from './transactionOutputs.js';
@@ -1,5 +1,5 @@
1
- export { GetUserOutputSchema, ConvertAmountOutputSchema, GetDefaultBudgetOutputSchema, SetDefaultBudgetOutputSchema, ClearCacheOutputSchema, SetOutputFormatOutputSchema, DiagnosticInfoOutputSchema, GetBudgetOutputSchema, } from './utilityOutputs.js';
2
- export { UserSchema, ConversionSchema, DateFormatSchema, CurrencyFormatSchema, BudgetDetailSchema, ServerInfoSchema, MemoryInfoSchema, EnvironmentInfoSchema, CacheInfoSchema, DeltaInfoSchema, } from './utilityOutputs.js';
1
+ export { GetUserOutputSchema, GetDefaultBudgetOutputSchema, SetDefaultBudgetOutputSchema, ClearCacheOutputSchema, SetOutputFormatOutputSchema, DiagnosticInfoOutputSchema, GetBudgetOutputSchema, } from './utilityOutputs.js';
2
+ export { UserSchema, DateFormatSchema, CurrencyFormatSchema, BudgetDetailSchema, ServerInfoSchema, MemoryInfoSchema, EnvironmentInfoSchema, CacheInfoSchema, DeltaInfoSchema, } from './utilityOutputs.js';
3
3
  export { ListBudgetsOutputSchema, BudgetSummarySchema, } from './budgetOutputs.js';
4
4
  export { ListAccountsOutputSchema, GetAccountOutputSchema, AccountSchema, } from './accountOutputs.js';
5
5
  export { ListTransactionsOutputSchema, GetTransactionOutputSchema, TransactionSchema, TransactionPreviewSchema, } from './transactionOutputs.js';
@@ -8,21 +8,6 @@ export declare const GetUserOutputSchema: z.ZodObject<{
8
8
  }, z.core.$strip>;
9
9
  }, z.core.$strip>;
10
10
  export type GetUserOutput = z.infer<typeof GetUserOutputSchema>;
11
- export declare const ConversionSchema: z.ZodObject<{
12
- original_amount: z.ZodNumber;
13
- converted_amount: z.ZodNumber;
14
- to_milliunits: z.ZodBoolean;
15
- description: z.ZodString;
16
- }, z.core.$strip>;
17
- export declare const ConvertAmountOutputSchema: z.ZodObject<{
18
- conversion: z.ZodObject<{
19
- original_amount: z.ZodNumber;
20
- converted_amount: z.ZodNumber;
21
- to_milliunits: z.ZodBoolean;
22
- description: z.ZodString;
23
- }, z.core.$strip>;
24
- }, z.core.$strip>;
25
- export type ConvertAmountOutput = z.infer<typeof ConvertAmountOutputSchema>;
26
11
  export declare const GetDefaultBudgetOutputSchema: z.ZodObject<{
27
12
  default_budget_id: z.ZodNullable<z.ZodString>;
28
13
  has_default: z.ZodBoolean;
@@ -6,15 +6,6 @@ export const UserSchema = z.object({
6
6
  export const GetUserOutputSchema = z.object({
7
7
  user: UserSchema,
8
8
  });
9
- export const ConversionSchema = z.object({
10
- original_amount: z.number(),
11
- converted_amount: z.number(),
12
- to_milliunits: z.boolean(),
13
- description: z.string(),
14
- });
15
- export const ConvertAmountOutputSchema = z.object({
16
- conversion: ConversionSchema,
17
- });
18
9
  export const GetDefaultBudgetOutputSchema = z.object({
19
10
  default_budget_id: z.string().nullable(),
20
11
  has_default: z.boolean(),
@@ -1,12 +1,5 @@
1
1
  import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
2
  import * as ynab from 'ynab';
3
- import { z } from 'zod/v4';
4
3
  import type { ToolFactory } from '../types/toolRegistration.js';
5
- export declare const ConvertAmountSchema: z.ZodObject<{
6
- amount: z.ZodNumber;
7
- to_milliunits: z.ZodBoolean;
8
- }, z.core.$strict>;
9
- export type ConvertAmountParams = z.infer<typeof ConvertAmountSchema>;
10
4
  export declare function handleGetUser(ynabAPI: ynab.API): Promise<CallToolResult>;
11
- export declare function handleConvertAmount(_ynabAPI: ynab.API, params: ConvertAmountParams): Promise<CallToolResult>;
12
5
  export declare const registerUtilityTools: ToolFactory;
@@ -1,15 +1,8 @@
1
- import { z } from 'zod/v4';
2
1
  import { responseFormatter } from '../server/responseFormatter.js';
3
2
  import { withToolErrorHandling } from '../types/index.js';
4
3
  import { createAdapters } from './adapters.js';
5
4
  import { emptyObjectSchema } from './schemas/common.js';
6
5
  import { ToolAnnotationPresets } from './toolCategories.js';
7
- export const ConvertAmountSchema = z
8
- .object({
9
- amount: z.number().finite(),
10
- to_milliunits: z.boolean(),
11
- })
12
- .strict();
13
6
  export async function handleGetUser(ynabAPI) {
14
7
  return await withToolErrorHandling(async () => {
15
8
  const response = await ynabAPI.user.getUser();
@@ -27,38 +20,8 @@ export async function handleGetUser(ynabAPI) {
27
20
  };
28
21
  }, 'ynab:get_user', 'getting user information');
29
22
  }
30
- export async function handleConvertAmount(_ynabAPI, params) {
31
- return await withToolErrorHandling(async () => {
32
- const { amount, to_milliunits } = params;
33
- let result;
34
- let description;
35
- if (to_milliunits) {
36
- result = Math.round(amount * 1000);
37
- description = `$${amount.toFixed(2)} = ${result} milliunits`;
38
- }
39
- else {
40
- result = amount / 1000;
41
- description = `${amount} milliunits = $${result.toFixed(2)}`;
42
- }
43
- return {
44
- content: [
45
- {
46
- type: 'text',
47
- text: responseFormatter.format({
48
- conversion: {
49
- original_amount: amount,
50
- converted_amount: result,
51
- to_milliunits,
52
- description,
53
- },
54
- }),
55
- },
56
- ],
57
- };
58
- }, 'ynab:convert_amount', 'converting amount');
59
- }
60
23
  export const registerUtilityTools = (registry, context) => {
61
- const { adapt, adaptNoInput } = createAdapters(context);
24
+ const { adaptNoInput } = createAdapters(context);
62
25
  registry.register({
63
26
  name: 'get_user',
64
27
  description: 'Get information about the authenticated user',
@@ -71,16 +34,4 @@ export const registerUtilityTools = (registry, context) => {
71
34
  },
72
35
  },
73
36
  });
74
- registry.register({
75
- name: 'convert_amount',
76
- description: 'Convert between dollars and milliunits with integer arithmetic for precision',
77
- inputSchema: ConvertAmountSchema,
78
- handler: adapt(handleConvertAmount),
79
- metadata: {
80
- annotations: {
81
- ...ToolAnnotationPresets.UTILITY_LOCAL,
82
- title: 'YNAB: Convert Amount',
83
- },
84
- },
85
- });
86
37
  };
@@ -0,0 +1,27 @@
1
+ # npm publishing (maintainers)
2
+
3
+ This repo publishes the package `@dizzlkheinz/ynab-mcpb` to the public npm registry via GitHub Actions (`.github/workflows/publish.yml`).
4
+
5
+ ## Trusted publishing (OIDC)
6
+
7
+ This package is configured as a **Trusted Publisher** on npm (OIDC). With that enabled, the publish workflow does **not** need an npm token and can still work even if the package is set to “disallow tokens”.
8
+
9
+ Note: `npm whoami` will still fail in CI under OIDC; authentication happens only during `npm publish`.
10
+
11
+ ## Common failure: `npm ERR! need auth`
12
+
13
+ This error means the runner has no valid auth for `https://registry.npmjs.org/`.
14
+
15
+ Checklist:
16
+
17
+ - The Trusted Publisher entry matches exactly (repo, workflow filename `publish.yml`, and environment `npm-publish`).
18
+ - The workflow has `permissions: id-token: write`.
19
+ - You’re using a recent npm CLI (the workflow uses Node `24`).
20
+ - For first-time scoped publishes, the workflow uses `npm publish --access public`.
21
+
22
+ ## Local manual publish (optional)
23
+
24
+ ```bash
25
+ npm adduser
26
+ npm publish --access public
27
+ ```