noxctl 0.1.0 → 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.
Files changed (101) hide show
  1. package/README.md +186 -29
  2. package/dist/auth.d.ts +15 -7
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +123 -22
  5. package/dist/auth.js.map +1 -1
  6. package/dist/cli.d.ts +2 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +948 -16
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config-paths.d.ts +2 -0
  11. package/dist/config-paths.d.ts.map +1 -0
  12. package/dist/config-paths.js +7 -0
  13. package/dist/config-paths.js.map +1 -0
  14. package/dist/credentials-store.d.ts +13 -3
  15. package/dist/credentials-store.d.ts.map +1 -1
  16. package/dist/credentials-store.js +154 -48
  17. package/dist/credentials-store.js.map +1 -1
  18. package/dist/fortnox-client.d.ts.map +1 -1
  19. package/dist/fortnox-client.js +14 -2
  20. package/dist/fortnox-client.js.map +1 -1
  21. package/dist/index.d.ts +15 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +86 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/operations/costcenters.d.ts +20 -0
  26. package/dist/operations/costcenters.d.ts.map +1 -0
  27. package/dist/operations/costcenters.js +38 -0
  28. package/dist/operations/costcenters.js.map +1 -0
  29. package/dist/operations/invoice-payments.d.ts +21 -0
  30. package/dist/operations/invoice-payments.d.ts.map +1 -0
  31. package/dist/operations/invoice-payments.js +40 -0
  32. package/dist/operations/invoice-payments.js.map +1 -0
  33. package/dist/operations/offers.d.ts +25 -0
  34. package/dist/operations/offers.d.ts.map +1 -0
  35. package/dist/operations/offers.js +48 -0
  36. package/dist/operations/offers.js.map +1 -0
  37. package/dist/operations/orders.d.ts +24 -0
  38. package/dist/operations/orders.d.ts.map +1 -0
  39. package/dist/operations/orders.js +44 -0
  40. package/dist/operations/orders.js.map +1 -0
  41. package/dist/operations/pricelists.d.ts +36 -0
  42. package/dist/operations/pricelists.d.ts.map +1 -0
  43. package/dist/operations/pricelists.js +52 -0
  44. package/dist/operations/pricelists.js.map +1 -0
  45. package/dist/operations/projects.d.ts +19 -0
  46. package/dist/operations/projects.d.ts.map +1 -0
  47. package/dist/operations/projects.js +33 -0
  48. package/dist/operations/projects.js.map +1 -0
  49. package/dist/operations/supplier-invoice-payments.d.ts +20 -0
  50. package/dist/operations/supplier-invoice-payments.d.ts.map +1 -0
  51. package/dist/operations/supplier-invoice-payments.js +34 -0
  52. package/dist/operations/supplier-invoice-payments.js.map +1 -0
  53. package/dist/operations/taxreductions.d.ts +19 -0
  54. package/dist/operations/taxreductions.d.ts.map +1 -0
  55. package/dist/operations/taxreductions.js +28 -0
  56. package/dist/operations/taxreductions.js.map +1 -0
  57. package/dist/profile-name.d.ts +9 -0
  58. package/dist/profile-name.d.ts.map +1 -0
  59. package/dist/profile-name.js +58 -0
  60. package/dist/profile-name.js.map +1 -0
  61. package/dist/profiles.d.ts +55 -0
  62. package/dist/profiles.d.ts.map +1 -0
  63. package/dist/profiles.js +210 -0
  64. package/dist/profiles.js.map +1 -0
  65. package/dist/tools/costcenters.d.ts +3 -0
  66. package/dist/tools/costcenters.d.ts.map +1 -0
  67. package/dist/tools/costcenters.js +79 -0
  68. package/dist/tools/costcenters.js.map +1 -0
  69. package/dist/tools/invoice-payments.d.ts +3 -0
  70. package/dist/tools/invoice-payments.d.ts.map +1 -0
  71. package/dist/tools/invoice-payments.js +60 -0
  72. package/dist/tools/invoice-payments.js.map +1 -0
  73. package/dist/tools/offers.d.ts +3 -0
  74. package/dist/tools/offers.d.ts.map +1 -0
  75. package/dist/tools/offers.js +130 -0
  76. package/dist/tools/offers.js.map +1 -0
  77. package/dist/tools/orders.d.ts +3 -0
  78. package/dist/tools/orders.d.ts.map +1 -0
  79. package/dist/tools/orders.js +114 -0
  80. package/dist/tools/orders.js.map +1 -0
  81. package/dist/tools/pricelists.d.ts +3 -0
  82. package/dist/tools/pricelists.d.ts.map +1 -0
  83. package/dist/tools/pricelists.js +104 -0
  84. package/dist/tools/pricelists.js.map +1 -0
  85. package/dist/tools/projects.d.ts +3 -0
  86. package/dist/tools/projects.d.ts.map +1 -0
  87. package/dist/tools/projects.js +80 -0
  88. package/dist/tools/projects.js.map +1 -0
  89. package/dist/tools/supplier-invoice-payments.d.ts +3 -0
  90. package/dist/tools/supplier-invoice-payments.d.ts.map +1 -0
  91. package/dist/tools/supplier-invoice-payments.js +60 -0
  92. package/dist/tools/supplier-invoice-payments.js.map +1 -0
  93. package/dist/tools/taxreductions.d.ts +3 -0
  94. package/dist/tools/taxreductions.d.ts.map +1 -0
  95. package/dist/tools/taxreductions.js +51 -0
  96. package/dist/tools/taxreductions.js.map +1 -0
  97. package/dist/views.d.ts +20 -0
  98. package/dist/views.d.ts.map +1 -1
  99. package/dist/views.js +177 -0
  100. package/dist/views.js.map +1 -1
  101. package/package.json +1 -1
package/README.md CHANGED
@@ -39,14 +39,21 @@ Fortnox product plans, API activation requirements, and integration licensing ca
39
39
  - Copy your **Client ID** and **Client Secret**
40
40
  4. On the **Integration** tab, enable these scopes under **Behörigheter** / **Permissions**:
41
41
 
42
- | Swedish (SV) | English (EN) |
43
- |----------------------|---------------------|
44
- | Artikel | Article |
45
- | Bokföring | Bookkeeping |
46
- | Faktura | Invoice |
47
- | Företagsinformation | Company Information |
48
- | Inställningar | Settings |
49
- | Kund | Customer |
42
+ | Swedish (SV) | English (EN) | Needed for |
43
+ |----------------------|---------------------|------------------------------------------------|
44
+ | Artikel | Article | Articles, prices, price lists |
45
+ | Bokföring | Bookkeeping | Vouchers, accounts, financial reports |
46
+ | Faktura | Invoice | Invoices, invoice payments, offers, orders, tax reductions |
47
+ | Företagsinformation | Company Information | Company info |
48
+ | Inställningar | Settings | Financial year, locked period |
49
+ | Kund | Customer | Customers |
50
+ | Leverantör | Supplier | Suppliers |
51
+ | Leverantörsfaktura | Supplier Invoice | Supplier invoices, supplier invoice payments |
52
+ | Projekt | Project | Projects |
53
+ | Kostnadsställe | Cost Center | Cost centers |
54
+ | Priser | Price | Price lists, prices |
55
+
56
+ Enable every scope for the resources you intend to use. Missing scopes surface as `403 Forbidden` with a hint pointing at the right one.
50
57
 
51
58
  5. Save the integration
52
59
 
@@ -108,45 +115,199 @@ node dist/cli.js company info
108
115
 
109
116
  You should see your company name, organisation number, and address. If this works, you're all set.
110
117
 
118
+ ## Profiles (multi-tenant)
119
+
120
+ noxctl supports multiple Fortnox tenants from a single installation — useful if you bookkeep for several companies, or want to keep a sandbox tenant separate from production. Each profile has its own OAuth credentials in the OS secure store (macOS Keychain / Linux Secret Service / Windows DPAPI), keyed by profile name.
121
+
122
+ ### Running against a specific profile
123
+
124
+ Three ways to pick the profile, in precedence order (highest wins):
125
+
126
+ 1. **`--profile <name>` flag** — explicit, per-command
127
+ 2. **`NOXCTL_PROFILE` environment variable** — scoped to a shell session
128
+ 3. **Active pointer** — `~/.fortnox-mcp/active-profile`, set by `noxctl profile use`
129
+
130
+ If none of these is set, noxctl uses the `default` profile (what existing users have been using all along — no opt-in required).
131
+
132
+ ```bash
133
+ noxctl init --profile staging # authorize a second tenant
134
+ noxctl --profile staging invoices list # one-off against staging
135
+ NOXCTL_PROFILE=staging noxctl company info # shell-scoped
136
+ noxctl profile use staging # sticky — persists to the pointer
137
+ noxctl profile current # show resolved profile + source
138
+ noxctl profile list # list known profiles
139
+ ```
140
+
141
+ ### MCP server
142
+
143
+ When launched by Claude Desktop / claude.ai, the MCP server resolves the profile from `NOXCTL_PROFILE` and the active pointer at startup, and binds for the session. When launched via `noxctl --profile <name> serve`, the CLI forwards the flag.
144
+
145
+ To run multiple MCP servers (one per tenant) in parallel, register them with distinct names and scoped environments:
146
+
147
+ ```bash
148
+ claude mcp add fortnox-prod -- npx noxctl serve
149
+ claude mcp add fortnox-staging -e NOXCTL_PROFILE=staging -- npx noxctl serve
150
+ ```
151
+
152
+ Non-default sessions print a `[profile: <name>]` stderr banner on startup and prefix every Fortnox API error and token-refresh failure with the same tag so mis-bound sessions are diagnosable from a single error line.
153
+
154
+ ### Fail-closed pointer semantics
155
+
156
+ If the active pointer becomes unreadable or corrupt and no explicit `--profile` flag or `NOXCTL_PROFILE` is set, `noxctl serve` **refuses to start** rather than silently falling back to `default`. This prevents a corrupted pointer from routing production MCP sessions to the wrong tenant. The CLI's `doctor` and `profile use` commands are exempt — they can still run against a broken pointer so you can repair it.
157
+
111
158
  ## Tools
112
159
 
113
- Every operation is available both as a CLI command and as an MCP tool. The CLI is the primary interface; the MCP server exposes the same operations to AI agents.
160
+ Every operation is available both as a CLI command and as an MCP tool. The CLI is the primary interface; the MCP server exposes the same operations to AI agents. All mutations — every row labeled `(mutation)` — prompt for confirmation on a TTY and require `--yes` (CLI) or `confirm: true` (MCP) when piped. See [Mutation safety](#mutation-safety).
114
161
 
115
162
  ### Customers
116
163
 
117
164
  | CLI | MCP tool | Description |
118
165
  |-----|----------|-------------|
119
166
  | `noxctl customers list [--search <term>]` | `fortnox_list_customers` | List/search customers |
120
- | `noxctl customers get <number>` | `fortnox_get_customer` | Get a single customer by customer number |
121
- | `noxctl customers create --name <name>` | `fortnox_create_customer` | Create a new customer (mutation) |
122
- | `noxctl customers update <number> --input <file>` | `fortnox_update_customer` | Update an existing customer (mutation) |
167
+ | `noxctl customers get <number>` | `fortnox_get_customer` | Get a single customer |
168
+ | `noxctl customers create --name <name>` | `fortnox_create_customer` | Create a customer (mutation) |
169
+ | `noxctl customers update <number> --input <file>` | `fortnox_update_customer` | Update a customer (mutation) |
170
+
171
+ ### Suppliers
172
+
173
+ | CLI | MCP tool | Description |
174
+ |-----|----------|-------------|
175
+ | `noxctl suppliers list [--search <term>]` | `fortnox_list_suppliers` | List/search suppliers |
176
+ | `noxctl suppliers get <number>` | `fortnox_get_supplier` | Get a single supplier |
177
+ | `noxctl suppliers create --name <name>` | `fortnox_create_supplier` | Create a supplier (mutation) |
178
+ | `noxctl suppliers update <number> --input <file>` | `fortnox_update_supplier` | Update a supplier (mutation) |
179
+
180
+ ### Articles
181
+
182
+ | CLI | MCP tool | Description |
183
+ |-----|----------|-------------|
184
+ | `noxctl articles list [--search <term>]` | `fortnox_list_articles` | List/search articles |
185
+ | `noxctl articles get <number>` | `fortnox_get_article` | Get a single article |
186
+ | `noxctl articles create --description <text>` | `fortnox_create_article` | Create an article (mutation) |
187
+ | `noxctl articles update <number> --input <file>` | `fortnox_update_article` | Update an article (mutation) |
123
188
 
124
189
  ### Invoices
125
190
 
126
191
  | CLI | MCP tool | Description |
127
192
  |-----|----------|-------------|
128
193
  | `noxctl invoices list [--filter <status>] [--customer <number>]` | `fortnox_list_invoices` | List/filter invoices. Filters: `cancelled`, `fullypaid`, `unpaid`, `unpaidoverdue`, `unbooked` |
129
- | `noxctl invoices get <docNumber>` | `fortnox_get_invoice` | Get a single invoice by document number |
130
- | `noxctl invoices create --customer <number> --input <file>` | `fortnox_create_invoice` | Create an invoice with line items (mutation) |
194
+ | `noxctl invoices get <docNumber>` | `fortnox_get_invoice` | Get a single invoice |
195
+ | `noxctl invoices create --customer <number> --input <file>` | `fortnox_create_invoice` | Create an invoice (mutation) |
131
196
  | `noxctl invoices update <docNumber> --input <file>` | `fortnox_update_invoice` | Update an invoice that has not been bookkeept (mutation) |
132
- | `noxctl invoices send <docNumber> [--method email\|print\|einvoice] [--subject <s>] [--body <s>] [--bcc <email>]` | `fortnox_send_invoice` | Send invoice via email (default), print, or e-invoice. Supports email subject, body, and BCC (Blind Carbon Copy) (mutation) |
133
- | `noxctl invoices bookkeep <docNumber>` | `fortnox_bookkeep_invoice` | Book an invoice (mutation) |
197
+ | `noxctl invoices send <docNumber> [--method email\|print\|einvoice] [--subject <s>] [--body <s>] [--bcc <email>]` | `fortnox_send_invoice` | Send via email (default), print, or e-invoice (mutation) |
198
+ | `noxctl invoices bookkeep <docNumber>` | `fortnox_bookkeep_invoice` | Bookkeep an invoice (mutation) |
134
199
  | `noxctl invoices credit <docNumber>` | `fortnox_credit_invoice` | Credit an invoice (mutation) |
135
200
 
201
+ ### Invoice payments (inbetalningar)
202
+
203
+ | CLI | MCP tool | Description |
204
+ |-----|----------|-------------|
205
+ | `noxctl invoice-payments list [--invoice <number>]` / alias `noxctl ip list` | `fortnox_list_invoice_payments` | List invoice payments |
206
+ | `noxctl invoice-payments get <number>` | `fortnox_get_invoice_payment` | Get a single invoice payment |
207
+ | `noxctl invoice-payments create --invoice <n> --amount <a> --date <date>` | `fortnox_create_invoice_payment` | Register a payment against an invoice (mutation) |
208
+ | `noxctl invoice-payments bookkeep <number>` | — | Bookkeep an invoice payment (mutation) |
209
+ | `noxctl invoice-payments delete <number>` | `fortnox_delete_invoice_payment` | Delete an invoice payment (mutation) |
210
+
211
+ ### Supplier invoices (leverantörsfakturor)
212
+
213
+ | CLI | MCP tool | Description |
214
+ |-----|----------|-------------|
215
+ | `noxctl supplier-invoices list [--filter <status>] [--supplier <number>]` / alias `si list` | `fortnox_list_supplier_invoices` | List/filter supplier invoices |
216
+ | `noxctl supplier-invoices get <givenNumber>` | `fortnox_get_supplier_invoice` | Get a single supplier invoice |
217
+ | `noxctl supplier-invoices create --supplier <n> --input <file>` | `fortnox_create_supplier_invoice` | Create a supplier invoice (mutation) |
218
+ | `noxctl supplier-invoices bookkeep <givenNumber>` | `fortnox_bookkeep_supplier_invoice` | Bookkeep a supplier invoice (mutation) |
219
+
220
+ ### Supplier invoice payments (utbetalningar)
221
+
222
+ | CLI | MCP tool | Description |
223
+ |-----|----------|-------------|
224
+ | `noxctl supplier-invoice-payments list [--invoice <number>]` / alias `sip list` | `fortnox_list_supplier_invoice_payments` | List supplier invoice payments |
225
+ | `noxctl supplier-invoice-payments get <number>` | `fortnox_get_supplier_invoice_payment` | Get a single supplier invoice payment |
226
+ | `noxctl supplier-invoice-payments create --invoice <n> --amount <a> --date <date>` | `fortnox_create_supplier_invoice_payment` | Register a payment against a supplier invoice (mutation) |
227
+ | `noxctl supplier-invoice-payments delete <number>` | `fortnox_delete_supplier_invoice_payment` | Delete a supplier invoice payment (mutation) |
228
+
229
+ ### Offers (offerter)
230
+
231
+ | CLI | MCP tool | Description |
232
+ |-----|----------|-------------|
233
+ | `noxctl offers list [--filter <status>] [--customer <number>]` | `fortnox_list_offers` | List/filter offers. Filters: `cancelled`, `expired`, `ordercreated`, `invoicecreated` |
234
+ | `noxctl offers get <docNumber>` | `fortnox_get_offer` | Get a single offer |
235
+ | `noxctl offers create --customer <number> --input <file>` | `fortnox_create_offer` | Create an offer (mutation) |
236
+ | `noxctl offers update <docNumber> --input <file>` | `fortnox_update_offer` | Update an offer (mutation) |
237
+ | `noxctl offers create-invoice <docNumber>` | `fortnox_create_invoice_from_offer` | Convert offer → invoice (mutation) |
238
+ | `noxctl offers create-order <docNumber>` | `fortnox_create_order_from_offer` | Convert offer → order (mutation) |
239
+
240
+ ### Orders (ordrar)
241
+
242
+ | CLI | MCP tool | Description |
243
+ |-----|----------|-------------|
244
+ | `noxctl orders list [--filter <status>] [--customer <number>]` | `fortnox_list_orders` | List/filter orders. Filters: `cancelled`, `invoicecreated`, `invoicenotcreated` |
245
+ | `noxctl orders get <docNumber>` | `fortnox_get_order` | Get a single order |
246
+ | `noxctl orders create --customer <number> --input <file>` | `fortnox_create_order` | Create an order (mutation) |
247
+ | `noxctl orders update <docNumber> --input <file>` | `fortnox_update_order` | Update an order (mutation) |
248
+ | `noxctl orders create-invoice <docNumber>` | `fortnox_create_invoice_from_order` | Convert order → invoice (mutation) |
249
+
136
250
  ### Bookkeeping
137
251
 
138
252
  | CLI | MCP tool | Description |
139
253
  |-----|----------|-------------|
140
254
  | `noxctl vouchers list [--series <s>] [--from <date>] [--to <date>]` | `fortnox_list_vouchers` | List vouchers, optionally filtered by series and date range |
255
+ | `noxctl vouchers get <series> <number>` | `fortnox_get_voucher` | Get a single voucher with rows |
141
256
  | `noxctl vouchers create --input <file>` | `fortnox_create_voucher` | Create a voucher with debit/credit rows (mutation) |
142
257
  | `noxctl accounts list [--search <term>]` | `fortnox_list_accounts` | View chart of accounts, search by name or number |
143
258
 
259
+ ### Financial reports
260
+
261
+ | CLI | MCP tool | Description |
262
+ |-----|----------|-------------|
263
+ | `noxctl reports income [--year <n>] [--from <date>] [--to <date>]` / alias `reports resultat` | `fortnox_income_statement` | Income statement (resultaträkning) |
264
+ | `noxctl reports balance [--year <n>] [--to <date>]` / alias `reports balans` | `fortnox_balance_sheet` | Balance sheet (balansräkning) |
265
+
144
266
  ### Tax
145
267
 
146
268
  | CLI | MCP tool | Description |
147
269
  |-----|----------|-------------|
148
270
  | `noxctl tax report --from <date> --to <date>` | `fortnox_tax_report` | Informational VAT summary for a period. Reconcile against Fortnox before filing. Dates in `YYYY-MM-DD` format |
149
271
 
272
+ ### Tax reductions (ROT/RUT)
273
+
274
+ | CLI | MCP tool | Description |
275
+ |-----|----------|-------------|
276
+ | `noxctl tax-reductions list [--filter <type>]` | `fortnox_list_taxreductions` | List tax reductions (ROT/RUT) |
277
+ | `noxctl tax-reductions get <id>` | `fortnox_get_taxreduction` | Get a single tax reduction |
278
+ | `noxctl tax-reductions create --reference <n> --type <rot\|rut> --document-type <type> --customer-name <name> --amount <öre>` | `fortnox_create_taxreduction` | Create a ROT/RUT tax reduction (mutation) |
279
+
280
+ ### Projects
281
+
282
+ | CLI | MCP tool | Description |
283
+ |-----|----------|-------------|
284
+ | `noxctl projects list` | `fortnox_list_projects` | List projects |
285
+ | `noxctl projects get <number>` | `fortnox_get_project` | Get a single project |
286
+ | `noxctl projects create --description <text>` | `fortnox_create_project` | Create a project (mutation) |
287
+ | `noxctl projects update <number> --input <file>` | `fortnox_update_project` | Update a project (mutation) |
288
+
289
+ ### Cost centers (kostnadsställen)
290
+
291
+ | CLI | MCP tool | Description |
292
+ |-----|----------|-------------|
293
+ | `noxctl costcenters list` | `fortnox_list_costcenters` | List cost centers |
294
+ | `noxctl costcenters get <code>` | `fortnox_get_costcenter` | Get a single cost center |
295
+ | `noxctl costcenters create --code <code> --description <text>` | `fortnox_create_costcenter` | Create a cost center (mutation) |
296
+ | `noxctl costcenters update <code> --input <file>` | `fortnox_update_costcenter` | Update a cost center (mutation) |
297
+ | `noxctl costcenters delete <code>` | `fortnox_delete_costcenter` | Delete a cost center (mutation) |
298
+
299
+ ### Price lists and prices
300
+
301
+ | CLI | MCP tool | Description |
302
+ |-----|----------|-------------|
303
+ | `noxctl pricelists list` | `fortnox_list_pricelists` | List price lists |
304
+ | `noxctl pricelists get <code>` | `fortnox_get_pricelist` | Get a single price list |
305
+ | `noxctl pricelists create --code <code> --description <text>` | `fortnox_create_pricelist` | Create a price list (mutation) |
306
+ | `noxctl pricelists update <code> --input <file>` | `fortnox_update_pricelist` | Update a price list (mutation) |
307
+ | `noxctl prices list --pricelist <code> [--article <number>]` | `fortnox_list_prices` | List prices within a price list |
308
+ | `noxctl prices get --pricelist <code> --article <number>` | `fortnox_get_price` | Get a specific price |
309
+ | `noxctl prices update --pricelist <code> --article <number> --input <file>` | `fortnox_update_price` | Update a price (mutation) |
310
+
150
311
  ### Company
151
312
 
152
313
  | CLI | MCP tool | Description |
@@ -160,6 +321,9 @@ Every operation is available both as a CLI command and as an MCP tool. The CLI i
160
321
  | `noxctl init` | — | Interactive setup wizard — connects to Fortnox, stores credentials, optionally registers MCP server |
161
322
  | `noxctl doctor` | `fortnox_status` | Validate setup: Node version, credentials, token status, API connectivity, and scopes |
162
323
  | `noxctl logout` | — | Remove stored credentials from the OS keychain |
324
+ | `noxctl profile use <name>` | — | Set the active profile (writes `~/.fortnox-mcp/active-profile`) |
325
+ | `noxctl profile current` | — | Show the currently resolved profile and where it came from |
326
+ | `noxctl profile list` | — | List known profiles from the index |
163
327
 
164
328
  ## CLI output
165
329
 
@@ -228,16 +392,18 @@ Ask Claude naturally — works in both Swedish and English:
228
392
 
229
393
  ## Troubleshooting
230
394
 
231
- **"FORTNOX_CLIENT_ID and FORTNOX_CLIENT_SECRET must be set"**
395
+ **"stdin is not a TTY. Set FORTNOX_CLIENT_ID and FORTNOX_CLIENT_SECRET env vars to run non-interactively"**
232
396
 
233
- Environment variables were not passed to the command. Use `export` to set them in your shell first:
397
+ `noxctl init` is normally interactive it prompts for the Client ID and Secret. In CI or other non-TTY contexts it falls back to reading them from environment variables:
234
398
 
235
399
  ```bash
236
400
  export FORTNOX_CLIENT_ID=<your-id>
237
401
  export FORTNOX_CLIENT_SECRET=<your-secret>
402
+ export FORTNOX_SERVICE_ACCOUNT=1 # optional, enables service account mode
403
+ noxctl init
238
404
  ```
239
405
 
240
- Then run setup again. This avoids issues with long commands wrapping across lines.
406
+ Once authorized, the tokens are stored in the OS keychain. No env vars are needed afterwards only for re-running `init` non-interactively.
241
407
 
242
408
  **"Not authenticated. Run `noxctl init`"**
243
409
 
@@ -245,16 +411,7 @@ Credentials are missing or were not saved. Re-run the setup step. On macOS, chec
245
411
 
246
412
  **403 Forbidden from Fortnox API**
247
413
 
248
- Your app is missing required scopes. Go to [developer.fortnox.se](https://developer.fortnox.se/), open your app, and check that these are enabled under **Behörigheter** / **Permissions**:
249
-
250
- | Swedish (SV) | English (EN) |
251
- |----------------------|---------------------|
252
- | Artikel | Article |
253
- | Bokföring | Bookkeeping |
254
- | Faktura | Invoice |
255
- | Företagsinformation | Company Information |
256
- | Inställningar | Settings |
257
- | Kund | Customer |
414
+ Your app is missing one or more scopes. The error message names the specific scope needed (e.g. `Missing "supplier" scope`). Go to [developer.fortnox.se](https://developer.fortnox.se/), open your app, and enable the matching permission under **Behörigheter** / **Permissions** — see the full table in [Setup → Create a Fortnox app](#1-create-a-fortnox-app). Then re-run `noxctl init`.
258
415
 
259
416
  **"Token refresh failed"**
260
417
 
package/dist/auth.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export declare const SCOPES = "article customer invoice supplier supplierinvoice bookkeeping companyinformation settings";
1
+ export declare const SCOPES = "article customer invoice payment supplier supplierinvoice bookkeeping companyinformation settings";
2
+ export declare const CREDENTIAL_SCHEMA_VERSION = 2;
2
3
  export interface FortnoxCredentials {
3
4
  client_id: string;
4
5
  client_secret: string;
@@ -6,24 +7,31 @@ export interface FortnoxCredentials {
6
7
  refresh_token: string;
7
8
  expires_at: number;
8
9
  tenant_id?: string;
10
+ company_name?: string;
11
+ schema_version?: number;
12
+ last_write_epoch?: number;
9
13
  }
10
14
  export interface FortnoxAppConfig {
11
15
  clientId: string;
12
16
  clientSecret: string;
13
17
  serviceAccount?: boolean;
14
18
  }
15
- export declare function loadCredentials(): Promise<FortnoxCredentials | null>;
16
- export declare function saveCredentials(creds: FortnoxCredentials): Promise<void>;
19
+ export declare function setResolvedProfile(name: string): void;
20
+ export declare function getResolvedProfile(): string;
21
+ export declare function __resetLegacyObservedForDefault(): void;
22
+ export declare function loadCredentials(profile?: string): Promise<FortnoxCredentials | null>;
23
+ export declare function saveCredentials(creds: FortnoxCredentials, profile?: string): Promise<void>;
17
24
  export declare function exchangeCodeForTokens(code: string, redirectUri: string, config: FortnoxAppConfig): Promise<{
18
25
  access_token: string;
19
26
  refresh_token: string;
20
27
  expires_in: number;
21
28
  }>;
22
- export declare function getTokenViaClientCredentials(creds: FortnoxCredentials): Promise<FortnoxCredentials>;
23
- export declare function refreshAccessToken(creds: FortnoxCredentials): Promise<FortnoxCredentials>;
24
- export declare function getValidToken(): Promise<string>;
29
+ export declare function getTokenViaClientCredentials(creds: FortnoxCredentials, profile?: string): Promise<FortnoxCredentials>;
30
+ export declare function refreshAccessToken(creds: FortnoxCredentials, profile?: string): Promise<FortnoxCredentials>;
31
+ export declare function getValidToken(profile?: string): Promise<string>;
25
32
  export declare function fetchTenantId(accessToken: string): Promise<string | undefined>;
33
+ export declare function fetchCompanyNameSafe(accessToken: string): Promise<string | undefined>;
26
34
  export declare function escapeHtml(value: string): string;
27
35
  export declare function buildAuthorizationUrl(config: FortnoxAppConfig, redirectUri: string, state: string): string;
28
- export declare function runOAuthSetup(config: FortnoxAppConfig): Promise<void>;
36
+ export declare function runOAuthSetup(config: FortnoxAppConfig, profile?: string): Promise<void>;
29
37
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,MAAM,8FAC0E,CAAC;AAE9F,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAQ1E;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B9E;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAuC7B;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoC/F;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAwBrD;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAepF;AAgBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,CAeR;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G3E"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,MAAM,sGACkF,CAAC;AAEtG,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAcD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAGD,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD;AAuBD,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAwB1F;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhG;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B9E;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAwC7B;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAqC7B;AAED,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BrE;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAepF;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB3F;AAgBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,CAeR;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,MAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAgIf"}
package/dist/auth.js CHANGED
@@ -2,23 +2,84 @@ import { createServer } from 'node:http';
2
2
  import { randomBytes } from 'node:crypto';
3
3
  import { execFileSync } from 'node:child_process';
4
4
  import { loadCredentialBlob, saveCredentialBlob } from './credentials-store.js';
5
+ import { DEFAULT_PROFILE, validateProfileName } from './profile-name.js';
6
+ import { migrateLegacyIfNeeded, readProfileIndex, upsertProfile } from './profiles.js';
5
7
  const FORTNOX_AUTH_URL = 'https://apps.fortnox.se/oauth-v1/auth';
6
8
  const FORTNOX_TOKEN_URL = 'https://apps.fortnox.se/oauth-v1/token';
7
9
  const CALLBACK_HOST = '127.0.0.1';
8
- export const SCOPES = 'article customer invoice supplier supplierinvoice bookkeeping companyinformation settings';
9
- export async function loadCredentials() {
10
+ export const SCOPES = 'article customer invoice payment supplier supplierinvoice bookkeeping companyinformation settings';
11
+ export const CREDENTIAL_SCHEMA_VERSION = 2;
12
+ // Module-global resolved profile. This assumes a single-tenant process model
13
+ // (one CLI invocation or one MCP stdio connection per Node process). Hosting
14
+ // multiple Fortnox MCP servers in the same process is not supported — every
15
+ // instance would share this state. Revisit if the MCP SDK grows request-local
16
+ // context that handlers can read.
17
+ let resolvedProfile = DEFAULT_PROFILE;
18
+ // Whether the legacy (pre-0.2) credential slot was observed on the most recent
19
+ // successful load of the default profile. Set only by loadCredentials; read by
20
+ // saveCredentials to decide whether to dual-write during the 0.2.x window.
21
+ let legacyObservedForDefault = false;
22
+ export function setResolvedProfile(name) {
23
+ resolvedProfile = validateProfileName(name);
24
+ }
25
+ export function getResolvedProfile() {
26
+ return resolvedProfile;
27
+ }
28
+ // Test-only: reset module-level observation state between cases.
29
+ export function __resetLegacyObservedForDefault() {
30
+ legacyObservedForDefault = false;
31
+ }
32
+ function profileOrResolved(profile) {
33
+ return profile ?? resolvedProfile;
34
+ }
35
+ function isDefaultProfile(name) {
36
+ return name.toLowerCase() === DEFAULT_PROFILE;
37
+ }
38
+ function profileTag(name) {
39
+ return isDefaultProfile(name) ? '' : `[profile: ${name}] `;
40
+ }
41
+ function legacySlotExists(source) {
42
+ return (source === 'legacy' ||
43
+ source === 'both-new-preferred' ||
44
+ source === 'both-legacy-preferred' ||
45
+ source === 'legacy-plaintext');
46
+ }
47
+ export async function loadCredentials(profile) {
48
+ const target = profileOrResolved(profile);
49
+ let result;
10
50
  try {
11
- const data = await loadCredentialBlob();
12
- if (!data)
13
- return null;
14
- return JSON.parse(data);
51
+ result = await loadCredentialBlob(target);
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ if (isDefaultProfile(target) && legacySlotExists(result.source)) {
57
+ legacyObservedForDefault = true;
58
+ // Best-effort seeding of the profile index for pre-0.2 installs. Seed from
59
+ // the raw legacy blob — not result.blob, which may be the new slot if
60
+ // pickHigher preferred it and would lose legacy-only metadata on drift.
61
+ // A failure here must not break auth — Chunk D's `doctor` will surface it.
62
+ await migrateLegacyIfNeeded(result.legacyBlob);
63
+ }
64
+ if (!result.blob)
65
+ return null;
66
+ try {
67
+ return JSON.parse(result.blob);
15
68
  }
16
69
  catch {
17
70
  return null;
18
71
  }
19
72
  }
20
- export async function saveCredentials(creds) {
21
- await saveCredentialBlob(JSON.stringify(creds));
73
+ export async function saveCredentials(creds, profile) {
74
+ const target = profileOrResolved(profile);
75
+ const stamped = {
76
+ ...creds,
77
+ schema_version: CREDENTIAL_SCHEMA_VERSION,
78
+ last_write_epoch: Date.now(),
79
+ };
80
+ await saveCredentialBlob(JSON.stringify(stamped), target, {
81
+ alsoWriteLegacy: isDefaultProfile(target) && legacyObservedForDefault,
82
+ });
22
83
  }
23
84
  export async function exchangeCodeForTokens(code, redirectUri, config) {
24
85
  const body = new URLSearchParams({
@@ -40,9 +101,10 @@ export async function exchangeCodeForTokens(code, redirectUri, config) {
40
101
  }
41
102
  return (await response.json());
42
103
  }
43
- export async function getTokenViaClientCredentials(creds) {
104
+ export async function getTokenViaClientCredentials(creds, profile) {
105
+ const tag = profileTag(profileOrResolved(profile));
44
106
  if (!creds.tenant_id) {
45
- throw new Error('No tenant_id available — cannot use client credentials flow');
107
+ throw new Error(`${tag}No tenant_id available — cannot use client credentials flow`);
46
108
  }
47
109
  const body = new URLSearchParams({
48
110
  grant_type: 'client_credentials',
@@ -59,7 +121,7 @@ export async function getTokenViaClientCredentials(creds) {
59
121
  });
60
122
  if (!response.ok) {
61
123
  const text = await response.text();
62
- throw new Error(`Client credentials token request failed (${response.status}): ${text}`);
124
+ throw new Error(`${tag}Client credentials token request failed (${response.status}): ${text}`);
63
125
  }
64
126
  const data = (await response.json());
65
127
  const updated = {
@@ -67,10 +129,11 @@ export async function getTokenViaClientCredentials(creds) {
67
129
  access_token: data.access_token,
68
130
  expires_at: Date.now() + data.expires_in * 1000,
69
131
  };
70
- await saveCredentials(updated);
132
+ await saveCredentials(updated, profile);
71
133
  return updated;
72
134
  }
73
- export async function refreshAccessToken(creds) {
135
+ export async function refreshAccessToken(creds, profile) {
136
+ const tag = profileTag(profileOrResolved(profile));
74
137
  const body = new URLSearchParams({
75
138
  grant_type: 'refresh_token',
76
139
  refresh_token: creds.refresh_token,
@@ -85,7 +148,7 @@ export async function refreshAccessToken(creds) {
85
148
  });
86
149
  if (!response.ok) {
87
150
  const text = await response.text();
88
- throw new Error(`Token refresh failed (${response.status}): ${text}`);
151
+ throw new Error(`${tag}Token refresh failed (${response.status}): ${text}`);
89
152
  }
90
153
  const data = (await response.json());
91
154
  const updated = {
@@ -94,13 +157,17 @@ export async function refreshAccessToken(creds) {
94
157
  refresh_token: data.refresh_token,
95
158
  expires_at: Date.now() + data.expires_in * 1000,
96
159
  };
97
- await saveCredentials(updated);
160
+ await saveCredentials(updated, profile);
98
161
  return updated;
99
162
  }
100
- export async function getValidToken() {
101
- const creds = await loadCredentials();
163
+ export async function getValidToken(profile) {
164
+ const target = profileOrResolved(profile);
165
+ const creds = await loadCredentials(target);
102
166
  if (!creds) {
103
- throw new Error('Not authenticated. Run `noxctl init` to connect your Fortnox account.');
167
+ const initCmd = isDefaultProfile(target)
168
+ ? '`noxctl init`'
169
+ : `\`noxctl init --profile ${target}\``;
170
+ throw new Error(`${profileTag(target)}Not authenticated. Run ${initCmd} to connect your Fortnox account.`);
104
171
  }
105
172
  // Token still valid — use it
106
173
  if (Date.now() <= creds.expires_at - 5 * 60 * 1000) {
@@ -109,7 +176,7 @@ export async function getValidToken() {
109
176
  // Prefer client credentials when tenant_id is available (no refresh token management needed)
110
177
  if (creds.tenant_id) {
111
178
  try {
112
- const refreshed = await getTokenViaClientCredentials(creds);
179
+ const refreshed = await getTokenViaClientCredentials(creds, target);
113
180
  return refreshed.access_token;
114
181
  }
115
182
  catch {
@@ -117,7 +184,7 @@ export async function getValidToken() {
117
184
  }
118
185
  }
119
186
  // Fallback: standard refresh token flow
120
- const refreshed = await refreshAccessToken(creds);
187
+ const refreshed = await refreshAccessToken(creds, target);
121
188
  return refreshed.access_token;
122
189
  }
123
190
  export async function fetchTenantId(accessToken) {
@@ -132,6 +199,23 @@ export async function fetchTenantId(accessToken) {
132
199
  const data = (await response.json());
133
200
  return data.CompanyInformation?.DatabaseNumber;
134
201
  }
202
+ export async function fetchCompanyNameSafe(accessToken) {
203
+ try {
204
+ const response = await fetch('https://api.fortnox.se/3/companyinformation', {
205
+ headers: {
206
+ Authorization: `Bearer ${accessToken}`,
207
+ Accept: 'application/json',
208
+ },
209
+ });
210
+ if (!response.ok)
211
+ return undefined;
212
+ const data = (await response.json());
213
+ return data.CompanyInformation?.CompanyName;
214
+ }
215
+ catch {
216
+ return undefined;
217
+ }
218
+ }
135
219
  function openBrowser(url) {
136
220
  try {
137
221
  if (process.platform === 'darwin') {
@@ -170,7 +254,8 @@ export function buildAuthorizationUrl(config, redirectUri, state) {
170
254
  }
171
255
  return `${FORTNOX_AUTH_URL}?${params.toString()}`;
172
256
  }
173
- export async function runOAuthSetup(config) {
257
+ export async function runOAuthSetup(config, profile = DEFAULT_PROFILE) {
258
+ const validatedProfile = validateProfileName(profile);
174
259
  const PORT = 9876;
175
260
  const REDIRECT_URI = `http://localhost:${PORT}/callback`;
176
261
  const oauthState = randomBytes(24).toString('hex');
@@ -219,6 +304,7 @@ export async function runOAuthSetup(config) {
219
304
  // Fetch tenant_id for client credentials flow
220
305
  console.log('Fetching tenant ID...');
221
306
  const tenantId = await fetchTenantId(tokens.access_token);
307
+ const companyName = await fetchCompanyNameSafe(tokens.access_token);
222
308
  const creds = {
223
309
  client_id: config.clientId,
224
310
  client_secret: config.clientSecret,
@@ -226,8 +312,23 @@ export async function runOAuthSetup(config) {
226
312
  refresh_token: tokens.refresh_token,
227
313
  expires_at: Date.now() + tokens.expires_in * 1000,
228
314
  tenant_id: tenantId,
315
+ company_name: companyName,
229
316
  };
230
- await saveCredentials(creds);
317
+ // Preserve the original created_at when re-authenticating an existing
318
+ // profile so the index timestamp reflects first auth, not the most
319
+ // recent one. Upsert BEFORE saveCredentials so a filesystem failure
320
+ // here can't leave a credential blob without a matching index entry —
321
+ // `logout --all` enumerates via the index, so a silent orphan would
322
+ // mean creds in the keychain that bulk-logout can't see.
323
+ const existing = (await readProfileIndex()).profiles.find((p) => p.name.toLowerCase() === validatedProfile.toLowerCase());
324
+ await upsertProfile({
325
+ name: validatedProfile,
326
+ tenant_id: tenantId,
327
+ company_name: companyName,
328
+ created_at: existing?.created_at ?? new Date().toISOString(),
329
+ schema_version: 2,
330
+ });
331
+ await saveCredentials(creds, validatedProfile);
231
332
  const tenantMsg = tenantId
232
333
  ? ' Client credentials flow enabled.'
233
334
  : ' (Tenant ID not found — using refresh token flow.)';
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ import { type ResolvedProfile } from './profiles.js';
3
+ export declare function getResolvedProfileInfo(): ResolvedProfile;
3
4
  //# sourceMappingURL=cli.d.ts.map