{"server":{"name":"qlim8","version":"1.0.0"},"protocol":{"versions":["2026-07-28","2025-11-25","2025-06-18","2025-03-26"],"transport":"streamable-http","stateless":true},"conventions":{"pagination":"List tools return { items: [...], next_cursor: string|null }. A non-null next_cursor means more rows exist: pass it back verbatim as the `cursor` argument to fetch the next page. Cursors are opaque: never construct, parse, or modify them.","dates":"Date filters (`from`/`to`) are ISO 8601 datetimes and are INCLUSIVE on both ends, compared against each record's transaction date.","scopes":"Each tool requires the scope shown. A 403 'auth.scope_required' result means the connection lacks it: reconnect OAuth without the read-only restriction, or mint a key with the needed scope. Enterprise-tier tools also require the named plan feature.","errors":"Execution failures return a normal result with isError:true and a JSON body { code, title, detail }. Read `code` to branch (e.g. resource.not_found, auth.scope_required, request.validation_failed)."},"tools":[{"name":"get_emissions_summary","title":"Emissions summary by scope or month","description":"Returns total CO2e (market-based, in kg) aggregated by GHG scope for this tenant. Use to answer questions about total emissions, scope 1/2/3 breakdown, or year-over-year comparisons. Pass group_by:'month' for a calendar-month time series instead (e.g. 'emissions distributed by month'). For category breakdowns use get_emissions_by_category or get_emissions_by_scope3_category.","scope":"emissions:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"from":"2024-01-01T00:00:00Z","to":"2024-12-31T23:59:59Z"},"output_example":{"total_co2e_kg":128400.5,"by_scope":{"1":21000,"2":47400.5,"3":60000},"entry_count":842},"notes":"group_by:'month' returns { total_co2e_kg, by_month: { \"2024-01\": ..., \"2024-02\": ... }, entry_count } instead of by_scope."},{"name":"get_emissions_by_scope3_category","title":"Scope 3 emissions by GHG Protocol category","description":"Returns this tenant's Scope 3 emissions broken down by the 15 standard GHG Protocol categories (1 Purchased goods and services .. 15 Investments). Use for CSRD/VSME-style Scope 3 category reporting. Amounts that can't be matched to one of the 15 categories are returned separately as unclassified, not silently dropped.","scope":"emissions:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"from":"2024-01-01T00:00:00Z","to":"2024-12-31T23:59:59Z"},"output_example":{"total_co2e_kg":60000,"by_category":{"1":{"name":"Purchased goods and services","co2e_kg":42000,"entry_count":310},"6":{"name":"Business travel","co2e_kg":8000,"entry_count":45}},"unclassified_co2e_kg":0,"entry_count":355},"notes":"Categorisation is keyword-matched against the same calculation-category field the VSME report generator uses, so totals here match the report's Environmental Disclosures D30-D44 breakdown."},{"name":"get_emissions_by_category","title":"Emissions by calculation category","description":"Returns emissions broken down by the internal calculation category (the vocabulary from list_emission_categories / the factor used, e.g. 'Electricity', 'Natural gas', 'Business travel - flights'), sorted by CO2e descending. Use to answer 'what are my biggest emission sources' style questions. Optionally filter to one GHG scope first.","scope":"emissions:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"from":"2024-01-01T00:00:00Z","to":"2024-12-31T23:59:59Z","scope":"1"},"output_example":{"total_co2e_kg":21000,"by_category":{"Natural gas":15000,"Diesel":6000},"entry_count":210}},{"name":"list_emissions","title":"List emission entries","description":"Returns a cursor-paginated list of emission entries (each linked to an activity/invoice). Use for detailed audits or exporting raw emission data. Page with next_cursor.","scope":"emissions:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"scope":"1","limit":50}},{"name":"get_emission_lineage","title":"Emission entry lineage","description":"Returns the full data lineage for one emission entry: source activity/invoice, the emission factor used (with the factor state frozen at calculation time), category-change history, and cryptographic audit hashes for independent verification. Use for auditor self-service and traceability.","scope":"emissions:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"id":"8b1f0c2e-1d34-4a77-9c0e-3a2b1c4d5e6f"}},{"name":"list_activities","title":"List activities","description":"Returns a cursor-paginated list of activities (invoices and transactions) for this tenant. Each activity is a source document that may produce one or more emission entries after categorization.","scope":"activities:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"from":"2024-01-01T00:00:00Z","limit":25}},{"name":"list_reports","title":"List generated reports","description":"Returns this tenant's generated reports (VSME, and the sustainability report as standard_type 'esg') with version, the period covered (period_start, period_end), file size and creation date. Each new report of a year and standard is its next version; is_current marks the one in force. Reports deleted in the app and consultants' drafts are left out. Use get_report_status for in-progress jobs or generate_report to start a new render.","scope":"reports:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"get_report_status","title":"Report job status","description":"Returns the status of a report render job (queued, running, completed, failed). Poll after generate_report until status is 'completed'.","scope":"reports:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"id":"f47ac10b-58cc-4372-a567-0e02b2c3d479"}},{"name":"generate_report","title":"Generate a compliance report","description":"Triggers an async report render job and returns a job id. Poll get_report_status until completed. The report covers the organisation's reporting year: the calendar year, or for a fiscal year the year it ends in. A year that already has a report of this standard gets its next version. Refused with period_not_configured when the fiscal year has no end month, and with standard_retired for 'csrd' (retired 21 October 2026: the PDF it made was not a CSRD report). standard_type 'vs' is the voluntary standard (Basic or Basic and Comprehensive, as the company has chosen in the app): one ZIP with the Excel template, a PDF and the audit trail, stored as vs_basic or vs_comprehensive, refused with vs.not_ready (and the disclosures that block) until the answers are complete. Idempotent: the same year + standard_type + format returns the existing job if one is already queued or running.","scope":"reports:generate","layer":1,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"input_example":{"report_year":2024,"standard_type":"vsme_basic","format":"pdf"},"notes":"Long-running. Returns 202-style job; do not block, poll get_report_status."},{"name":"list_suppliers","title":"List Scope 3 suppliers","description":"Returns all Scope 3 supplier connections for this tenant with disclosure status (active, pending, invited). Enterprise plan required. Use get_value_chain_coverage for an aggregated summary.","scope":"suppliers:read","layer":2,"required_tier":"enterprise","annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"year":2024}},{"name":"get_value_chain_coverage","title":"Value-chain coverage","description":"Returns the percentage of total supplier spend covered by active Scope 3 disclosures for a reporting year. Enterprise plan required. coverage_pct of 100 means all supplier trade is disclosed.","scope":"suppliers:read","layer":2,"required_tier":"enterprise","annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"year":2024}},{"name":"get_value_chain_exposure","title":"Value-chain exposure","description":"Returns suppliers sorted by trade amount descending, which suppliers represent the largest Scope 3 emission risk. Enterprise plan required. Use to prioritise disclosure outreach.","scope":"suppliers:read","layer":2,"required_tier":"enterprise","annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"year":2024}},{"name":"list_targets","title":"List reduction targets","description":"Returns the organisation's absolute CO2 reduction targets, the goals its Reduction Hub shows: a scope target (scopes 1, 2, 3 or combined) or a category target, with baseline year, baseline emissions (tonnes CO2e, on the target's scope2_basis: location-based unless it was made market-based), the basis itself (scope2_basis), target year, reduction percent, target emissions, whether it is frozen by the package, and its progress over the complete report years (status, latest year, gap to the linear path, share achieved). Use to assess climate-commitment progress; get_target_progress gives one target's yearly series. Requires the reductionGoals plan feature.","scope":"targets:read","layer":2,"annotations":{"readOnlyHint":true,"openWorldHint":false},"notes":"Complete years only: the year to date is not reported. Intensity targets made in the app are not listed."},{"name":"create_target","title":"Create a reduction target","description":"Creates an absolute reduction target, which the Reduction Hub then shows, and returns it with its id and progress. Name what it covers with scope ('1', '2', '3', '1+2' or 'all') for a scope target, or categories (category_mapped values, see list_emission_categories) for a category target. The server derives the baseline from the ledger for the baseline year, which must be a complete report year with data in what the target covers; baseline_emissions is optional and, if sent, must match it (409 reduction.base_mismatch carries the ledger's figure). scope2_basis ('location', the default, or 'market') says how scope 2 is counted in the baseline and in progress; the baseline is read on it, and 'market' needs a target that covers scope 2 (400 reduction.scope2_basis_without_scope2). Requires targets:write and the reductionGoals plan feature; a scope target also reductionGoals.scope, Scope 3 reductionGoals.scope3.","scope":"targets:write","layer":2,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"input_example":{"name":"Scope 1 og 2 halveret","baseline_year":2024,"target_year":2030,"target_reduction_percent":50,"scope":"1+2"},"notes":"Fires the target.created webhook. A category target: { categories: [\"Diesel\"], baseline_year: 2024, target_year: 2030, target_reduction_percent: 30 }. A market-based target: add scope2_basis: \"market\" (fixed once made)."},{"name":"get_target_progress","title":"Get a reduction target's progress","description":"Returns where one reduction target stands: the complete report years from the baseline with emissions (tonnes CO2e, on the target's scope2_basis: location-based unless it was made market-based) and the linear path, the latest complete year, the gap to the path (negative is ahead), the share of the agreed reduction achieved, the share of time elapsed, the status (no_data, achieved, ahead, on_track, behind, missed) and whether the baseline year has drifted more than 5 % since it was frozen. Complete years only; the year to date is not reported. Requires the reductionGoals plan feature.","scope":"targets:read","layer":2,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"id":"3c9d8e7f-6a5b-4c3d-2e1f-0a9b8c7d6e5f"},"notes":"period_type 'fiscal' means a year is the calendar year its fiscal year ends in."},{"name":"list_emission_factors","title":"List emission factors","description":"Returns the activity-based emission factors the calculation engine uses (kg CO2e per kWh, litre, kg, ...): category, region, validity, source, and the Scope 2 market-based value where one exists. Spend-based factors are per category: see factor_value in list_emission_categories (kg CO2e per DKK 1,000). Use to understand how calculations are derived.","scope":"factors:read","layer":2,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"category":"Elektricitet","region":"DK"}},{"name":"get_factor_citations","title":"Emission factor citations","description":"Returns a factor plus how many of this tenant's emission entries used it, with a sample of entry ids. Accepts any factor id a calculation cites (calculation_log.factorId in get_emission_lineage): activity factors, category spend factors, EXIOBASE country factors and the tenant's PCF records. Use for auditor self-service to verify which invoices contributed to a factor's footprint.","scope":"factors:read","layer":2,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"id":"1f2e3d4c-5b6a-7980-1234-567890abcdef"}},{"name":"list_webhooks","title":"List webhook subscriptions","description":"Returns all webhook subscriptions for this tenant. Each receives HTTP POST callbacks for configured events (e.g. supplier.connected, report.generation_completed). Use get_webhook_deliveries to inspect attempts.","scope":"webhooks:read","layer":3,"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"create_webhook","title":"Create a webhook subscription","description":"Creates a webhook subscription and returns it with a one-time signing_secret, store it securely, it is not shown again. Verify incoming payloads with HMAC-SHA256. Requires webhooks:manage scope. URL must be HTTPS in live.","scope":"webhooks:manage","layer":3,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"input_example":{"url":"https://example.com/hooks/qlim8","events":["report.generation_completed"],"environment":"live"},"notes":"The signing_secret in the response is shown ONCE. SSRF-validated: private/loopback hosts are rejected in live."},{"name":"get_webhook_deliveries","title":"Webhook delivery attempts","description":"Returns the 100 most recent delivery attempts for a webhook (status, HTTP response code, latency), newest first. Use to debug delivery failures; resend one with redeliver_webhook_delivery.","scope":"webhooks:read","layer":3,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"webhook_id":"9c8b7a6d-5e4f-3210-fedc-ba9876543210"}},{"name":"reactivate_webhook","title":"Reactivate a webhook","description":"Switches a webhook subscription back on after qlim8 switched it off because a delivery used every retry (is_active false, deactivated_reason 'delivery_dead_letter'). Resends nothing: call redeliver_webhook_delivery for each delivery to resend. A webhook that was deleted cannot be reactivated (409 webhook.not_reactivatable); an active one is returned unchanged. Requires webhooks:manage scope.","scope":"webhooks:manage","layer":3,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"input_example":{"webhook_id":"9c8b7a6d-5e4f-3210-fedc-ba9876543210"}},{"name":"redeliver_webhook_delivery","title":"Resend a webhook delivery","description":"Sends one delivery again from the start with its original payload: a dead-lettered, failed or delivered one. Refused while the webhook is switched off (409 webhook.inactive: call reactivate_webhook first) and while the delivery is still pending (409 webhook.delivery_pending). Find delivery ids with get_webhook_deliveries. Requires webhooks:manage scope.","scope":"webhooks:manage","layer":3,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"input_example":{"webhook_id":"9c8b7a6d-5e4f-3210-fedc-ba9876543210","delivery_id":"0d1e2f3a-4b5c-4d6e-8f70-8192a3b4c5d6"}},{"name":"list_data_sources","title":"List integration data sources","description":"Returns the tenant's accounting-system connectors (e-conomic, Dinero, …) with sync status, pending invoice counts, and last-sync timestamps. Use to diagnose 'why didn't invoices sync?' or which connector is paused. Read-only: connect/sync actions are not exposed.","scope":"data_sources:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"get_quota_status","title":"Invoice quota status","description":"Returns the tenant's current invoice-ingestion quota: limit, used, available, period dates and tier. Use to decide whether to throttle a sync or warn about an approaching cap. Enterprise/sandbox tenants report 'unlimited'.","scope":"quota:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"list_emission_categories","title":"List emission category taxonomy","description":"Returns the emission category taxonomy (Danish + English names, hierarchy level, parent, default scope, factor value). This is the vocabulary the system uses to classify activities, read it before reasoning about categories or emissions breakdowns.","scope":"factors:read","layer":1,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"level":1}},{"name":"list_actions","title":"List reduction actions","description":"Returns the organisation's reduction actions, what it does to reach a target: category, scope, effect type and percent, status (planned, in_progress, completed), CapEx and OpEx in DKK, start and end year, an optional phase-in, and the targets each counts toward. Includes proposals awaiting the organisation's review. Requires the reductionActions plan feature.","scope":"actions:read","layer":2,"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"create_action_draft","title":"Create a reduction action","description":"Creates a reduction action as planned (unless status is given), which the Reduction Hub then shows. The organisation states the action itself: category, scope, effect_type ('activity' or 'factor') and effect_pct, ideally with an advisor's help; there is no catalogue of templates (a template_key or the 'fuel_switch' type is refused). The category must have emissions in the named scope in the organisation's ledger; the end year is not before the start year. target_ids counts it toward targets it touches. A consultant proposes actions in the qlim8 app, not here. Requires actions:write and the reductionActions plan feature; a Scope 3 action also reductionGoals.scope3, a phase-in (ramp_years) reductionPlan.bau.","scope":"actions:write","layer":2,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"input_example":{"name":"Efterisolering af hovedbygningen","category":"Fjernvarme","scope":2,"effect_type":"activity","effect_pct":15,"start_year":2026,"end_year":2027,"capex_dkk":250000}},{"name":"link_action_to_target","title":"Count an action toward a target","description":"Links a reduction action to a reduction target, so the target's plan includes it. The action must touch the target: its category lies in the target (400 reduction.action_outside_target otherwise). Linking twice is the same as linking once. Requires actions:write and the reductionActions plan feature.","scope":"actions:write","layer":2,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"input_example":{"action_id":"2b3c4d5e-6f70-4811-9a2b-3c4d5e6f7081","target_id":"3c9d8e7f-6a5b-4c3d-2e1f-0a9b8c7d6e5f"}},{"name":"list_pcf_records","title":"List product carbon footprints","description":"Returns the tenant's approved product carbon footprint (PCF) records: supplier, product, value/unit, methodology and validity window. Retracted/superseded footprints are excluded. Use for Scope 3 product-level data.","scope":"factors:read","layer":2,"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"list_departments","title":"List departments","description":"Returns the tenant's organisational units (name, code, active flag). Use to scope or roll up emissions by department/site.","scope":"tenant:read","layer":2,"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"get_report_attestations","title":"Get report attestations","description":"Returns the auditor's statements (attestations) for a generated report: standards attested, consultant/client CVR, signature date and, for attestation version 3, the engagement (standard, level of assurance, scope, GHG shares covered, conclusion, date). A row of kind addendum is the auditor's addendum (tillæg) to a statement on an earlier version and says whether the changes in this version affect it. A statement belongs to one report version. Use to confirm a report was independently certified.","scope":"reports:read","layer":2,"annotations":{"readOnlyHint":true,"openWorldHint":false},"input_example":{"report_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479"}}]}