* feat(mcp): tool titles + Connect-with-Claude docs for Connectors Directory readiness Add a top-level Tool.title (MCP spec 2025-06-18) to all 92 MCP tools and flow it through the tools/list serializer for the Claude Connectors Directory. Trim the ~10 longest tool descriptions toward 180-200 chars (semantics + agent hints preserved) to partly offset the added bytes, and raise the payload-size bench ceiling 32K → 36K with headroom reserved for upcoming Skatteverket tools. Ship a "Connect with Claude" docs page (OAuth 2.1 connector + npx gnubok-mcp stdio bridge, sample sandbox prompts, 10-minute reviewer test, support pointer), wire it into the docs nav, and add a README to the packages/gnubok-mcp npm bridge. Bump one categorized sandbox business expense above 4 000 kr so the VAT close-check demo surfaces a high-value receipt-less expense. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(mcp): restore six spaces lost in the description-trimming pass Review finding (Greptile P2): the trim deleted single spaces in six tool descriptions ("Stages foruser", "länkatill", "kundfordran(1510)", …), producing malformed text in tools/list. All six were pure space deletions with no token gain — restored verbatim. Swept all 92 descriptions for residual merge artifacts; the two remaining matches are pre-existing function-call notation from main. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(compliance): correct BFL citation in seed + mark 4000 kr as app heuristic Swedish compliance review findings: - The seed comment cited BFL 5 kap 6§ as requiring verifikat on high-value affärshändelser; 6§ governs verifikationens innehåll. Rephrased: BFL 5 kap 6-7§ require every affärshändelse to be documented — the 4 000 kr cut-off is the tool's own heuristic, not a statutory threshold. - The connect-claude docs read as though 4 000 kr were a legal floor (conflatable with the förenklad faktura ceiling, ML 17 kap 26-28§). Clarified that BFL requires underlag regardless of amount. Dismissed as by-design: the gnubok_sk_test_... README placeholders (standard practice; the prefix schema is already public in llms.txt). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
52 lines
3.1 KiB
TypeScript
52 lines
3.1 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
||
import { tools } from '../server'
|
||
|
||
describe('tools/list payload size guard', () => {
|
||
it('keeps the projected tools/list payload under the context-budget ceiling', () => {
|
||
const projection = tools.map((t) => ({
|
||
name: t.name,
|
||
...(t.title ? { title: t.title } : {}),
|
||
description: t.description,
|
||
inputSchema: t.inputSchema,
|
||
...(t.outputSchema ? { outputSchema: t.outputSchema } : {}),
|
||
annotations: t.annotations,
|
||
...(t._meta ? { _meta: t._meta } : {}),
|
||
}))
|
||
const payload = JSON.stringify({ tools: projection })
|
||
const approxTokens = Math.round(payload.length / 4)
|
||
// Ceiling progression: 20K → 25K → 30K → 31K → 31.5K → 32K → 36K.
|
||
// * 20K → 25K when item 8 of the agent-native API plan landed
|
||
// (additionalProperties: false on all inputSchemas + period_status in the
|
||
// staged operation envelope).
|
||
// * 25K → 30K when the agentic branch merged with main: catalog grew from
|
||
// ~75 to 83 tools (added gnubok_create_supplier, gnubok_list_pending_operations,
|
||
// gnubok_approve_pending_operation, gnubok_reject_pending_operation,
|
||
// gnubok_set_inbox_extracted_data from main + gnubok_get_agent_briefing,
|
||
// _remember_fact, _forget_fact, _feedback from the agent branch).
|
||
// * 30K → 31K when gnubok_match_batch_allocate and
|
||
// gnubok_bulk_book_transactions landed (PRs #603/#606/#608/#610). Each
|
||
// adds the shared STAGED_OPERATION_SCHEMA + a non-trivial inputSchema
|
||
// for the multi-tx flows. Descriptions already trimmed to 230–260 chars.
|
||
// * 31K → 31.5K when gnubok_link_transaction_to_journal_entry landed (PR
|
||
// #614). Same family as match_batch_allocate / bulk_book_transactions —
|
||
// closes the MCP parity gap with the existing REST endpoint so agents
|
||
// can attach a bank tx to an already-posted verifikat without creating
|
||
// duplicate bookkeeping. Description trimmed to ~180 chars.
|
||
// * 31.5K → 32K when gnubok_find_voucher_candidates_for_supplier_invoice +
|
||
// gnubok_link_supplier_invoice_to_voucher landed — the supplier-side
|
||
// mirror of the customer find/link voucher tools. The link tool inlines
|
||
// the shared STAGED_OPERATION_SCHEMA. Lets agents mark a leverantörs-
|
||
// faktura paid against an already-posted verifikat (no new bokföring),
|
||
// which is exactly the fix for invoices imported from Fortnox as open
|
||
// payables while their payment already exists in the SIE-imported GL.
|
||
// * 32K → 36K when top-level Tool.title (MCP spec 2025-06-18) landed on all
|
||
// 92 tools for Connectors Directory readiness; the ~10 longest descriptions
|
||
// were trimmed toward 180–200 chars to partly offset. Headroom reserved for
|
||
// the upcoming Skatteverket tools.
|
||
// Long-term answer to growth is leaning harder on gnubok_search_tools — if this
|
||
// fires again, prefer trimming descriptions or making a tool opt-in via search
|
||
// before bumping further.
|
||
expect(approxTokens).toBeLessThan(36_000)
|
||
})
|
||
})
|