@kirjapro/mcp-server 0.5.8 → 0.5.9
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/dist/index.js +51 -213
- package/package.json +1 -1
- package/server.json +1 -1
- package/tool-fingerprints.json +2 -6
package/dist/index.js
CHANGED
|
@@ -34012,50 +34012,6 @@ var ACCOUNTS = {
|
|
|
34012
34012
|
VAKUUTUKSET: "7970"
|
|
34013
34013
|
};
|
|
34014
34014
|
|
|
34015
|
-
// src/compliance/rates.ts
|
|
34016
|
-
var FINNISH_RATES_2026 = {
|
|
34017
|
-
year: 2026,
|
|
34018
|
-
validFrom: "2026-01-01",
|
|
34019
|
-
validUntil: "2026-12-31",
|
|
34020
|
-
sourcesVerifiedAt: "2026-03-15",
|
|
34021
|
-
source: "AVL 1501/1993, ETK 2026, Elo 2026, vero.fi 2026",
|
|
34022
|
-
vat: {
|
|
34023
|
-
standard: 25.5,
|
|
34024
|
-
reduced: 13.5,
|
|
34025
|
-
secondReduced: 10,
|
|
34026
|
-
zero: 0
|
|
34027
|
-
},
|
|
34028
|
-
social: {
|
|
34029
|
-
tyelEmployee: 7.3,
|
|
34030
|
-
tyelEmployer: 17.55,
|
|
34031
|
-
tyelEmployerAverage: 17.1,
|
|
34032
|
-
tyelKeskimaarainen: 24.4,
|
|
34033
|
-
tyelPerusmaksu: 24.85,
|
|
34034
|
-
sotu: 1.91,
|
|
34035
|
-
ttvEmployer: 0.31,
|
|
34036
|
-
ttvEmployerLarge: 1.23,
|
|
34037
|
-
ttvEmployerLargeThreshold: 2509500,
|
|
34038
|
-
ttvEmployee: 0.89,
|
|
34039
|
-
tapaturmaAverage: 0.51,
|
|
34040
|
-
ryhmahenki: 0.06
|
|
34041
|
-
}
|
|
34042
|
-
};
|
|
34043
|
-
function freshnessMeta(rates = FINNISH_RATES_2026, today = /* @__PURE__ */ new Date()) {
|
|
34044
|
-
const validUntil = /* @__PURE__ */ new Date(`${rates.validUntil}T23:59:59Z`);
|
|
34045
|
-
const msPerDay = 864e5;
|
|
34046
|
-
const daysUntilExpiry = Math.ceil(
|
|
34047
|
-
(validUntil.getTime() - today.getTime()) / msPerDay
|
|
34048
|
-
);
|
|
34049
|
-
return {
|
|
34050
|
-
published_at: rates.sourcesVerifiedAt,
|
|
34051
|
-
valid_from: rates.validFrom,
|
|
34052
|
-
valid_through: rates.validUntil,
|
|
34053
|
-
sources_verified_at: rates.sourcesVerifiedAt,
|
|
34054
|
-
stale: daysUntilExpiry < 0,
|
|
34055
|
-
days_until_expiry: daysUntilExpiry
|
|
34056
|
-
};
|
|
34057
|
-
}
|
|
34058
|
-
|
|
34059
34015
|
// src/tools/templates.ts
|
|
34060
34016
|
function splitVat(gross, vatRate) {
|
|
34061
34017
|
if (vatRate === 0) return { net: roundCents(gross), vat: 0 };
|
|
@@ -34279,36 +34235,6 @@ var TEMPLATES = [
|
|
|
34279
34235
|
opts?.accountOverrides
|
|
34280
34236
|
)
|
|
34281
34237
|
},
|
|
34282
|
-
// Salary
|
|
34283
|
-
{
|
|
34284
|
-
id: "salary_payment",
|
|
34285
|
-
description: "Palkanmaksu (bruttopalkka, ennakonpid\xE4tys, TyEL)",
|
|
34286
|
-
vatRate: null,
|
|
34287
|
-
expand: (amount, opts) => {
|
|
34288
|
-
const gross = roundCents(amount);
|
|
34289
|
-
const withholdingRate = opts?.withholdingRate ?? 20;
|
|
34290
|
-
const tyelEmployeeRate = opts?.tyelRate ?? FINNISH_RATES_2026.social.tyelEmployee;
|
|
34291
|
-
const tyelEmployerRate = FINNISH_RATES_2026.social.tyelEmployer;
|
|
34292
|
-
const withholding = roundCents(gross * withholdingRate / 100);
|
|
34293
|
-
const tyelEmployee = roundCents(gross * tyelEmployeeRate / 100);
|
|
34294
|
-
const tyelEmployer = roundCents(gross * tyelEmployerRate / 100);
|
|
34295
|
-
const netPay = roundCents(gross - withholding - tyelEmployee);
|
|
34296
|
-
return applyOverrides(
|
|
34297
|
-
[
|
|
34298
|
-
{ accountNumber: ACCOUNTS.PALKAT, debitAmount: gross, creditAmount: 0 },
|
|
34299
|
-
{ accountNumber: ACCOUNTS.ELAKEKULUT, debitAmount: tyelEmployer, creditAmount: 0 },
|
|
34300
|
-
{ accountNumber: ACCOUNTS.PANKKITILI, debitAmount: 0, creditAmount: netPay },
|
|
34301
|
-
{ accountNumber: ACCOUNTS.ENNAKONPIDATYSVELKA, debitAmount: 0, creditAmount: withholding },
|
|
34302
|
-
{
|
|
34303
|
-
accountNumber: ACCOUNTS.TYEL_VELKA,
|
|
34304
|
-
debitAmount: 0,
|
|
34305
|
-
creditAmount: roundCents(tyelEmployee + tyelEmployer)
|
|
34306
|
-
}
|
|
34307
|
-
],
|
|
34308
|
-
opts?.accountOverrides
|
|
34309
|
-
);
|
|
34310
|
-
}
|
|
34311
|
-
},
|
|
34312
34238
|
// Bank transfer
|
|
34313
34239
|
{
|
|
34314
34240
|
id: "bank_transfer",
|
|
@@ -34477,8 +34403,6 @@ function registerTemplateTools(server2) {
|
|
|
34477
34403
|
amount: external_exports.number().finite().positive().max(1e9).describe("Gross amount in EUR"),
|
|
34478
34404
|
description: external_exports.string().min(1).max(500).describe("Transaction description"),
|
|
34479
34405
|
documentNumber: external_exports.string().optional().describe("Document/receipt number"),
|
|
34480
|
-
withholdingRate: external_exports.number().min(0).max(100).optional().describe("Withholding tax % for salary_payment (default 20)"),
|
|
34481
|
-
tyelRate: external_exports.number().min(0).max(100).optional().describe("TyEL employee % for salary_payment (default 7.30)"),
|
|
34482
34406
|
accountOverrides: external_exports.record(external_exports.string(), external_exports.string()).optional().describe('Account number swaps, e.g. {"2320": "2330"}'),
|
|
34483
34407
|
idempotencyKey: IDEMPOTENCY_KEY_SCHEMA
|
|
34484
34408
|
},
|
|
@@ -34499,8 +34423,6 @@ function registerTemplateTools(server2) {
|
|
|
34499
34423
|
if ("error" in ov) return toErrorContent(ov.error);
|
|
34500
34424
|
}
|
|
34501
34425
|
const result = expandTemplate(params.template, params.amount, {
|
|
34502
|
-
withholdingRate: params.withholdingRate,
|
|
34503
|
-
tyelRate: params.tyelRate,
|
|
34504
34426
|
accountOverrides: params.accountOverrides
|
|
34505
34427
|
});
|
|
34506
34428
|
if ("error" in result) {
|
|
@@ -34542,8 +34464,6 @@ function registerTemplateTools(server2) {
|
|
|
34542
34464
|
amount: external_exports.number().finite().positive().max(1e9).describe("Gross amount in EUR"),
|
|
34543
34465
|
description: external_exports.string().min(1).max(500),
|
|
34544
34466
|
documentNumber: external_exports.string().optional(),
|
|
34545
|
-
withholdingRate: external_exports.number().min(0).max(100).optional(),
|
|
34546
|
-
tyelRate: external_exports.number().min(0).max(100).optional(),
|
|
34547
34467
|
accountOverrides: external_exports.record(external_exports.string(), external_exports.string()).optional()
|
|
34548
34468
|
})
|
|
34549
34469
|
).min(1).max(50).describe("Array of template transactions to create (max 50)"),
|
|
@@ -34600,8 +34520,6 @@ function registerTemplateTools(server2) {
|
|
|
34600
34520
|
for (let i = 0; i < params.transactions.length; i++) {
|
|
34601
34521
|
const tx = params.transactions[i];
|
|
34602
34522
|
const result2 = expandTemplate(tx.template, tx.amount, {
|
|
34603
|
-
withholdingRate: tx.withholdingRate,
|
|
34604
|
-
tyelRate: tx.tyelRate,
|
|
34605
34523
|
accountOverrides: tx.accountOverrides
|
|
34606
34524
|
});
|
|
34607
34525
|
if ("error" in result2) {
|
|
@@ -34705,6 +34623,50 @@ function registerTemplateTools(server2) {
|
|
|
34705
34623
|
);
|
|
34706
34624
|
}
|
|
34707
34625
|
|
|
34626
|
+
// src/compliance/rates.ts
|
|
34627
|
+
var FINNISH_RATES_2026 = {
|
|
34628
|
+
year: 2026,
|
|
34629
|
+
validFrom: "2026-01-01",
|
|
34630
|
+
validUntil: "2026-12-31",
|
|
34631
|
+
sourcesVerifiedAt: "2026-03-15",
|
|
34632
|
+
source: "AVL 1501/1993, ETK 2026, Elo 2026, vero.fi 2026",
|
|
34633
|
+
vat: {
|
|
34634
|
+
standard: 25.5,
|
|
34635
|
+
reduced: 13.5,
|
|
34636
|
+
secondReduced: 10,
|
|
34637
|
+
zero: 0
|
|
34638
|
+
},
|
|
34639
|
+
social: {
|
|
34640
|
+
tyelEmployee: 7.3,
|
|
34641
|
+
tyelEmployer: 17.55,
|
|
34642
|
+
tyelEmployerAverage: 17.1,
|
|
34643
|
+
tyelKeskimaarainen: 24.4,
|
|
34644
|
+
tyelPerusmaksu: 24.85,
|
|
34645
|
+
sotu: 1.91,
|
|
34646
|
+
ttvEmployer: 0.31,
|
|
34647
|
+
ttvEmployerLarge: 1.23,
|
|
34648
|
+
ttvEmployerLargeThreshold: 2509500,
|
|
34649
|
+
ttvEmployee: 0.89,
|
|
34650
|
+
tapaturmaAverage: 0.51,
|
|
34651
|
+
ryhmahenki: 0.06
|
|
34652
|
+
}
|
|
34653
|
+
};
|
|
34654
|
+
function freshnessMeta(rates = FINNISH_RATES_2026, today = /* @__PURE__ */ new Date()) {
|
|
34655
|
+
const validUntil = /* @__PURE__ */ new Date(`${rates.validUntil}T23:59:59Z`);
|
|
34656
|
+
const msPerDay = 864e5;
|
|
34657
|
+
const daysUntilExpiry = Math.ceil(
|
|
34658
|
+
(validUntil.getTime() - today.getTime()) / msPerDay
|
|
34659
|
+
);
|
|
34660
|
+
return {
|
|
34661
|
+
published_at: rates.sourcesVerifiedAt,
|
|
34662
|
+
valid_from: rates.validFrom,
|
|
34663
|
+
valid_through: rates.validUntil,
|
|
34664
|
+
sources_verified_at: rates.sourcesVerifiedAt,
|
|
34665
|
+
stale: daysUntilExpiry < 0,
|
|
34666
|
+
days_until_expiry: daysUntilExpiry
|
|
34667
|
+
};
|
|
34668
|
+
}
|
|
34669
|
+
|
|
34708
34670
|
// src/tools/bookings.ts
|
|
34709
34671
|
var DEFAULTS = {
|
|
34710
34672
|
tyelEmployee: FINNISH_RATES_2026.social.tyelEmployee,
|
|
@@ -34802,131 +34764,6 @@ function registerBookingTools(server2) {
|
|
|
34802
34764
|
);
|
|
34803
34765
|
}
|
|
34804
34766
|
);
|
|
34805
|
-
server2.registerTool(
|
|
34806
|
-
"kirjapro_book_salary",
|
|
34807
|
-
{
|
|
34808
|
-
description: "Book salary payment (palkanmaksu). Creates salary + employer cost transactions with withholding, TyEL, TTV, sotu. Default rates are 2026 Finnish social insurance rates.",
|
|
34809
|
-
inputSchema: {
|
|
34810
|
-
grossSalary: external_exports.number().finite().positive().max(1e8).describe("Gross salary EUR"),
|
|
34811
|
-
employeeName: external_exports.string().min(1).describe("Employee name (for description)"),
|
|
34812
|
-
date: ISO_DATE_SCHEMA.describe("Payment date (YYYY-MM-DD)"),
|
|
34813
|
-
withholdingRate: external_exports.number().min(0).max(100).describe("Withholding tax % (ennakonpid\xE4tys)"),
|
|
34814
|
-
tyelEmployeeRate: external_exports.number().min(0).max(100).default(DEFAULTS.tyelEmployee).describe("TyEL employee % (default 7.30)"),
|
|
34815
|
-
tyelEmployerRate: external_exports.number().min(0).max(100).default(DEFAULTS.tyelEmployer).describe("TyEL employer % (default 17.55)"),
|
|
34816
|
-
sotuRate: external_exports.number().min(0).max(100).default(DEFAULTS.sotu).describe("Sairausvakuutusmaksu employer % (default 1.91)"),
|
|
34817
|
-
ttvEmployerRate: external_exports.number().min(0).max(100).default(DEFAULTS.ttvEmployer).describe("Ty\xF6tt\xF6myysvakuutus employer % (default 0.31)"),
|
|
34818
|
-
ttvEmployeeRate: external_exports.number().min(0).max(100).default(DEFAULTS.ttvEmployee).describe("Ty\xF6tt\xF6myysvakuutus employee % (default 0.89)"),
|
|
34819
|
-
fiscalYearId: external_exports.string().uuid().optional().describe("Fiscal year UUID (auto-resolved if omitted)"),
|
|
34820
|
-
paymentAccount: external_exports.string().default(ACCOUNTS.PANKKITILI).describe(`Bank account (default "${ACCOUNTS.PANKKITILI}" Pankkitili)`),
|
|
34821
|
-
idempotencyKey: IDEMPOTENCY_KEY_SCHEMA,
|
|
34822
|
-
dryRun: DRY_RUN_SCHEMA
|
|
34823
|
-
},
|
|
34824
|
-
annotations: WRITE_ANNOTATIONS
|
|
34825
|
-
},
|
|
34826
|
-
async (params) => {
|
|
34827
|
-
const gross = roundCents(params.grossSalary);
|
|
34828
|
-
const withholding = roundCents(gross * params.withholdingRate / 100);
|
|
34829
|
-
const tyelEmployee = roundCents(gross * params.tyelEmployeeRate / 100);
|
|
34830
|
-
const ttvEmployee = roundCents(gross * params.ttvEmployeeRate / 100);
|
|
34831
|
-
const netPay = roundCents(gross - withholding - tyelEmployee - ttvEmployee);
|
|
34832
|
-
const tyelEmployer = roundCents(gross * params.tyelEmployerRate / 100);
|
|
34833
|
-
const sotuAmount = roundCents(gross * params.sotuRate / 100);
|
|
34834
|
-
const ttvEmployer = roundCents(gross * params.ttvEmployerRate / 100);
|
|
34835
|
-
if (netPay < 0) {
|
|
34836
|
-
return toErrorContent(
|
|
34837
|
-
`Net pay is negative (${netPay.toFixed(2)}). Check withholding rate (${params.withholdingRate}%) and deduction rates.`
|
|
34838
|
-
);
|
|
34839
|
-
}
|
|
34840
|
-
const supabase2 = getSupabase();
|
|
34841
|
-
const companyId2 = getCompanyId();
|
|
34842
|
-
let fiscalYearId = params.fiscalYearId;
|
|
34843
|
-
if (!fiscalYearId) {
|
|
34844
|
-
const resolved = await resolveOpenFiscalYear(supabase2, companyId2);
|
|
34845
|
-
if ("isError" in resolved) return resolved;
|
|
34846
|
-
fiscalYearId = resolved.id;
|
|
34847
|
-
}
|
|
34848
|
-
const fy = await validateFiscalYearForDate(fiscalYearId, params.date);
|
|
34849
|
-
if ("isError" in fy) return fy;
|
|
34850
|
-
const salaryEntries = [
|
|
34851
|
-
{ accountNumber: ACCOUNTS.PALKAT, debitAmount: gross, creditAmount: 0 },
|
|
34852
|
-
{ accountNumber: params.paymentAccount, debitAmount: 0, creditAmount: netPay },
|
|
34853
|
-
{ accountNumber: ACCOUNTS.ENNAKONPIDATYSVELKA, debitAmount: 0, creditAmount: withholding },
|
|
34854
|
-
{ accountNumber: ACCOUNTS.TYEL_VELKA, debitAmount: 0, creditAmount: tyelEmployee },
|
|
34855
|
-
{ accountNumber: ACCOUNTS.TTV_VELKA, debitAmount: 0, creditAmount: ttvEmployee }
|
|
34856
|
-
];
|
|
34857
|
-
const employerSotuTtv = roundCents(sotuAmount + ttvEmployer);
|
|
34858
|
-
const employerEntries = [
|
|
34859
|
-
{ accountNumber: ACCOUNTS.ELAKEKULUT, debitAmount: tyelEmployer, creditAmount: 0 },
|
|
34860
|
-
{ accountNumber: ACCOUNTS.SOSIAALITURVAMAKSUT, debitAmount: employerSotuTtv, creditAmount: 0 },
|
|
34861
|
-
{ accountNumber: ACCOUNTS.TYEL_VELKA, debitAmount: 0, creditAmount: tyelEmployer },
|
|
34862
|
-
{ accountNumber: ACCOUNTS.SOTU_VELKA, debitAmount: 0, creditAmount: sotuAmount },
|
|
34863
|
-
{ accountNumber: ACCOUNTS.TTV_VELKA, debitAmount: 0, creditAmount: ttvEmployer }
|
|
34864
|
-
];
|
|
34865
|
-
if (params.dryRun) {
|
|
34866
|
-
return toDryRunResponse("kirjapro_book_salary", {
|
|
34867
|
-
action: "book_salary",
|
|
34868
|
-
employee: params.employeeName,
|
|
34869
|
-
date: params.date,
|
|
34870
|
-
salary_entries: salaryEntries,
|
|
34871
|
-
employer_entries: employerEntries,
|
|
34872
|
-
summary: {
|
|
34873
|
-
gross,
|
|
34874
|
-
withholding,
|
|
34875
|
-
tyelEmployee,
|
|
34876
|
-
ttvEmployee,
|
|
34877
|
-
netPay,
|
|
34878
|
-
tyelEmployer,
|
|
34879
|
-
sotu: sotuAmount,
|
|
34880
|
-
ttvEmployer,
|
|
34881
|
-
totalEmployerCost: roundCents(gross + tyelEmployer + sotuAmount + ttvEmployer)
|
|
34882
|
-
}
|
|
34883
|
-
});
|
|
34884
|
-
}
|
|
34885
|
-
const accountMap = await resolveAccountNumbers(
|
|
34886
|
-
[...salaryEntries, ...employerEntries].map((e) => e.accountNumber)
|
|
34887
|
-
);
|
|
34888
|
-
if ("isError" in accountMap) return accountMap;
|
|
34889
|
-
return withIdempotency(
|
|
34890
|
-
supabase2,
|
|
34891
|
-
companyId2,
|
|
34892
|
-
"kirjapro_book_salary",
|
|
34893
|
-
params.idempotencyKey,
|
|
34894
|
-
params,
|
|
34895
|
-
async () => {
|
|
34896
|
-
const { data, error: error51 } = await supabase2.rpc("book_salary_atomic", {
|
|
34897
|
-
p_company_id: companyId2,
|
|
34898
|
-
p_fiscal_year_id: fiscalYearId,
|
|
34899
|
-
p_transaction_date: params.date,
|
|
34900
|
-
p_employee_name: params.employeeName,
|
|
34901
|
-
p_salary_entries: toJournalEntries(salaryEntries, accountMap),
|
|
34902
|
-
p_employer_entries: toJournalEntries(employerEntries, accountMap)
|
|
34903
|
-
});
|
|
34904
|
-
if (error51 || !data) {
|
|
34905
|
-
return toErrorContent(
|
|
34906
|
-
error51 ? sanitizeDbError("Failed to book salary", error51) : "Failed to book salary: no response from RPC"
|
|
34907
|
-
);
|
|
34908
|
-
}
|
|
34909
|
-
const result = data;
|
|
34910
|
-
return toResult({
|
|
34911
|
-
message: "Salary booked (2 transactions, atomic)",
|
|
34912
|
-
salary_transaction_id: result.salary_transaction_id,
|
|
34913
|
-
employer_costs_transaction_id: result.employer_costs_transaction_id,
|
|
34914
|
-
summary: {
|
|
34915
|
-
gross,
|
|
34916
|
-
withholding,
|
|
34917
|
-
tyelEmployee,
|
|
34918
|
-
ttvEmployee,
|
|
34919
|
-
netPay,
|
|
34920
|
-
tyelEmployer,
|
|
34921
|
-
sotu: sotuAmount,
|
|
34922
|
-
ttvEmployer,
|
|
34923
|
-
totalEmployerCost: roundCents(gross + tyelEmployer + sotuAmount + ttvEmployer)
|
|
34924
|
-
}
|
|
34925
|
-
});
|
|
34926
|
-
}
|
|
34927
|
-
);
|
|
34928
|
-
}
|
|
34929
|
-
);
|
|
34930
34767
|
server2.registerTool(
|
|
34931
34768
|
"kirjapro_book_vat_settlement",
|
|
34932
34769
|
{
|
|
@@ -36251,7 +36088,7 @@ function resolveSurface(explicit) {
|
|
|
36251
36088
|
if (env === "core") return "core";
|
|
36252
36089
|
if (env && env !== "core") {
|
|
36253
36090
|
console.error(
|
|
36254
|
-
`[kirjapro-mcp] Unknown KIRJAPRO_MCP_SURFACE="${env}" \u2014 falling back to "core". Valid values: "core" (default, 26 tools), "full" (
|
|
36091
|
+
`[kirjapro-mcp] Unknown KIRJAPRO_MCP_SURFACE="${env}" \u2014 falling back to "core". Valid values: "core" (default, 26 tools), "full" (52 tools).`
|
|
36255
36092
|
);
|
|
36256
36093
|
}
|
|
36257
36094
|
return "core";
|
|
@@ -36286,7 +36123,7 @@ function registerTools(server2, options = {}) {
|
|
|
36286
36123
|
);
|
|
36287
36124
|
} else {
|
|
36288
36125
|
console.error(
|
|
36289
|
-
`[kirjapro-mcp] surface=full \u2014 registered all
|
|
36126
|
+
`[kirjapro-mcp] surface=full \u2014 registered all 52 tools (CORE_TOOL_NAMES bypass active).`
|
|
36290
36127
|
);
|
|
36291
36128
|
}
|
|
36292
36129
|
}
|
|
@@ -36800,7 +36637,7 @@ function registerResources(server2) {
|
|
|
36800
36637
|
}
|
|
36801
36638
|
|
|
36802
36639
|
// src/version.ts
|
|
36803
|
-
var VERSION = "0.5.
|
|
36640
|
+
var VERSION = "0.5.9";
|
|
36804
36641
|
|
|
36805
36642
|
// src/index.ts
|
|
36806
36643
|
var INSTRUCTIONS_COMMON = `
|
|
@@ -36907,7 +36744,8 @@ var INSTRUCTIONS_CORE_ADDENDUM = `
|
|
|
36907
36744
|
The following workflows are NOT exposed in the current (core) surface. When a user asks for them, redirect to the web UI rather than reaching for the closest available tool:
|
|
36908
36745
|
|
|
36909
36746
|
- **Recurring invoice templates** \u2014 created and managed in the web app; cron generates the issued invoices
|
|
36910
|
-
- **Booking shortcuts** (book_purchase / book_sale /
|
|
36747
|
+
- **Booking shortcuts** (book_purchase / book_sale / book_vat_settlement) \u2014 for these, you CAN compose the journal entries manually via \`kirjapro_create_transaction\` with explicit debit/credit lines if the user prefers; otherwise redirect
|
|
36748
|
+
- **Payroll (palkanlaskenta)** \u2014 Kirjapro does NOT calculate or book payroll. Direct the user to Palkkaus.fi or Palkka.fi for the calculation, then bring the resulting payslip back and book it via \`kirjapro_create_transaction\` with explicit debit/credit lines
|
|
36911
36749
|
- **Transaction templates** \u2014 manual journal entries via \`kirjapro_create_transaction\`
|
|
36912
36750
|
- **Manual offer status changes** \u2014 the customer's email-link click sets status server-side; just wait for the user to confirm acceptance
|
|
36913
36751
|
- **Listing or fetching past offers** \u2014 the user can view them in the web UI
|
|
@@ -36926,8 +36764,8 @@ var INSTRUCTIONS_FULL_ADDENDUM = `
|
|
|
36926
36764
|
### Booking Shortcuts
|
|
36927
36765
|
Faster than composing journal entries via \`kirjapro_create_transaction\`:
|
|
36928
36766
|
- \`kirjapro_book_sale\` / \`kirjapro_book_purchase\` \u2014 one-liner with auto VAT splitting
|
|
36929
|
-
- \`kirjapro_book_salary\` \u2014 creates 2 atomic transactions (salary + employer costs), 2026 rates as defaults
|
|
36930
36767
|
- \`kirjapro_book_vat_settlement\` \u2014 reads ALV-saamiset/ALV-velka, creates settlement entry. Call \`kirjapro_get_alv_summary\` first to preview.
|
|
36768
|
+
- **Payroll is intentionally NOT exposed.** Direct users to Palkkaus.fi / Palkka.fi for salary calculation; the payslip can then be booked manually via \`kirjapro_create_transaction\`.
|
|
36931
36769
|
- \`kirjapro_list_templates\` \u2192 \`kirjapro_create_from_template\` for common patterns (13 built-in templates)
|
|
36932
36770
|
|
|
36933
36771
|
### Manual Offer Status
|
|
@@ -36946,7 +36784,7 @@ Faster than composing journal entries via \`kirjapro_create_transaction\`:
|
|
|
36946
36784
|
|
|
36947
36785
|
### Destructive Operations (always dryRun first)
|
|
36948
36786
|
- \`kirjapro_delete_invoice\`, \`kirjapro_delete_offer\`, \`kirjapro_delete_recurring_invoice\` \u2014 drafts only; sent/paid must be cancelled first
|
|
36949
|
-
- \`kirjapro_book_purchase\`, \`kirjapro_book_sale
|
|
36787
|
+
- \`kirjapro_book_purchase\`, \`kirjapro_book_sale\` \u2014 call with \`dryRun: true\` to preview the journal entries before commit
|
|
36950
36788
|
`.trim();
|
|
36951
36789
|
function buildInstructions(surface) {
|
|
36952
36790
|
return surface === "full" ? `${INSTRUCTIONS_COMMON}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kirjapro/mcp-server",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.9",
|
|
4
4
|
"description": "MCP server for Finnish accounting — exposes Kirjapro bookkeeping, invoicing, and reporting tools to Claude Code, Claude Desktop, and any MCP client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/server.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@kirjapro/mcp-server",
|
|
3
3
|
"displayName": "Kirjapro - Finnish Accounting",
|
|
4
4
|
"description": "Finnish double-entry bookkeeping, invoicing, and financial reporting for growing businesses. Create transactions, generate invoices with VAT calculation, produce income statements and balance sheets, and validate Finnish business identifiers.",
|
|
5
|
-
"version": "0.5.
|
|
5
|
+
"version": "0.5.9",
|
|
6
6
|
"homepage": "https://kirjapro.fi",
|
|
7
7
|
"repository": "https://github.com/Jaollo/kirja-pro",
|
|
8
8
|
"license": "MIT",
|
package/tool-fingerprints.json
CHANGED
|
@@ -4,10 +4,6 @@
|
|
|
4
4
|
"name": "kirjapro_book_purchase",
|
|
5
5
|
"hash": "ddb30ea742fd64ef"
|
|
6
6
|
},
|
|
7
|
-
{
|
|
8
|
-
"name": "kirjapro_book_salary",
|
|
9
|
-
"hash": "d60f5e3af5b9814c"
|
|
10
|
-
},
|
|
11
7
|
{
|
|
12
8
|
"name": "kirjapro_book_sale",
|
|
13
9
|
"hash": "9ce00f1687fc23e0"
|
|
@@ -26,11 +22,11 @@
|
|
|
26
22
|
},
|
|
27
23
|
{
|
|
28
24
|
"name": "kirjapro_create_from_template",
|
|
29
|
-
"hash": "
|
|
25
|
+
"hash": "d5544fb7b65148b4"
|
|
30
26
|
},
|
|
31
27
|
{
|
|
32
28
|
"name": "kirjapro_create_from_template_batch",
|
|
33
|
-
"hash": "
|
|
29
|
+
"hash": "a6290b31dc0a430e"
|
|
34
30
|
},
|
|
35
31
|
{
|
|
36
32
|
"name": "kirjapro_create_invoice",
|