Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,070Paid calls: 1,523Letters: 13Defects: 1,322counted just now
teppi

Server definition

Hash
sha256:44fdd417513e5d524a6348346ff36afed1ccac01d43581f1a2dfb4b0c55df7ff
What it is
What a remote MCP server returned when asked what it offers: 36 tools

The blob, as servednamed by its sha256

{ "instructions": "Firmaradar is an enrichment platform for Norwegian company intelligence — multi-source fusion of official registers (BRREG, Skatteetaten, Patentstyret) plus its own enrichment. Coverage includes: company profiles, group structure, ownership and beneficial owners, board roles, financials and key figures, BRREG announcements, public grants, merger/demerger relations, risk/AML/KYC signals, and intellectual-property portfolios — patents, trademarks and designs from Patentstyret (via `get_company` with `fields=['ip']`). The data is refreshed daily.", "tools": [ { "description": "Add a Norwegian company (by 9-digit orgnr) to the user's company-monitoring list. The user is then alerted when announcements, status changes (bankruptcy/dissolution), ownership changes or new public grants are registered for that company. New targets monitor ALL announcement categories by default; keep ip_alerts=true (default) to also turn on IP-change alerts when the account has the IP-monitoring add-on, or set ip_alerts=false to skip them. 409 if already monitored (idempotent — no duplicate). 403 (monitoring_cap_reached) if the account's company has hit its per-company monitoring cap — tell the user to contact Firmaradar to expand it. Requires a user whose plan has Firmaovervakning enabled. Call only when the user has asked to monitor a specific company.", "inputSchema": { "properties": { "ip_alerts": { "default": true, "description": "Also enable IP-change alerts for this company. Default true = monitor everything. Requires the IP-monitoring add-on (ip_overvakning) on the account; without it the company is still monitored for all announcement/status/ownership changes, but IP alerts stay off. Set false to skip IP alerts.", "title": "Ip Alerts", "type": "boolean" }, "orgnr": { "description": "Norwegian organisation number (9 digits) to add to monitoring.", "title": "Orgnr", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_add_company_monitoring", "outputSchema": { "properties": { "ip_alerts_enabled": { "default": false, "description": "Whether IP-change alerts were turned on (false without the add-on).", "title": "Ip Alerts Enabled", "type": "boolean" }, "ok": { "default": false, "description": "True when the company was added.", "title": "Ok", "type": "boolean" }, "orgnr": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Orgnr" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" } }, "type": "object" } }, { "description": "Screen ONE natural PERSON's full name against sanctions (OFAC, EU, UN) and PEP lists. IMPORTANT — this is a PERSON tool only. Do NOT pass a company name, an organisation number (orgnr), or any non-person string here. For company-level AML risk use `firmaradar_get_aml_score` (by orgnr); to screen a company's owners/officers, first resolve the people via `firmaradar_get_company_roles` / `firmaradar_get_company_ownership`, then screen each PERSON name with this tool. Compliance-critical: PII-sensitive, requires a signed DPA and a legitimate purpose per call (free-text `purpose` parameter). Audit-logged for 60 months. Rate-limited to 50 calls / 30 min per API-key. Returns structured hits with category, sources, and match-ratio (default min 0.85).", "inputSchema": { "properties": { "birth_year": { "anyOf": [ { "maximum": 2100, "minimum": 1900, "type": "integer" }, { "type": "null" } ], "default": null, "title": "Birth Year" }, "kategori": { "default": "both", "enum": [ "sanksjon", "pep", "both" ], "title": "Kategori", "type": "string" }, "min_match_ratio": { "default": 0.85, "maximum": 1, "minimum": 0, "title": "Min Match Ratio", "type": "number" }, "name": { "description": "Full name of ONE natural PERSON to screen (e.g. 'Ola Nordmann'). NOT a company name or orgnr — for company AML use firmaradar_get_aml_score instead.", "maxLength": 200, "minLength": 2, "title": "Name", "type": "string" }, "purpose": { "description": "Legitimate purpose for this AML/PEP screening (free text, e.g. 'KYC verification for new customer acme-as'). Logged in compliance audit for 60 months.", "maxLength": 500, "minLength": 4, "title": "Purpose", "type": "string" } }, "required": [ "name", "purpose" ], "type": "object" }, "name": "firmaradar_check_aml_pep", "outputSchema": { "$defs": { "AmlPepHit": { "properties": { "ekstern_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Ekstern Id" }, "embete": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Embete" }, "entitet_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Entitet Type" }, "fodselsdato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Fodselsdato" }, "fodselsdato_mangler": { "default": false, "title": "Fodselsdato Mangler", "type": "boolean" }, "kategori": { "title": "Kategori", "type": "string" }, "kilder": { "items": { "type": "string" }, "title": "Kilder", "type": "array" }, "match_ratio": { "title": "Match Ratio", "type": "number" }, "match_type": { "title": "Match Type", "type": "string" }, "matchgrunnlag": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Matchgrunnlag" }, "pep_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Pep Status" }, "pep_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Pep Type" }, "primart_navn": { "title": "Primart Navn", "type": "string" }, "relasjon": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Relasjon" }, "relasjon_innenfor_direktivet": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Relasjon Innenfor Direktivet" }, "relasjon_kode": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Relasjon Kode" }, "verv_fra": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Verv Fra" }, "verv_historikk": { "items": { "additionalProperties": true, "type": "object" }, "title": "Verv Historikk", "type": "array" }, "verv_til": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Verv Til" }, "weak_match": { "default": false, "title": "Weak Match", "type": "boolean" } }, "required": [ "primart_navn", "kategori", "match_ratio", "match_type" ], "title": "AmlPepHit", "type": "object" } }, "properties": { "hit_count": { "title": "Hit Count", "type": "integer" }, "hits": { "items": { "$ref": "#/$defs/AmlPepHit" }, "title": "Hits", "type": "array" }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Note" }, "query_birth_year": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Query Birth Year" }, "query_name": { "title": "Query Name", "type": "string" }, "query_too_short": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "True: query < 5 chars, substring discovery skipped — a zero hit_count does NOT confirm the name is clean. False: not applicable. null: not reported by the server — unknown, not OK.", "title": "Query Too Short" }, "results_truncated": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "True: server-side hit cap reached, list may be incomplete. False: complete. null: not reported by the server — unknown, not complete.", "title": "Results Truncated" }, "search_degraded": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "True: trigram/alias candidate discovery was unavailable — a zero hit_count does NOT confirm the name is clean. False: full search ran. null: not reported by the server — unknown, not OK.", "title": "Search Degraded" } }, "required": [ "query_name", "hits", "hit_count" ], "type": "object" } }, { "description": "Bulk-endpoint for portfolio-screening of 'foretak i vanskeligheter' (financially distressed companies per EU GBER art. 2(18) criteria a-e, assessed at both company and group level). Max 50 orgnr per call. Each orgnr counts as one unit against your quota. Gate failures (invalid orgnr, missing entitlement) are returned per orgnr in the result list instead of failing the whole call — check each result's `error` field. Note: the distress assessment has no organisation-form gate — a sole proprietorship (ENK) is assessed like any other company. Use for screening supplier lists, credit-portfolios, or EU state-aid eligibility on multiple companies at once.", "inputSchema": { "properties": { "orgnrs": { "description": "List of 1-50 nine-digit Norwegian organization numbers. Each orgnr counts as one unit against your quota.", "items": { "type": "string" }, "maxItems": 50, "minItems": 1, "title": "Orgnrs", "type": "array" }, "skip_freshness": { "default": false, "description": "If True, accept FIV-data even if the underlying regnskap- or BRREG-snapshot is older than the normal freshness window. Use sparingly — recommended only for retrospective screening.", "title": "Skip Freshness", "type": "boolean" } }, "required": [ "orgnrs" ], "type": "object" }, "name": "firmaradar_check_fiv_bulk", "outputSchema": { "$defs": { "BulkFivResult": { "description": "Per-organization result in a bulk FIV response.", "properties": { "classifier_version": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Immutable version stamp for the FIV rule set used.", "title": "Classifier Version" }, "classifier_version_sequence": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Authoritative monotonic ordering key for classifier_version; compare this field, not the version string, to order rule sets.", "title": "Classifier Version Sequence" }, "confidence": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Confidence" }, "distress_basis": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Which level of the two-level assessment makes the company distressed: company, group or company_and_group. 'group' means the company's own accounts are clean but its group is in difficulty — sufficient under GBER art. 2(18).", "title": "Distress Basis" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Error type when the assessment could not be completed. Validation: `invalid_orgnr`. Rollout/configuration (shared extension dispatcher): `extension_not_active`, `extension_controls_unavailable`, `data_provider_failed`, `handler_not_found`, `handler_http_exception`, `handler_failed`, `unexpected_handler_return`. The bulk runner itself: `internal_error` (outside the dispatcher). On a runtime-control failure (rate limit, compliance gate) `error` is NOT one of the codes above — the field then keeps the control layer's human-readable text, and the machine code lives in `error_code`. The same text is mirrored in `message`. The distress assessment has NO organization-form gate — there is no ENK error code here.", "title": "Error" }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Stable machine code for runtime-control failures, set additively by the dispatcher when a control BEFORE the handler rejects the call. Rate limit: `rate_limit_exceeded`. Compliance gate: `compliance_gate_revoked`, `compliance_gate_expired`, `compliance_gate_manifest_unavailable`, `compliance_gate_unavailable`. Which gate reasons can occur follows the extension manifest, and the distress module requires no external authorization — that gate reason does not exist here. The distress handler does not set the field itself, and neither do the dispatcher and runner errors (including the 503 response when the extension controls cannot be read): they live in `error` only. An absent `error_code` means \"not a runtime-control failure\", not \"no error\". Always read `error` as well.", "title": "Error Code" }, "http_status": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "HTTP status this per-company result would have had outside the outer HTTP-200 bulk response.", "title": "Http Status" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable detail from the runtime-control layer.", "title": "Message" }, "orgnr": { "title": "Orgnr", "type": "string" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "rescuable_by_group": { "default": false, "description": "True when the company triggers only the capital criterion and its group is sound enough to remedy it before the aid is granted.", "title": "Rescuable By Group", "type": "boolean" }, "retry_after": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Retry-After header value when the row was rate limited.", "title": "Retry After" }, "score": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Score" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "FIV (foretak i vanskeligheter / company-in-difficulty) status when available: not_distressed, distressed, insufficient_data, exempt_young_company, not_distressed_partial. Absent when error is set.", "title": "Status" }, "verdict_presentation": { "anyOf": [ { "$ref": "#/$defs/FivVerdictPresentation" }, { "type": "null" } ], "default": null, "description": "Qualified display verdict. Label and caveat footnote are one object; missing or incomplete legacy blocks yield null, never a guessed clean verdict." } }, "required": [ "orgnr" ], "title": "BulkFivResult", "type": "object" }, "BulkMeta": { "properties": { "failed": { "title": "Failed", "type": "integer" }, "successful": { "title": "Successful", "type": "integer" }, "total_requested": { "title": "Total Requested", "type": "integer" } }, "required": [ "total_requested", "successful", "failed" ], "title": "BulkMeta", "type": "object" }, "FivVerdictPresentation": { "properties": { "footnote": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Mandatory qualification when qualification_status is present, including open-data, group-level and rescuable verdicts.", "title": "Footnote" }, "has_caveat": { "default": false, "description": "Whether the label carries the open-data (*) marker. This is distinct from whether another material qualification is required.", "title": "Has Caveat", "type": "boolean" }, "label": { "description": "Human-readable, qualified FIV verdict label.", "title": "Label", "type": "string" }, "qualification_status": { "description": "Whether this verdict requires no qualification or carries the required qualification. A missing required qualification rejects the entire presentation instead of producing this object.", "enum": [ "not_required", "present" ], "title": "Qualification Status", "type": "string" } }, "required": [ "label", "qualification_status" ], "title": "FivVerdictPresentation", "type": "object" } }, "properties": { "_meta": { "$ref": "#/$defs/BulkMeta", "description": "Aggregate count status for the whole bulk call." }, "results": { "items": { "$ref": "#/$defs/BulkFivResult" }, "title": "Results", "type": "array" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable markdown table of the per-company FIV verdicts.", "title": "Summary" } }, "required": [ "_meta" ], "type": "object" } }, { "description": "Assess whether a Norwegian company qualifies as *foretak i vanskeligheter* (a 'company in difficulty') under EU GBER art. 2(18) criteria a-e. Assessed at BOTH company and group level, as EU/EFTA state-aid practice requires — a company with clean accounts is in difficulty when its group is. Returns which criteria triggered, the overall status, the group assessment, and a data-completeness confidence score — a deterministic distress classification, not a raw registry flag. Use for EU state-aid eligibility, credit assessment, and supplier-risk screening.", "inputSchema": { "properties": { "orgnr": { "description": "9-digit norwegian organization number.", "title": "Orgnr", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_check_foretak_i_vanskeligheter", "outputSchema": { "$defs": { "FivRule": { "properties": { "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "rule_id": { "title": "Rule Id", "type": "string" }, "severity": { "title": "Severity", "type": "string" } }, "required": [ "rule_id", "severity" ], "title": "FivRule", "type": "object" }, "FivVerdictPresentation": { "properties": { "footnote": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Mandatory qualification when qualification_status is present, including open-data, group-level and rescuable verdicts.", "title": "Footnote" }, "has_caveat": { "default": false, "description": "Whether the label carries the open-data (*) marker. This is distinct from whether another material qualification is required.", "title": "Has Caveat", "type": "boolean" }, "label": { "description": "Human-readable, qualified FIV verdict label.", "title": "Label", "type": "string" }, "qualification_status": { "description": "Whether this verdict requires no qualification or carries the required qualification. A missing required qualification rejects the entire presentation instead of producing this object.", "enum": [ "not_required", "present" ], "title": "Qualification Status", "type": "string" } }, "required": [ "label", "qualification_status" ], "title": "FivVerdictPresentation", "type": "object" }, "GroupAssessment": { "description": "Konsern-leddet i to-nivå-testen (GBER art. 2(18)).", "properties": { "basis": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Data basis: konsernregnskap (filed consolidated accounts), aggregert_selskapsregnskap (individual accounts summed arithmetically — indicative, intra-group balances are not eliminated), utenlandsk_majoritet or ingen_data.", "title": "Basis" }, "capital_loss_ratio": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "description": "Share of the group's subscribed capital lost to accumulated losses.", "title": "Capital Loss Ratio" }, "evaluated": { "default": false, "description": "False when the company is not part of any group.", "title": "Evaluated", "type": "boolean" }, "has_public_controller": { "default": false, "description": "True if the root of the >50%-control ownership tree is an unambiguous public-sector entity (§16-40-5(4)) — disqualifies SMB status regardless of size.", "title": "Has Public Controller", "type": "boolean" }, "members_evaluated": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Members Evaluated" }, "members_total": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Members Total" }, "public_controller_unknown": { "default": false, "description": "True when the root is missing among the classified members, or its org_form is unknown — has_public_controller=False then does NOT confirm the root is private, only that it isn't known.", "title": "Public Controller Unknown", "type": "boolean" }, "root_distressed": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Whether the group head itself is in difficulty. Null means its status could not be established; false means established and healthy.", "title": "Root Distressed" }, "root_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Root Name" }, "root_org_form": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "The root member's raw BRREG org_form code (before normalization), or null if unknown. Exposed for transparency/debugging.", "title": "Root Org Form" }, "root_orgnr": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Root Orgnr" }, "size_ansatte_complete": { "default": false, "description": "False until period-aligned annual work units are available; current BRREG headcount is not a complete employee measure.", "title": "Size Ansatte Complete", "type": "boolean" }, "size_ansatte_sum": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "Sum over the >50%-control ownership tree (§16-40-5(2)-(3)); null when no member reported this field.", "title": "Size Ansatte Sum" }, "size_balansesum_complete": { "default": false, "description": "True when the selected value comes from a usable filed consolidated statement, or every evaluated member reported this field and the tree was not truncated — otherwise it is an incomplete subtotal, not threshold evidence.", "title": "Size Balansesum Complete", "type": "boolean" }, "size_balansesum_sum_nok": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "description": "NOK balance-sheet-total sum over the >50%-control ownership tree (§16-40-5(2)-(3)); null when no member reported this field.", "title": "Size Balansesum Sum Nok" }, "size_driftsinntekter_complete": { "default": false, "description": "True when the selected value comes from a usable filed consolidated statement, or every evaluated member reported this field and the tree was not truncated — otherwise it is an incomplete subtotal, not threshold evidence.", "title": "Size Driftsinntekter Complete", "type": "boolean" }, "size_driftsinntekter_sum_nok": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "description": "NOK revenue sum over the >50%-control ownership tree (§16-40-5(2)-(3)); null when no member reported this field.", "title": "Size Driftsinntekter Sum Nok" }, "size_sum_is_consolidated": { "default": false, "description": "True only if both revenue and balance-sheet totals come from a filed consolidated (regnskapstype=KONSERN) statement, already eliminated by an auditor — false means at least one naive standalone-account sum may overstate the group's size due to non-eliminated intra-group transactions.", "title": "Size Sum Is Consolidated", "type": "boolean" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Group-level outcome: clean, distressed, doubt or unknown. 'unknown' means the group could not be assessed (typically a foreign parent, which does not exist as an entity in Norwegian registries).", "title": "Status" }, "truncated": { "default": false, "title": "Truncated", "type": "boolean" } }, "title": "GroupAssessment", "type": "object" }, "RescueEstimate": { "description": "Hva konsernet må tilføre for å fjerne kapitalkriteriet (a).", "properties": { "frist": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Deadline — no later than the point the aid is granted.", "title": "Frist" }, "kapitalforhoyelse_min_nok": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "description": "Minimum share-capital increase, in NOK.", "title": "Kapitalforhoyelse Min Nok" }, "konsernbidrag_min_nok": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "description": "Minimum group contribution / grant, in NOK.", "title": "Konsernbidrag Min Nok" } }, "title": "RescueEstimate", "type": "object" } }, "properties": { "as_of": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "As Of" }, "classifier_version": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Immutable version stamp for the FIV rule set used.", "title": "Classifier Version" }, "classifier_version_sequence": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Authoritative monotonic ordering key for classifier_version; compare this field, not the version string, to order rule sets.", "title": "Classifier Version Sequence" }, "company_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "The company-level result alone, before the group level was applied.", "title": "Company Status" }, "confidence": { "description": "Data-completeness confidence in [0.0, 1.0].", "title": "Confidence", "type": "number" }, "distress_basis": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Which level makes the company distressed: company, group or company_and_group. Null when not distressed.", "title": "Distress Basis" }, "group_assessment": { "anyOf": [ { "$ref": "#/$defs/GroupAssessment" }, { "type": "null" } ], "default": null }, "orgnr": { "title": "Orgnr", "type": "string" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "rescuable_by_group": { "default": false, "description": "True when the group can lift the company out of difficulty by injecting capital before the aid is granted.", "title": "Rescuable By Group", "type": "boolean" }, "rescue_estimate": { "anyOf": [ { "$ref": "#/$defs/RescueEstimate" }, { "type": "null" } ], "default": null }, "rules_fired": { "items": { "$ref": "#/$defs/FivRule" }, "title": "Rules Fired", "type": "array" }, "score": { "description": "Confidence-weighted distress score in [0.0, 1.0].", "title": "Score", "type": "number" }, "status": { "description": "One of: not_distressed, insufficient_data, not_distressed_partial, exempt_young_company, distressed. Reflects BOTH levels of the assessment — a company with clean accounts is 'distressed' when its group is.", "title": "Status", "type": "string" }, "verdict": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "deprecated": true, "description": "Deprecated display label retained for backwards compatibility. Use verdict_presentation for the qualified label and mandatory caveat. Scheduled for removal in firmaradar-mcp 0.8.0, after the structured replacement has been available throughout the 0.7.x release line.", "title": "Verdict" }, "verdict_presentation": { "anyOf": [ { "$ref": "#/$defs/FivVerdictPresentation" }, { "type": "null" } ], "default": null, "description": "Qualified display verdict. Label and mandatory caveat footnote travel as one object; a caveated 'No (*)' is never returned without its text." } }, "required": [ "orgnr", "status", "score", "confidence" ], "type": "object" } }, { "description": "Screen a person by NAME for bankruptcy exposure ('konkursgjenganger'): leadership roles (chair / managing director) held in companies that later went bankrupt, tenure-weighted, from the dated role history. Use this for HISTORICAL leaders who are no longer in any role index and so cannot be reached via search_persons/get_person. The match is name-based (no national ID), so a hit is a REVIEW FLAG to verify (birth year / address), not a verdict. PII-sensitive — requires the search_full_enabled tier.", "inputSchema": { "properties": { "navn": { "description": "Full name to screen (min 2 characters), e.g. 'Karl Petter Ulriksen'.", "minLength": 2, "title": "Navn", "type": "string" }, "purpose": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Purpose-of-processing string for the F10.11 audit trail. Required when calling against accounts with purpose-confirmation.", "title": "Purpose" } }, "required": [ "navn" ], "type": "object" }, "name": "firmaradar_check_konkurs_eksponering", "outputSchema": { "$defs": { "KonkursForetak": { "properties": { "konkursdato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Konkursdato" }, "orgnr": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Orgnr" }, "rolletype": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Rolletype" }, "tenure_days": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Tenure Days" }, "tiltradt": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Tiltradt" } }, "title": "KonkursForetak", "type": "object" } }, "properties": { "antall_konkursforetak": { "default": 0, "title": "Antall Konkursforetak", "type": "integer" }, "foretak": { "items": { "$ref": "#/$defs/KonkursForetak" }, "title": "Foretak", "type": "array" }, "navn": { "title": "Navn", "type": "string" }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Note" } }, "required": [ "navn" ], "type": "object" } }, { "description": "Compare key financial metrics of up to 5 Norwegian companies side-by-side across the last N years (default 5). Use for competitor analysis, benchmark research or 'which of these three companies is the strongest?' Amounts are in each company's reporting currency (see the `currencies` field; NOK for most Norwegian companies) — check it before comparing absolute amounts. `antall_ansatte` is a CURRENT-value register attribute with no per-year history: read it from the top-level `antall_ansatte` field ({orgnr: headcount}); its rows in `comparison` are always null.", "inputSchema": { "properties": { "metrics": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Optional subset of metrics: omsetning, driftsresultat, aarsresultat, sum_egenkapital, sum_gjeld, antall_ansatte. Omit for the standard set.", "title": "Metrics" }, "orgnrs": { "description": "1-5 unique orgnr to compare side-by-side; duplicates are invalid.", "items": { "type": "string" }, "maxItems": 5, "minItems": 1, "title": "Orgnrs", "type": "array", "uniqueItems": true }, "years": { "default": 5, "maximum": 10, "minimum": 1, "title": "Years", "type": "integer" } }, "required": [ "orgnrs" ], "type": "object" }, "name": "firmaradar_compare_companies", "outputSchema": { "properties": { "antall_ansatte": { "anyOf": [ { "additionalProperties": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "type": "object" }, { "type": "null" } ], "default": null, "description": "{<orgnr>: <current headcount|null>}. Present only when `antall_ansatte` is in the requested metric set. CURRENT value from Enhetsregisteret (the register attribute has no per-year history), mirroring `companies[].antall_ansatte` on the server-side compare endpoint. Null is NOT self-explanatory and has at least three causes, which this field cannot tell apart: (a) the register has no headcount for that company; (b) the value was withheld from you — see `utelatte_felter` and `utelatelsesarsak`; or (c) the per-company history request failed or timed out, which is swallowed per company so one bad response does not fail the whole comparison. Never report null as \"unknown headcount\" without checking `utelatte_felter` first, and treat a full column of nulls as suspect rather than as fact about Norway.", "title": "Antall Ansatte" }, "comparison": { "additionalProperties": { "additionalProperties": { "items": {}, "type": "array" }, "type": "object" }, "description": "{<metric>: {<orgnr>: [<value_per_year>, ...]}}. For `antall_ansatte` the per-year lists are always null — headcount does not exist per fiscal year; use the top-level `antall_ansatte` field instead.", "title": "Comparison", "type": "object" }, "computed_at": { "title": "Computed At", "type": "string" }, "currencies": { "anyOf": [ { "additionalProperties": { "items": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "type": "array" }, "type": "object" }, { "type": "null" } ], "default": null, "description": "{<orgnr>: [<ISO 4217 currency per year, aligned with `years`>]}. None for years without data. Amounts in `comparison` are in the company's reporting currency for that year (NOK for most Norwegian companies) — do not compare amounts across different currencies without converting.", "title": "Currencies" }, "orgnrs": { "items": { "type": "string" }, "title": "Orgnrs", "type": "array" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Summary" }, "utelatelsesarsak": { "anyOf": [ { "enum": [ "tier_required", "verification_unavailable", "unknown" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "Why the fields in `utelatte_felter` were omitted. `tier_required` means the REST producer explicitly reported that access requires a machine-channel tier; `verification_unavailable` means access could not be verified and the backend failed closed; `unknown` covers legacy, missing, unrecognised, or conflicting per-company producer diagnostics. Never treat `unknown` or `verification_unavailable` as proof that the account lacks a subscription. Null when no requested source was detected as omitted.", "title": "Utelatelsesarsak" }, "utelatt_av_plan": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "deprecated": true, "description": "Deprecated compatibility alias for `utelatte_felter`. It is populated only when `utelatelsesarsak` is explicitly `tier_required`; it is null for verification failures, missing or legacy diagnostics, conflicting diagnoses, and normal responses. New consumers must use the neutral fields.", "title": "Utelatt Av Plan" }, "utelatte_felter": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Lists the requested metrics whose SOURCE was redacted for you — e.g. [\"omsetning\", \"antall_ansatte\"]. Absent when nothing was redacted. Read its contents, do not test for the key. 🔑 It marks REDACTION OF THE SOURCE, not proof that a value existed. For the financial series the whole history payload is emptied, so no per-metric evidence survives: a listed metric may still have been null for a given company anyway. Only antall_ansatte has its own surviving evidence and is listed solely when it was genuinely removed. Read it as \"not available to you here\", and note the three limits on what it proves. (1) It does NOT mean every null in those fields was withheld: a listed field may still be null for a company the register simply has no value for. It marks the response, not the individual cells. (2) It is stated once for the whole response and does NOT tell you which company or which value was affected. Withholding normally follows the caller and then covers all of them, but the access check runs independently per company request and fails closed on its own errors, so a transient fault can strip one company and not another. Never infer that every company was equally affected. (3) The usual cause is that the caller has no active API/MCP/machine subscription. Upgrading grants access to the source; it does not prove that the source contains a value for every requested metric. The backend also redacts when it cannot verify a subscription at all (it fails closed on a database error), so a paying customer can see this marker during an incident. Treat it as a reason to check access, not as a settled statement about the account.", "title": "Utelatte Felter" }, "years": { "items": { "type": "integer" }, "title": "Years", "type": "array" } }, "required": [ "orgnrs", "years", "comparison", "computed_at" ], "type": "object" } }, { "description": "Confirm the pre-screening disclaimer required by firmaradar_get_risk_score. This is a one-time confirmation per Firmaradar user (not per agent and not per call); it is permanent and audit-logged. Requires an OAuth token tied to a user whose plan has risk scoring enabled. Idempotent — if the user has already confirmed, the existing confirmation is returned (same audit_id). The confirmation declares that risk scoring is used only for legitimate purposes (KYC, credit pre-screening, due diligence, supplier screening) and NOT as a substitute for a formal credit assessment or an automated adverse decision. The disclaimer text and version are embedded in this tool and sent to the backend as an explicit string match, so an agent cannot confirm a version it has not seen. Call this tool only when the user has explicitly instructed you to confirm the disclaimer on their behalf.", "inputSchema": { "description": "Tom input — disclaimer-versjon og -tekst er innebygd i tool-\nhandleren slik at agenten ikke trenger å gjette eller hardkode dem.\n\nDesignvalg: agenten bør lese tool-beskrivelsen som forklarer at\nbekreftelsen forplikter brukeren, og samtykke ved å kalle tool-en\npå vegne av en bruker som har gitt eksplisitt instruksjon.", "properties": {}, "type": "object" }, "name": "firmaradar_confirm_risk_score_disclaimer", "outputSchema": { "properties": { "audit_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "ID of the audit row in ``extension_kundebekreftelse_event``.", "title": "Audit Id" }, "confirmed": { "description": "True if the disclaimer is confirmed for the user.", "title": "Confirmed", "type": "boolean" }, "confirmed_at": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO timestamp of the confirmation.", "title": "Confirmed At" }, "confirmed_by_user_id": { "description": "ID of the Firmaradar user the confirmation is registered against.", "title": "Confirmed By User Id", "type": "integer" }, "idempotent": { "default": false, "description": "True if the confirmation already existed (no new row written).", "title": "Idempotent", "type": "boolean" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "version": { "description": "Disclaimer version that was confirmed (e.g. 'v1').", "title": "Version", "type": "string" } }, "required": [ "confirmed", "version", "confirmed_by_user_id" ], "type": "object" } }, { "description": "Convert a NOK amount to a foreign currency (EUR, USD, GBP, SEK, DKK) using daily exchange rates from Norges Bank (the Norwegian central bank). Firmaradar's financial figures are reported in NOK; use this to express them in another currency for international workflows. The NOK original is always preserved in the response. Omit amount_nok to fetch just the current rate.", "inputSchema": { "properties": { "amount_nok": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "description": "Amount in NOK to convert. Omit to fetch only the current rate (the response 'amount' will be null).", "title": "Amount Nok" }, "to_currency": { "description": "Target ISO 4217 currency code. Supported: EUR, USD, GBP, SEK, DKK.", "title": "To Currency", "type": "string" } }, "required": [ "to_currency" ], "type": "object" }, "name": "firmaradar_convert_nok", "outputSchema": { "properties": { "amount": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "description": "Converted amount in the target currency.", "title": "Amount" }, "amount_nok": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "description": "The original NOK amount (preserved, unchanged).", "title": "Amount Nok" }, "currency": { "description": "Target currency (ISO 4217).", "title": "Currency", "type": "string" }, "rate": { "description": "Multiplier applied: amount = amount_nok * rate (target units per NOK).", "title": "Rate", "type": "number" }, "rate_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO date of the Norges Bank observation.", "title": "Rate Date" }, "source": { "default": "norges_bank", "description": "Rate source.", "title": "Source", "type": "string" } }, "required": [ "currency", "rate" ], "type": "object" } }, { "description": "Delete one NACE industry-monitoring subscription by its id (from list_my_subscriptions); Firmaradar then stops delivering webhooks for that industry. The subscription must belong to the authenticated user. Idempotent — deleting an id that is already gone returns already_absent=true rather than an error. Reversible only by re-subscribing. Call only when the user has asked to stop monitoring an industry.", "inputSchema": { "properties": { "subscription_id": { "description": "The id of the subscription to delete (from list_my_subscriptions). Must belong to the authenticated user.", "title": "Subscription Id", "type": "integer" } }, "required": [ "subscription_id" ], "type": "object" }, "name": "firmaradar_delete_subscription", "outputSchema": { "properties": { "already_absent": { "default": false, "description": "True if no subscription with that id existed for the user (nothing to delete).", "title": "Already Absent", "type": "boolean" }, "deleted": { "description": "True if the subscription was removed.", "title": "Deleted", "type": "boolean" }, "id": { "description": "The id that was targeted.", "title": "Id", "type": "integer" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" } }, "required": [ "deleted", "id" ], "type": "object" } }, { "description": "Find companies related to the given orgnr via shared persons (board members/shareholders), shared registered address, or shared ultimate owners. Use for cluster analysis, hidden-relation detection in DD, or fraud-pattern research.", "inputSchema": { "properties": { "limit": { "default": 25, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer" }, "min_overlap": { "default": 1, "description": "When via=person/owner: minimum number of shared entities to qualify.", "minimum": 1, "title": "Min Overlap", "type": "integer" }, "orgnr": { "description": "9-digit orgnr — the company to find relations for.", "title": "Orgnr", "type": "string" }, "via": { "description": "'person' = shared board members/shareholders. 'address' = same forretningsadresse. 'owner' = shares significant owners (>=10%) via the shareholder-book ownership graph (heavier — owner-graph traversal).", "enum": [ "person", "address", "owner" ], "title": "Via", "type": "string" } }, "required": [ "orgnr", "via" ], "type": "object" }, "name": "firmaradar_find_related_companies", "outputSchema": { "$defs": { "RelatedCompany": { "properties": { "navn": { "title": "Navn", "type": "string" }, "orgnr": { "title": "Orgnr", "type": "string" }, "relation_strength": { "description": "Higher = stronger relation.", "title": "Relation Strength", "type": "integer" }, "shared_entities": { "items": { "additionalProperties": true, "type": "object" }, "title": "Shared Entities", "type": "array" } }, "required": [ "orgnr", "navn", "relation_strength" ], "title": "RelatedCompany", "type": "object" } }, "properties": { "orgnr": { "title": "Orgnr", "type": "string" }, "related": { "items": { "$ref": "#/$defs/RelatedCompany" }, "title": "Related", "type": "array" }, "total_count": { "title": "Total Count", "type": "integer" }, "via": { "title": "Via", "type": "string" } }, "required": [ "orgnr", "via", "related", "total_count" ], "type": "object" } }, { "description": "Analyse hidden connections across 2–10 Norwegian companies at once: shared board members/signatories, shared registered address, shared owners or ultimate parent, circular ownership, shared auditor, and companies founded close together in time — returned with weighted risk indicators, an overall risk level (lav/middels/hoy) and a node/edge graph. Use for due-diligence cluster analysis, shell-company / straw-man detection and fraud-pattern research. Requires the customer's koblingsanalyse extension; the company count is capped by their tier. Look up orgnrs via search_companies first.", "inputSchema": { "properties": { "orgnrs": { "description": "2–10 Norwegian organisation numbers (9 digits each) to analyse together.", "items": { "type": "string" }, "maxItems": 10, "minItems": 2, "title": "Orgnrs", "type": "array" } }, "required": [ "orgnrs" ], "type": "object" }, "name": "firmaradar_find_shared_connections", "outputSchema": { "properties": { "felles_adresser": { "items": { "additionalProperties": true, "type": "object" }, "title": "Felles Adresser", "type": "array" }, "felles_eiere": { "items": { "additionalProperties": true, "type": "object" }, "title": "Felles Eiere", "type": "array" }, "felles_morselskap": { "items": { "additionalProperties": true, "type": "object" }, "title": "Felles Morselskap", "type": "array" }, "felles_personer": { "items": { "additionalProperties": true, "type": "object" }, "title": "Felles Personer", "type": "array" }, "felles_revisor_selskap": { "items": { "additionalProperties": true, "type": "object" }, "title": "Felles Revisor Selskap", "type": "array" }, "graf": { "additionalProperties": true, "description": "{noder, kanter} for graph rendering.", "title": "Graf", "type": "object" }, "meta": { "additionalProperties": true, "title": "Meta", "type": "object" }, "risiko_indikatorer": { "items": { "additionalProperties": true, "type": "object" }, "title": "Risiko Indikatorer", "type": "array" }, "risiko_niva": { "default": "ukjent", "title": "Risiko Niva", "type": "string" }, "risiko_score": { "default": 0, "title": "Risiko Score", "type": "number" }, "selskaper": { "description": "Companies analysed ({orgnr, navn}).", "items": { "additionalProperties": true, "type": "object" }, "title": "Selskaper", "type": "array" }, "sirkulaer_eierskap": { "items": { "additionalProperties": true, "type": "object" }, "title": "Sirkulaer Eierskap", "type": "array" }, "stiftet_tett": { "items": { "additionalProperties": true, "type": "object" }, "title": "Stiftet Tett", "type": "array" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Summary" } }, "type": "object" } }, { "description": "Poll the status and result of an asynchronous AML report started with `start_aml_report`. Pass the report_id; returns status (pending/running/done/failed). When status is 'done' it includes the AML risk score (0-100), level (low/medium/high) and links to the stored report; when 'failed' it includes the error reason. Poll periodically until the status is terminal (done/failed).", "inputSchema": { "properties": { "report_id": { "description": "The report_id returned by `start_aml_report`.", "title": "Report Id", "type": "string" } }, "required": [ "report_id" ], "type": "object" }, "name": "firmaradar_get_aml_report", "outputSchema": { "properties": { "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Failure reason (only when status='failed').", "title": "Error" }, "level": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "low/medium/high (only when status='done').", "title": "Level" }, "orgnr": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Orgnr" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "report_id": { "title": "Report Id", "type": "string" }, "score": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "AML risk score 0-100 (only when status='done').", "title": "Score" }, "status": { "description": "One of: pending, running, done, failed.", "title": "Status", "type": "string" } }, "required": [ "report_id", "status" ], "type": "object" } }, { "description": "Structured COMPANY AML risk score (0-100) with named level (low/medium/high), by orgnr. This is the primary tool for 'what is the AML risk / AML score of company X'. Call it ONCE per company — it ALREADY screens the company's key persons and beneficial owners against PEP and sanctions lists internally and folds that into the score. You normally do NOT need to call `check_aml_pep` per owner/officer afterwards; do that only for ad-hoc screening of one specific named individual you need extra detail on. Complements `check_aml_pep` (binary match data for a single PERSON name). Generates an auditable AML report on the backend (rapport_id stored for 60 months per Hvitvaskingsloven §35); factor-level detail lives in the stored report links. The report is generated asynchronously — for very large/complex ownership structures the result can come back with level='pending' and a rapport_id; poll `get_aml_report` with that id until status is 'done'.", "inputSchema": { "properties": { "orgnr": { "description": "9-digit norwegian organization number.", "title": "Orgnr", "type": "string" }, "purpose": { "default": "kyc_onboarding", "description": "Purpose of the screening — recorded for audit trail.", "enum": [ "kyc_onboarding", "kyc_review", "risk_monitoring", "manual" ], "title": "Purpose", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_aml_score", "outputSchema": { "$defs": { "AmlFactor": { "properties": { "details": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Details" }, "id": { "title": "Id", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "triggered": { "title": "Triggered", "type": "boolean" }, "weight": { "title": "Weight", "type": "integer" } }, "required": [ "id", "weight", "triggered" ], "title": "AmlFactor", "type": "object" } }, "properties": { "factors": { "description": "Always empty for the async report flow — factor detail lives in the stored report (json_url/pdf_url in `raw` when done).", "items": { "$ref": "#/$defs/AmlFactor" }, "title": "Factors", "type": "array" }, "level": { "description": "One of: low, medium, high — or 'pending' when the report is still generating (poll `get_aml_report` with rapport_id).", "title": "Level", "type": "string" }, "orgnr": { "title": "Orgnr", "type": "string" }, "rapport_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Persistent report-id for compliance audit (retrievable later).", "title": "Rapport Id" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "score": { "description": "AML risk score 0-100 (higher = riskier).", "title": "Score", "type": "integer" } }, "required": [ "orgnr", "score", "level" ], "type": "object" } }, { "description": "Fetch the full profile for one Norwegian company by orgnr: name, group structure, ownership data, grants, recent BRREG announcements and financial metrics. Opt-in `fields` add deeper enrichment — notably `fields=['ip']` for the company's intellectual-property portfolio (patents, trademarks and designs from Patentstyret). The primary 'show me this company' tool — use after `search_companies` returns an orgnr. Sourced from the official Norwegian registers (BRREG Enhetsregisteret + Skatteetaten + Patentstyret) and refreshed daily. The result includes a canonical Firmaradar `url`.", "inputSchema": { "properties": { "fields": { "description": "Subset of sections to include. Omit to get the default profile. Notable opt-in sections: `ip` — intellectual-property portfolio (patents, trademarks and designs from Patentstyret); `group` — full group structure; `owners`/`business_owners`/`full_owners` — ownership tiers; `grants` — public grants; `changes` — recent register changes; `financial_metrics` — accounting figures.", "items": { "enum": [ "group", "owners", "business_owners", "full_owners", "grants", "brreg_grants", "ip", "changes", "financial_metrics" ], "type": "string" }, "title": "Fields", "type": "array" }, "include_financial_metrics": { "default": false, "title": "Include Financial Metrics", "type": "boolean" }, "orgnr": { "description": "Norwegian organisation number — exactly 9 digits.", "title": "Orgnr", "type": "string" }, "owners": { "anyOf": [ { "enum": [ "business", "full" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "Owner-tier requested. 'full' requires Full eierskapsoversikt tier.", "title": "Owners" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_company", "outputSchema": { "properties": { "brreg_tildelinger": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Brreg Tildelinger" }, "eiere": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Eiere" }, "endringer": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Endringer" }, "financial_metrics": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Financial Metrics" }, "foretaksklassifisering": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Foretaksklassifisering" }, "ip_rettigheter": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Ip Rettigheter" }, "konsernstruktur": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Konsernstruktur" }, "navn": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Navn" }, "orgnr": { "title": "Orgnr", "type": "string" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "The server's response as received, without local enrichment.", "title": "Raw" }, "source": { "default": "Firmaradar", "description": "Authoritative source name.", "title": "Source", "type": "string" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable summary (LLM-friendly).", "title": "Summary" }, "tildelinger": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Tildelinger" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Canonical Firmaradar source URL for this company — cite this.", "title": "Url" } }, "required": [ "orgnr" ], "type": "object" } }, { "description": "List BRREG kunngjøringer (official announcements) for a Norwegian company: bankruptcy, mergers, demergers, ownership changes, address changes, etc. Free-text fields are wrapped in <untrusted_content> tags to prevent prompt injection from BRREG-sourced text.", "inputSchema": { "properties": { "orgnr": { "description": "9-digit orgnr.", "title": "Orgnr", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_company_announcements", "outputSchema": { "$defs": { "Announcement": { "properties": { "category": { "description": "Normalised Norwegian category: 'konkurs' (bankruptcy), 'fusjon' (merger), 'fisjon' (demerger), 'eierbytte' (change of ownership), 'aarsregnskap' (annual accounts), ...", "title": "Category", "type": "string" }, "dato": { "description": "ISO 8601 date (YYYY-MM-DD).", "title": "Dato", "type": "string" }, "hendelse_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Hendelse Type" }, "kunngjoring_type": { "description": "Raw BRREG label, e.g. 'Konkursåpning' (bankruptcy opening).", "title": "Kunngjoring Type", "type": "string" }, "navn": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Navn" } }, "required": [ "dato", "kunngjoring_type", "category" ], "title": "Announcement", "type": "object" } }, "properties": { "count": { "title": "Count", "type": "integer" }, "items": { "items": { "$ref": "#/$defs/Announcement" }, "title": "Items", "type": "array" }, "orgnr": { "title": "Orgnr", "type": "string" } }, "required": [ "orgnr", "count", "items" ], "type": "object" } }, { "description": "Fetch the last N years (default 5) of financial metrics for a Norwegian company: revenue, operating result, equity, debt, employees. Use when the user asks 'how is X AS doing financially?' or 'show me the revenue trend'. Figures come from the official annual accounts filed with BRREG. Amounts are in the company's reporting currency — check the `valuta` field (NOK for most companies, but e.g. USD for some international groups; 'MIXED' means the currency changed within the series).", "inputSchema": { "properties": { "orgnr": { "description": "9-digit orgnr.", "title": "Orgnr", "type": "string" }, "regnskapstype": { "default": "SELSKAP", "enum": [ "SELSKAP", "KONSERN" ], "title": "Regnskapstype", "type": "string" }, "skip_freshness": { "default": false, "description": "Skip the inline freshness fetch (faster, but may return stale data).", "title": "Skip Freshness", "type": "boolean" }, "years": { "default": 5, "maximum": 20, "minimum": 1, "title": "Years", "type": "integer" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_company_financials", "outputSchema": { "$defs": { "FinancialYear": { "properties": { "aar": { "title": "Aar", "type": "integer" }, "aarsresultat": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Aarsresultat" }, "antall_ansatte": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Antall Ansatte" }, "driftsresultat": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Driftsresultat" }, "omsetning": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Omsetning" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "sum_egenkapital": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Sum Egenkapital" }, "sum_gjeld": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Sum Gjeld" }, "valuta": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Reporting currency for this year (ISO 4217). None means NOK.", "title": "Valuta" } }, "required": [ "aar" ], "title": "FinancialYear", "type": "object" } }, "properties": { "freshness": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Freshness" }, "orgnr": { "title": "Orgnr", "type": "string" }, "regnskapstype": { "title": "Regnskapstype", "type": "string" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Summary" }, "utelatelsesarsak": { "anyOf": [ { "enum": [ "tier_required", "verification_unavailable", "unknown" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "Why `utelatte_felter` was omitted: `tier_required` means the REST producer explicitly reported that access requires a machine-channel tier; `verification_unavailable` means access could not be verified and the backend failed closed; `unknown` covers legacy, missing, or unrecognised producer diagnostics. Never treat `unknown` or `verification_unavailable` as proof that the account lacks a subscription. Null when nothing was omitted.", "title": "Utelatelsesarsak" }, "utelatte_felter": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Lists financial fields whose SOURCE was omitted from this response. It does not prove that every listed field had a non-null value in every year. `antall_ansatte` is listed only when surviving classification evidence proves that a measured headcount was removed. Null when no source omission was detected.", "title": "Utelatte Felter" }, "valuta": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Reporting currency across the series (ISO 4217, e.g. 'NOK' or 'USD'). 'MIXED' when the years are filed in different currencies — then check valuta per year before comparing amounts across years.", "title": "Valuta" }, "years": { "items": { "$ref": "#/$defs/FinancialYear" }, "title": "Years", "type": "array" } }, "required": [ "orgnr", "regnskapstype", "years" ], "type": "object" } }, { "description": "Intellectual-property portfolio for a Norwegian company (by orgnr), sourced from Patentstyret: patents, trademarks and designs — totals, active counts, and a list of individual rights (registration number, date, status, expiry date where applicable, title and a link to the Patentstyret case). Use this for ANY question about a company's patents, trademarks, designs or IP rights — Firmaradar covers this. The `rights` list is ordered newest-first, so the first N entries are the newest rights. Look up the orgnr via `search_companies` first if you only have a name.", "inputSchema": { "properties": { "orgnr": { "description": "Norwegian organisation number — exactly 9 digits.", "title": "Orgnr", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_company_ip", "outputSchema": { "properties": { "available": { "default": false, "description": "Whether Patentstyret IP data was found.", "title": "Available", "type": "boolean" }, "designs": { "default": 0, "title": "Designs", "type": "integer" }, "designs_active": { "default": 0, "title": "Designs Active", "type": "integer" }, "navn": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Navn" }, "orgnr": { "title": "Orgnr", "type": "string" }, "patents": { "default": 0, "title": "Patents", "type": "integer" }, "patents_active": { "default": 0, "title": "Patents Active", "type": "integer" }, "rights": { "items": { "additionalProperties": true, "type": "object" }, "title": "Rights", "type": "array" }, "rights_more": { "default": 0, "description": "Antall rettigheter ut over `rights`-lista.", "title": "Rights More", "type": "integer" }, "source": { "default": "Firmaradar / Patentstyret", "description": "Authoritative source.", "title": "Source", "type": "string" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Summary" }, "trademarks": { "default": 0, "title": "Trademarks", "type": "integer" }, "trademarks_active": { "default": 0, "title": "Trademarks Active", "type": "integer" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Canonical Firmaradar source URL.", "title": "Url" } }, "required": [ "orgnr" ], "type": "object" } }, { "description": "Get the ownership tree for a Norwegian company: who they own (direction=down), who owns them (direction=up / UBO), or both. Use when the user asks 'who owns X AS?' or to map a corporate group. Ownership comes from Skatteetaten's Aksjeeierbok (the official shareholder register) and reflects the latest filed holdings. The result contains ownership edges, percentages and company identifiers for the requested traversal direction.", "inputSchema": { "properties": { "depth": { "default": 5, "description": "Max recursion depth.", "maximum": 10, "minimum": 1, "title": "Depth", "type": "integer" }, "direction": { "default": "down", "description": "'down' = who this company owns. 'up' = who owns this company (UBO). 'both' = both trees.", "enum": [ "down", "up", "both" ], "title": "Direction", "type": "string" }, "include_persons": { "default": false, "description": "Include sensitive personal shareholders (UBO). This is a consent control, not a subscription tier. For direct API-key calls, enable the key's own consent and include the target orgnr in its allowlist when one is configured. OAuth MCP access requires both explicit connector-key consent and the current account setting. Without it the call is rejected with 403. Only applies when direction is up or both — direction=down returns holdings only, never contains persons, and is allowed without consent. Omitting direction uses the route default 'down'.", "title": "Include Persons", "type": "boolean" }, "min_share_pct": { "anyOf": [ { "maximum": 100, "minimum": 0, "type": "number" }, { "type": "null" } ], "default": null, "description": "Drop branches where ownership < this percentage.", "title": "Min Share Pct" }, "orgnr": { "description": "Norwegian organisation number — 9 digits.", "title": "Orgnr", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_company_ownership", "outputSchema": { "properties": { "depth": { "title": "Depth", "type": "integer" }, "direction": { "title": "Direction", "type": "string" }, "orgnr": { "title": "Orgnr", "type": "string" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Summary" }, "tree": { "additionalProperties": true, "title": "Tree", "type": "object" } }, "required": [ "orgnr", "direction", "depth", "tree" ], "type": "object" } }, { "description": "List board members, daglig leder, signature holders, prokura and revisor for a Norwegian company. Set include_historic=true for people who previously held roles. Use when the user asks 'who runs X AS?' or 'who is on the board?' Roles come live from BRREG (the official enterprise register) and include role type and available appointment or resignation dates.", "inputSchema": { "properties": { "include_historic": { "default": false, "description": "Include roles that have ended.", "title": "Include Historic", "type": "boolean" }, "orgnr": { "description": "9-digit orgnr.", "title": "Orgnr", "type": "string" }, "role_type": { "anyOf": [ { "enum": [ "styreleder", "styremedlem", "varamedlem", "daglig_leder", "signatur", "prokura", "revisor" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "Filter on a single role type. Omit to get all roles.", "title": "Role Type" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_company_roles", "outputSchema": { "$defs": { "CompanyRole": { "properties": { "fodselsaar": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Fodselsaar" }, "fra_dato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Fra Dato" }, "navn": { "title": "Navn", "type": "string" }, "role_person_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Stable ID — pass to `get_person_roles` for more.", "title": "Role Person Id" }, "rolle_type": { "title": "Rolle Type", "type": "string" }, "signatur_alene": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Signatur Alene" }, "til_dato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Til Dato" } }, "required": [ "rolle_type", "navn" ], "title": "CompanyRole", "type": "object" } }, "properties": { "orgnr": { "title": "Orgnr", "type": "string" }, "roles": { "items": { "$ref": "#/$defs/CompanyRole" }, "title": "Roles", "type": "array" }, "total_count": { "title": "Total Count", "type": "integer" } }, "required": [ "orgnr", "roles", "total_count" ], "type": "object" } }, { "description": "Aggregated risk and growth signals for one company: bankruptcy/distress score, capital-loss flags, M&A interim-balance signals, KYC announcement anomalies, NAV hiring/growth signal, merger/demerger (fusjon/fisjon) relations, ownership-change history (owner churn), plus authoritative voluntary-org (Frivillighetsregister) status. Use as the second step after `get_company` to evaluate whether a company needs deeper due diligence.", "inputSchema": { "properties": { "orgnr": { "description": "9-digit orgnr.", "title": "Orgnr", "type": "string" }, "since": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO 8601 date — lookback cutoff for the announcement-based KYC signals (kyc_signals). Defaults to 730 days back, capped at 1825. State-based sources (distress, interim balance, hiring, funding, IP, ownership churn, …) always report their current state and are not affected by this cutoff.", "title": "Since" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_company_signals", "outputSchema": { "$defs": { "KycSignal": { "properties": { "kategori": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Kategori" }, "kunngjoring_dato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Kunngjoring Dato" }, "payload": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Payload" }, "type": { "title": "Type", "type": "string" } }, "required": [ "type" ], "title": "KycSignal", "type": "object" } }, "properties": { "distress_category": { "anyOf": [ { "enum": [ "green", "yellow", "red", "unknown" ], "type": "string" }, { "type": "null" } ], "default": null, "title": "Distress Category" }, "distress_reasons": { "items": { "type": "string" }, "title": "Distress Reasons", "type": "array" }, "distress_score": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Distress Score" }, "frivillighet": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Authoritative Frivillighetsregister (voluntary-org) membership: registered, registreringsdato, kategorier. Omitted when the source is off.", "title": "Frivillighet" }, "fusjon": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Merger/demerger relations: inbound (companies merged into this orgnr) + outbound (companies this orgnr was merged into), with dates.", "title": "Fusjon" }, "generated_at": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Generated At" }, "hiring": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "NAV Arbeidsplassen hiring/growth signal: active_postings, positions_active, postings_30d/90d, burst_score, is_hiring_burst.", "title": "Hiring" }, "interim_balance_signal": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Interim Balance Signal" }, "kyc_signals": { "items": { "$ref": "#/$defs/KycSignal" }, "title": "Kyc Signals", "type": "array" }, "orgnr": { "title": "Orgnr", "type": "string" }, "ownership_churn": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Ownership-change history (owner churn): changes_total, changes_in_window, window_months, threshold, last_change_date, period_months, is_frequent_owner_change, calibrated. Repeated changes of the controlling owner are a known KYC/AML review trigger. NOTE: calibrated=false means the threshold is provisional — treat is_frequent_owner_change as a prompt for review, never as a verified finding, and never read a low count as confirmed ownership stability.", "title": "Ownership Churn" }, "recent_role_changes_count": { "default": 0, "title": "Recent Role Changes Count", "type": "integer" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Summary" } }, "required": [ "orgnr" ], "type": "object" } }, { "description": "Tree-structured overview of public grants (Innovasjon Norge, SkatteFUNN, BRREG støtteregister, Prosjektbanken) for a Norwegian company and its konsern. Returns ``selskap_stotte`` per node (støtte to that specific company) and ``konsern_aggregat`` (sum across the full hierarchy). NOTE: SkatteFUNN never reports amounts — use ``antall_prosjekter`` as the primary activity KPI since ``total_belop_nok`` excludes SkatteFUNN by source design. Use for due-diligence, state-aid compliance checks, or competitive intelligence.", "inputSchema": { "properties": { "orgnr": { "description": "9-digit norwegian organization number (typically konsern-toppen).", "title": "Orgnr", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_konsernstotte", "outputSchema": { "$defs": { "KonsernAggregat": { "description": "Aggregert sum av selskapsstøtte for alle selskap i konsernet.\n\n\"Konsernstøtte\" er per definisjon en utledet KPI — ingen kilde gir\nstøtte til et konsern direkte. Aggregatet summerer\n:class:`SelskapStotte` for hvert selskap i hierarkiet.", "properties": { "andre": { "default": 0, "title": "Andre", "type": "integer" }, "antall_prosjekter": { "default": 0, "title": "Antall Prosjekter", "type": "integer" }, "antall_selskaper": { "default": 0, "title": "Antall Selskaper", "type": "integer" }, "innovasjon_norge": { "default": 0, "title": "Innovasjon Norge", "type": "integer" }, "skattefunn": { "default": 0, "title": "Skattefunn", "type": "integer" }, "total_belop_nok": { "default": 0, "title": "Total Belop Nok", "type": "number" } }, "title": "KonsernAggregat", "type": "object" }, "KonsernNode": { "properties": { "antall_underselskaper": { "default": 0, "title": "Antall Underselskaper", "type": "integer" }, "barn": { "items": {}, "title": "Barn", "type": "array" }, "navn": { "title": "Navn", "type": "string" }, "orgnr": { "title": "Orgnr", "type": "string" }, "selskap_stotte": { "$ref": "#/$defs/SelskapStotte" } }, "required": [ "orgnr", "navn" ], "title": "KonsernNode", "type": "object" }, "SelskapStotte": { "description": "Støtte gitt direkte til *ett* selskap.\n\nSkatteFUNN/Innovasjon Norge gir aldri støtte til konsern, kun til\nindividuelle selskap (#134, 2026-05-27). Aggregeringen på tvers av\nkonsernhierarkiet finner du i :class:`KonsernAggregat`.", "properties": { "andre": { "default": 0, "title": "Andre", "type": "integer" }, "antall_prosjekter": { "default": 0, "title": "Antall Prosjekter", "type": "integer" }, "innovasjon_norge": { "default": 0, "title": "Innovasjon Norge", "type": "integer" }, "skattefunn": { "default": 0, "title": "Skattefunn", "type": "integer" }, "total_belop_nok": { "default": 0, "title": "Total Belop Nok", "type": "number" } }, "title": "SelskapStotte", "type": "object" } }, "properties": { "antall_underselskaper": { "default": 0, "title": "Antall Underselskaper", "type": "integer" }, "barn": { "items": { "$ref": "#/$defs/KonsernNode" }, "title": "Barn", "type": "array" }, "konsern_aggregat": { "$ref": "#/$defs/KonsernAggregat" }, "navn": { "title": "Navn", "type": "string" }, "orgnr": { "title": "Orgnr", "type": "string" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "selskap_stotte": { "$ref": "#/$defs/SelskapStotte" } }, "required": [ "orgnr", "navn" ], "type": "object" } }, { "description": "Aggregated person profile: name, birth year, active roles, shareholdings and any AML/PEP risk hits. Also returns `konkurs_eksponering` — leadership roles the person held in companies that later went bankrupt (tenure-weighted, from the dated role history). That match is name-based (no national ID), so it is a REVIEW FLAG to verify, not a verdict. Note: this profile lookup does NOT run a PEP/sanctions screening — an empty `aml_pep_hits` is not a clean bill; use `firmaradar_check_aml_pep` for an actual screening. Strict PII-sensitive — requires search_full_enabled tier and F10.11 purpose confirmation. Minors are blocked except for super-admin accounts.", "inputSchema": { "properties": { "person_id": { "description": "Person ID — either `person-YYYY-[24 hex]` (from `search_persons` shareholders) or `role-[24 hex]` (from `search_persons` role_persons).", "title": "Person Id", "type": "string" }, "purpose": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Purpose-of-processing string for the F10.11 audit trail. Required when calling against accounts with purpose-confirmation.", "title": "Purpose" } }, "required": [ "person_id" ], "type": "object" }, "name": "firmaradar_get_person", "outputSchema": { "properties": { "active_roles": { "items": { "additionalProperties": true, "type": "object" }, "title": "Active Roles", "type": "array" }, "aml_pep_hits": { "items": { "additionalProperties": true, "type": "object" }, "title": "Aml Pep Hits", "type": "array" }, "aml_pep_note": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Aml Pep Note" }, "birth_year": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Birth Year" }, "konkurs_eksponering": { "additionalProperties": true, "title": "Konkurs Eksponering", "type": "object" }, "navn": { "title": "Navn", "type": "string" }, "person_id": { "title": "Person Id", "type": "string" }, "shareholdings": { "items": { "additionalProperties": true, "type": "object" }, "title": "Shareholdings", "type": "array" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Summary" } }, "required": [ "person_id", "navn" ], "type": "object" } }, { "description": "List all Norwegian companies where the given person holds shares. Use when the user asks 'what does Person A own?' Pass the owner_person_key returned by `search_persons`.", "inputSchema": { "properties": { "include_historic": { "default": false, "description": "Reserved for future support; currently only current holdings are returned.", "title": "Include Historic", "type": "boolean" }, "person_key": { "description": "Shareholder key, format `person-YYYY-[24 hex]`. Obtain from `search_persons` shareholders[] results.", "title": "Person Key", "type": "string" } }, "required": [ "person_key" ], "type": "object" }, "name": "firmaradar_get_person_companies", "outputSchema": { "$defs": { "Shareholding": { "properties": { "antall_aksjer": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Antall Aksjer" }, "eierandel_prosent": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Eierandel Prosent" }, "navn": { "title": "Navn", "type": "string" }, "orgnr": { "title": "Orgnr", "type": "string" } }, "required": [ "orgnr", "navn" ], "title": "Shareholding", "type": "object" } }, "properties": { "navn": { "title": "Navn", "type": "string" }, "person_key": { "title": "Person Key", "type": "string" }, "shareholdings": { "items": { "$ref": "#/$defs/Shareholding" }, "title": "Shareholdings", "type": "array" }, "total_companies": { "title": "Total Companies", "type": "integer" } }, "required": [ "person_key", "navn", "shareholdings", "total_companies" ], "type": "object" } }, { "description": "List all company roles (styreleder, daglig leder, etc.) held by a person, current and historic. Use when the user asks 'what roles does Person A hold?' Pass the role_person_id returned by `search_persons`.", "inputSchema": { "properties": { "include_historic": { "default": true, "title": "Include Historic", "type": "boolean" }, "role_person_id": { "description": "Stable role-person ID, format `role-[24 hex chars]`. Obtain from `search_persons` role_persons[] results.", "title": "Role Person Id", "type": "string" } }, "required": [ "role_person_id" ], "type": "object" }, "name": "firmaradar_get_person_roles", "outputSchema": { "$defs": { "CompanyRole": { "properties": { "fra_dato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Fra Dato" }, "navn": { "title": "Navn", "type": "string" }, "orgnr": { "title": "Orgnr", "type": "string" }, "rolle_type": { "title": "Rolle Type", "type": "string" }, "til_dato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Til Dato" } }, "required": [ "orgnr", "navn", "rolle_type" ], "title": "CompanyRole", "type": "object" } }, "properties": { "navn": { "title": "Navn", "type": "string" }, "role_person_id": { "title": "Role Person Id", "type": "string" }, "roles": { "items": { "$ref": "#/$defs/CompanyRole" }, "title": "Roles", "type": "array" }, "total_roles": { "title": "Total Roles", "type": "integer" } }, "required": [ "role_person_id", "navn", "roles", "total_roles" ], "type": "object" } }, { "description": "List changes (kunngjøringer for companies; role + ownership movements for persons) in the last N days. Use when monitoring a target entity for triggers ('has anything changed for X AS in the last month?'). Pair with `subscribe_company` for push notifications.", "inputSchema": { "properties": { "category": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Optional kunngjøring (announcement) category filter. Values are Norwegian: konkurs (bankruptcy), fusjon (merger), eierbytte (change of ownership), ...", "title": "Category" }, "days": { "default": 90, "maximum": 365, "minimum": 1, "title": "Days", "type": "integer" }, "entity_type": { "description": "'company' = orgnr; 'person' = person_id.", "enum": [ "company", "person" ], "title": "Entity Type", "type": "string" }, "id": { "description": "Orgnr (9 digits) or person_id depending on entity_type.", "title": "Id", "type": "string" } }, "required": [ "entity_type", "id" ], "type": "object" }, "name": "firmaradar_get_recent_changes", "outputSchema": { "$defs": { "ChangeItem": { "properties": { "category": { "title": "Category", "type": "string" }, "dato": { "title": "Dato", "type": "string" }, "payload": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Payload" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Summary" } }, "required": [ "dato", "category" ], "title": "ChangeItem", "type": "object" } }, "properties": { "count": { "title": "Count", "type": "integer" }, "entity_type": { "title": "Entity Type", "type": "string" }, "id": { "title": "Id", "type": "string" }, "items": { "items": { "$ref": "#/$defs/ChangeItem" }, "title": "Items", "type": "array" }, "since": { "title": "Since", "type": "string" }, "until": { "title": "Until", "type": "string" } }, "required": [ "entity_type", "id", "since", "until", "count", "items" ], "type": "object" } }, { "description": "Order a formatted, downloadable financial report (Excel or PDF) for a Norwegian company — the same multi-source-fused figures, layout and source note as the report a customer would download in the Firmaradar portal, ready to file or forward. Returns a short-lived download link + metadata (years covered, source, currency), NOT the file itself and NOT base64 data — fetch the download_url separately, no further auth required, within expires_in seconds. Use `get_company_financials` instead when you need the raw figures to reason about, not a document to hand off. Requires the Excel-export or PDF-export add-on (matching the requested format) on the caller's account. Charges 1 credit per financial year included in the report.", "inputSchema": { "properties": { "format": { "default": "pdf", "description": "'xlsx' for a spreadsheet (3 sheets: figures, key ratios, source) or 'pdf' for a print-ready report. Each format requires its own subscription add-on on the caller's account (Excel export / PDF export respectively) — a 403 'extension_not_active' error means that add-on isn't enabled.", "enum": [ "xlsx", "pdf" ], "title": "Format", "type": "string" }, "orgnr": { "description": "9-digit Norwegian organisation number.", "title": "Orgnr", "type": "string" }, "regnskapstype": { "default": "SELSKAP", "description": "'SELSKAP' for the standalone company accounts, 'KONSERN' for the consolidated group accounts (only meaningful for companies that file one).", "enum": [ "SELSKAP", "KONSERN" ], "title": "Regnskapstype", "type": "string" }, "years": { "default": 5, "description": "Number of financial years to include (hard-capped at 5).", "maximum": 5, "minimum": 1, "title": "Years", "type": "integer" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_regnskapsrapport", "outputSchema": { "properties": { "aar": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "The financial years included, newest first.", "title": "Aar" }, "antall_aar": { "description": "Number of years actually delivered in the report.", "title": "Antall Aar", "type": "integer" }, "download_url": { "description": "Short-lived signed URL (~15 min) for the actual file. No further authentication is required to fetch it — the URL itself is the credential, so treat it as sensitive and don't share it beyond the requester.", "title": "Download Url", "type": "string" }, "expires_in": { "description": "Seconds until download_url stops working.", "title": "Expires In", "type": "integer" }, "format": { "title": "Format", "type": "string" }, "kilde": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Source label shown in the report.", "title": "Kilde" }, "maks_aar": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Maks Aar" }, "orgnr": { "title": "Orgnr", "type": "string" }, "regnskapstype": { "title": "Regnskapstype", "type": "string" }, "valuta": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Reporting currency (ISO 4217, or 'MIXED' if it changed within the series).", "title": "Valuta" } }, "required": [ "orgnr", "regnskapstype", "format", "antall_aar", "download_url", "expires_in" ], "type": "object" } }, { "description": "Structured risk score (0-100) with named level (lav/moderat/høy/kritisk) and component breakdown for a Norwegian COMPANY's financial health. Combines distress classification, BRREG status, age, capital signals and other factors into one comparable score. Returns an enk_not_supported error for sole proprietorships (ENK) and Norwegian-registered foreign enterprises (NUF).\n\nSCOPE: Company financial health only. NOT a personal credit check on owners or officers. For full KYC pre-screening, combine with firmaradar_get_aml_score (PEP/sanctions on key persons).\n\n**Requires a one-time pre-screening-disclaimer confirmation.** If the tool fails with HTTP 403 and error `kundebekreftelse_required`, inform the user that confirmation is required. Call `firmaradar_confirm_risk_score_disclaimer` only after the user has explicitly instructed you to confirm the disclaimer. The confirmation is per OAuth user, not per call, and is permanent and audit-logged. Alternatively the user can confirm manually at https://firmaradar.no/minbedrift/utvidelser/risikoscoring — both paths write to the same audit table.", "inputSchema": { "properties": { "orgnr": { "description": "9-digit norwegian organization number.", "title": "Orgnr", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_get_risk_score", "outputSchema": { "$defs": { "RiskComponent": { "properties": { "id": { "title": "Id", "type": "string" }, "label": { "title": "Label", "type": "string" }, "max": { "title": "Max", "type": "number" }, "points": { "title": "Points", "type": "number" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" } }, "required": [ "id", "label", "points", "max" ], "title": "RiskComponent", "type": "object" } }, "properties": { "components": { "items": { "$ref": "#/$defs/RiskComponent" }, "title": "Components", "type": "array" }, "data_gaps": { "items": { "type": "string" }, "title": "Data Gaps", "type": "array" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Backward-compatible decoder field for recorded legacy payloads. The current endpoint returns gates as HTTP 403/404/422/503, so a gate never appears in a successful tool output.", "title": "Error" }, "level": { "description": "Norwegian risk level — one of: lav (low), moderat (moderate), høy (high), kritisk (critical). Present only in a successful HTTP 200 scoring result.", "title": "Level", "type": "string" }, "organisasjonsform": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Backward-compatible context from recorded legacy gate payloads; current gate responses are non-2xx errors.", "title": "Organisasjonsform" }, "orgnr": { "title": "Orgnr", "type": "string" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "score": { "description": "Risk score on the 0-100 scale (higher = riskier). Present only in a successful HTTP 200 scoring result. Gate responses are HTTP 403/404/422/503 errors and never instantiate this output model.", "title": "Score", "type": "number" }, "sources": { "items": { "type": "string" }, "title": "Sources", "type": "array" } }, "required": [ "orgnr", "score", "level" ], "type": "object" } }, { "description": "Bulk-endpoint for portfolio-screening of risikoscore (0-100 with named level lav/moderat/høy/kritisk + component breakdown) on up to 50 Norwegian companies in one call. Each orgnr counts as one unit against your quota. Compliance-gates (ENK/NUF blocking and customer-confirmation required) are returned per orgnr in the result list instead of failing the whole call — check each result's `error` field. Use for credit-decision screening, supplier-portfolio review, and KYC risk triage at scale.", "inputSchema": { "properties": { "orgnrs": { "description": "List of 1-50 nine-digit Norwegian organization numbers. Each orgnr counts as one unit against your quota.", "items": { "type": "string" }, "maxItems": 50, "minItems": 1, "title": "Orgnrs", "type": "array" } }, "required": [ "orgnrs" ], "type": "object" }, "name": "firmaradar_get_risk_score_bulk", "outputSchema": { "$defs": { "BulkMeta": { "properties": { "failed": { "title": "Failed", "type": "integer" }, "successful": { "title": "Successful", "type": "integer" }, "total_requested": { "title": "Total Requested", "type": "integer" } }, "required": [ "total_requested", "successful", "failed" ], "title": "BulkMeta", "type": "object" }, "BulkRiskScoreResult": { "description": "Per-organization result in a bulk risk-score response.", "properties": { "components": { "items": { "$ref": "#/$defs/RiskComponentBrief" }, "title": "Components", "type": "array" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Error type when scoring could not be completed. Validation: `invalid_orgnr`. Compliance gates: `enk_not_supported` (the organization-form gate — ENK and NUF) and `kundebekreftelse_required`. The handler gate for a temporarily closed extension requires marketplace_hidden in the extension manifest, and risk scoring has it off — that code cannot occur here. Organization lookup: `company_not_found` when the source confirms the row does not exist, and `orgform_unavailable` when the form cannot be determined. The defense-in-depth gate may return `blocked_enk`; treat it exactly like `enk_not_supported`. No gate failure carries a score or a risk level. Rollout/configuration (shared extension dispatcher): `extension_not_active`, `extension_controls_unavailable`, `data_provider_failed`, `handler_not_found`, `handler_http_exception`, `handler_failed`, `unexpected_handler_return`. The bulk runner itself: `internal_error` (outside the dispatcher). On a runtime-control failure (rate limit, compliance gate) `error` is NOT one of the codes above — the field then keeps the control layer's human-readable text, and the machine code lives in `error_code`. The same text is mirrored in `message`.", "title": "Error" }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Stable machine code. The risk-scoring handler sets the field ITSELF for its own gates, in addition to the dispatcher setting it for runtime controls. The field therefore covers EXACTLY two layers: the handler gates and the runtime controls — not all layers. From the handler, with the same value as `error`: `invalid_orgnr`, `enk_not_supported`, `blocked_enk`, `kundebekreftelse_required`, `company_not_found`, `orgform_unavailable`. From the runtime controls, where `error` carries human text instead: `rate_limit_exceeded`, `compliance_gate_revoked`, `compliance_gate_expired`, `compliance_gate_manifest_unavailable`, `compliance_gate_unavailable`. Which gate reasons can occur follows the extension manifest, and risk scoring requires no external authorization — that gate reason does not exist here. The field does NOT cover the dispatcher and runner errors: a row that fails in the extension dispatcher, or in the bulk runner itself, carries only `error` and has no `error_code` at all. The codes for those two layers are listed under `error` — always read both fields.", "title": "Error Code" }, "http_status": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "HTTP status this per-organization result would have outside bulk.", "title": "Http Status" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable detail from the runtime-control layer.", "title": "Message" }, "organisasjonsform": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "BRREG organization-form code that triggered a gate, normally ENK or NUF.", "title": "Organisasjonsform" }, "orgnr": { "title": "Orgnr", "type": "string" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "retry_after": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Retry-After header value when the row was rate limited.", "title": "Retry After" }, "risk_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Norwegian risk level — one of: lav (low), moderat (moderate), høy (high), kritisk (critical). None on error.", "title": "Risk Level" }, "score": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Score" } }, "required": [ "orgnr" ], "title": "BulkRiskScoreResult", "type": "object" }, "RiskComponentBrief": { "properties": { "id": { "title": "Id", "type": "string" }, "label": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Label" }, "max": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Max" }, "points": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Points" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" } }, "required": [ "id" ], "title": "RiskComponentBrief", "type": "object" } }, "properties": { "_meta": { "$ref": "#/$defs/BulkMeta", "description": "Aggregate count status for the whole bulk call." }, "results": { "items": { "$ref": "#/$defs/BulkRiskScoreResult" }, "title": "Results", "type": "array" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable markdown table of the per-company scores.", "title": "Summary" } }, "required": [ "_meta" ], "type": "object" } }, { "description": "List Norwegian companies in a specific NACE industry code (or code prefix), optionally filtered by status, kommune and size. Useful for sector analysis ('all active restaurants in Oslo with > 5 employees').\n\n**NACE format warning:** Use the EU NACE Rev. 2 format with a trailing zero (e.g. `62.100`, `62.200`, `58.290`). **The Norwegian SN2007 format (`62.01`, `62.02`) returns 0 hits** — we do not store SN2007. If you are unsure about a code, call `firmaradar_list_nace_codes` first. Backed by the official Norwegian register (BRREG) and refreshed daily. Use `stiftet_etter` for newly-founded-company queries.", "inputSchema": { "properties": { "code": { "description": "NACE code or prefix. Norwegian BRREG uses 5-digit SN2007 codes internally (e.g. '56.110' for restaurants, '47.111' for grocery stores). Any prefix works: '56' matches all serving (2-digit), '56.1' matches restaurants/cafes (3-digit), '56.11' matches restaurant operations (4-digit), '56.110' matches the most specific level (5-digit). If a 4-digit code yields no results, try appending '0' (e.g. '56.110' instead of '56.10').", "title": "Code", "type": "string" }, "cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Cursor" }, "kommune": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Norwegian kommunenummer — EXACTLY 4 digits, zero-padded. Examples: '0301' = Oslo, '4601' = Bergen, '5001' = Trondheim, '1103' = Stavanger. Kommune-NAMES are NOT accepted — translate the name to kommunenummer first.", "title": "Kommune" }, "limit": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" }, "max_ansatte": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "title": "Max Ansatte" }, "min_ansatte": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "title": "Min Ansatte" }, "status": { "anyOf": [ { "enum": [ "aktiv", "konkurs", "under_avvikling", "avregistrert" ], "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "stiftet_etter": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO 8601 date (YYYY-MM-DD) — only companies founded on/after this date. Use for 'newly founded companies in this industry' queries (industry monitoring).", "title": "Stiftet Etter" }, "stiftet_for": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO 8601 date (YYYY-MM-DD) — only companies founded on/before this date.", "title": "Stiftet For" } }, "required": [ "code" ], "type": "object" }, "name": "firmaradar_list_companies_in_nace", "outputSchema": { "$defs": { "NaceCatalogInfo": { "description": "Aggregat-counts fra ``nace_code`` (oppdateres nattlig).\n\nDet totale antallet norske selskaper i koden, splittet i aktive (ikke\nkonkurs/avvikling) og total (alle inkl. konkurs/avvikling). Disse er\nrullet opp i NACE-hierarkiet, så også foreldre-koder (eks. ``62``,\n``62.1``, ``62.10``) har realistiske counts.\n\n``company_count`` er en legacy-alias for ``company_count_active`` for\nback-compat — den eldre API-en lagret kun aktive selskaper i denne\nkolonnen.", "properties": { "company_count": { "title": "Company Count", "type": "integer" }, "company_count_active": { "title": "Company Count Active", "type": "integer" }, "company_count_total": { "title": "Company Count Total", "type": "integer" }, "label_no": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Label No" }, "level": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Level" }, "parent_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Parent Code" } }, "required": [ "company_count", "company_count_active", "company_count_total" ], "title": "NaceCatalogInfo", "type": "object" }, "NaceCompanyHit": { "properties": { "antall_ansatte": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Antall Ansatte" }, "kommune": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Kommune" }, "naeringskode": { "title": "Naeringskode", "type": "string" }, "navn": { "title": "Navn", "type": "string" }, "orgnr": { "title": "Orgnr", "type": "string" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "stiftelsesdato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stiftelsesdato" } }, "required": [ "orgnr", "navn", "naeringskode" ], "title": "NaceCompanyHit", "type": "object" } }, "properties": { "catalog": { "anyOf": [ { "$ref": "#/$defs/NaceCatalogInfo" }, { "type": "null" } ], "default": null }, "items": { "items": { "$ref": "#/$defs/NaceCompanyHit" }, "title": "Items", "type": "array" }, "nace_code": { "title": "Nace Code", "type": "string" }, "next_cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Next Cursor" }, "total_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Total Count" } }, "required": [ "nace_code", "items" ], "type": "object" } }, { "description": "List the NACE industry-monitoring subscriptions of the authenticated Firmaradar user (created via subscribe_nace or the portal). Returns each subscription's id, NACE code, webhook URL, event filters, aggregation mode, geographic/size filters and active state. Use the returned `id` with delete_subscription to remove one. Encrypted bearer tokens are never returned (only `has_bearer_token`).", "inputSchema": { "description": "No parameters — scoped to the authenticated user via the Bearer token.", "properties": {}, "type": "object" }, "name": "firmaradar_list_my_subscriptions", "outputSchema": { "$defs": { "SubscriptionRecord": { "properties": { "aggregation_mode": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Aggregation Mode" }, "aggregation_mode_en": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Aggregation Mode En" }, "aktivert": { "default": false, "title": "Aktivert", "type": "boolean" }, "created_at": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Created At" }, "events": { "items": { "type": "string" }, "title": "Events", "type": "array" }, "fylke_filter": { "items": { "type": "string" }, "title": "Fylke Filter", "type": "array" }, "has_bearer_token": { "default": false, "title": "Has Bearer Token", "type": "boolean" }, "id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Id" }, "kommune_filter": { "items": { "type": "string" }, "title": "Kommune Filter", "type": "array" }, "landsdel_filter": { "items": { "type": "string" }, "title": "Landsdel Filter", "type": "array" }, "min_ansatte": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Min Ansatte" }, "min_omsetning_nok": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Min Omsetning Nok" }, "nace_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Nace Code" }, "updated_at": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Updated At" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Url" } }, "title": "SubscriptionRecord", "type": "object" } }, "properties": { "count": { "title": "Count", "type": "integer" }, "items": { "items": { "$ref": "#/$defs/SubscriptionRecord" }, "title": "Items", "type": "array" } }, "required": [ "items", "count" ], "type": "object" } }, { "description": "Search and browse the Norwegian NACE industry-code catalogue. Use this to resolve the exact code before calling subscribe_nace (industry monitoring) or list_companies_in_nace. Free-text search with `q` ('restaurant', 'programvare'), drill the hierarchy with `parent` (omit for the top-level sections A–U), or convert an EU NACE Rev. 2 code to the Norwegian 5-digit sub-codes with `eu`. Each hit includes the Norwegian and (when available) English label plus company counts. Backed by the official catalogue (SSB/BRREG), refreshed daily.", "inputSchema": { "properties": { "eu": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "An EU NACE Rev. 2 code (e.g. '47.11', '62.01') — returns the Norwegian 5-digit sub-codes the register actually uses. Use this when you have an EU/international code and need the Norwegian equivalent before subscribing or listing companies.", "title": "Eu" }, "limit": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" }, "parent": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Return the direct children of this code to drill down the hierarchy: a section letter ('G'), a 2-digit group ('47'), a 3-digit ('47.1') or 4-digit ('47.11') code. Omit to list the top-level sections (A–U).", "title": "Parent" }, "q": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Free-text search on the Norwegian industry label (e.g. 'restaurant', 'programvare', 'bygg'). Returns the best-matching NACE codes ranked by relevance.", "title": "Q" } }, "type": "object" }, "name": "firmaradar_list_nace_codes", "outputSchema": { "$defs": { "NaceCodeHit": { "properties": { "code": { "description": "Norwegian NACE code, e.g. '47.110' or section letter 'G'.", "title": "Code", "type": "string" }, "code_short": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "4-digit BRREG-format variant of the code (e.g. '47.11').", "title": "Code Short" }, "company_count": { "default": 0, "description": "Active companies with this code (legacy alias for company_count_active).", "title": "Company Count", "type": "integer" }, "company_count_active": { "default": 0, "title": "Company Count Active", "type": "integer" }, "company_count_total": { "default": 0, "title": "Company Count Total", "type": "integer" }, "has_children": { "default": false, "description": "True if the code can be drilled into with `parent`=this code.", "title": "Has Children", "type": "boolean" }, "label_en": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "English industry label (from SSB Klass), when available.", "title": "Label En" }, "label_no": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Norwegian industry label.", "title": "Label No" }, "level": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "Hierarchy level: 1=section, 2=group, 3, 4, 5=most specific.", "title": "Level" }, "parent_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Parent Code" } }, "required": [ "code" ], "title": "NaceCodeHit", "type": "object" } }, "properties": { "count": { "title": "Count", "type": "integer" }, "items": { "items": { "$ref": "#/$defs/NaceCodeHit" }, "title": "Items", "type": "array" } }, "required": [ "items", "count" ], "type": "object" } }, { "description": "Search BRREG kunngjøringer across all Norwegian companies — filter by type (konkurs, fusjon, ...), date range, NACE-code, or location. Use for trend analysis ('all konkurser in restaurant sector last quarter') or radar-style monitoring.", "inputSchema": { "properties": { "cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Cursor" }, "from_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO date — inclusive lower bound.", "title": "From Date" }, "fylke": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Norwegian fylkenummer — EXACTLY 2 digits, zero-padded (e.g. '03' = Oslo). NAMES not accepted.", "title": "Fylke" }, "kommune": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Norwegian kommunenummer — EXACTLY 4 digits, zero-padded (e.g. '0301' = Oslo). NAMES not accepted.", "title": "Kommune" }, "limit": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" }, "nace": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "NACE code or prefix. Norwegian BRREG uses 5-digit SN2007 codes internally (e.g. '56.110'). Any prefix works (2-5 digits). If a 4-digit code yields no results, append '0' for the 5-digit form.", "title": "Nace" }, "q": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Free-text on company name.", "title": "Q" }, "to_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO date — inclusive upper bound.", "title": "To Date" }, "type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Kunngjøring (announcement) type/category. Values are Norwegian: konkurs (bankruptcy), fusjon (merger), fisjon (demerger), eierbytte (change of ownership), ...", "title": "Type" } }, "type": "object" }, "name": "firmaradar_search_announcements", "outputSchema": { "$defs": { "AnnouncementHit": { "properties": { "category": { "title": "Category", "type": "string" }, "dato": { "title": "Dato", "type": "string" }, "hendelse_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Hendelse Type" }, "kunngjoring_type": { "title": "Kunngjoring Type", "type": "string" }, "navn": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Navn" }, "orgnr": { "title": "Orgnr", "type": "string" }, "payload_summary": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Payload Summary" } }, "required": [ "orgnr", "dato", "kunngjoring_type", "category" ], "title": "AnnouncementHit", "type": "object" } }, "properties": { "filter": { "additionalProperties": true, "title": "Filter", "type": "object" }, "items": { "items": { "$ref": "#/$defs/AnnouncementHit" }, "title": "Items", "type": "array" }, "next_cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Next Cursor" }, "total_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Total Count" } }, "required": [ "filter", "items" ], "type": "object" } }, { "description": "Search Norwegian companies with filters (name, NACE, location, status, employees, revenue range, founding date). Returns paginated list of candidate orgnr to investigate further. Use when you have a description and need to find matching companies; use `get_company` once you have a specific orgnr. Revenue filtering excludes companies with no reported NOK revenue figure — see `min_omsetning_nok`. Backed by the official Norwegian company register (BRREG). Each hit includes a canonical Firmaradar `url` and the fields that matched the requested filters.", "inputSchema": { "properties": { "cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Opaque pagination cursor from previous call.", "title": "Cursor" }, "fylke": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Norwegian fylkenummer — EXACTLY 2 digits, zero-padded. Examples: '03' = Oslo, '11' = Rogaland, '15' = Møre og Romsdal. Fylke-NAMES are NOT accepted — translate first.", "title": "Fylke" }, "kommune": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Norwegian kommunenummer — EXACTLY 4 digits, zero-padded. Examples: '0301' = Oslo, '4601' = Bergen, '5001' = Trondheim, '1103' = Stavanger. Kommune-NAMES are NOT accepted — translate the name to kommunenummer first.", "title": "Kommune" }, "limit": { "default": 25, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer" }, "max_ansatte": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "title": "Max Ansatte" }, "max_omsetning_nok": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Maximum annual revenue (driftsinntekter) in NOK — same source and same exclusion rule as min_omsetning_nok.", "title": "Max Omsetning Nok" }, "min_ansatte": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "title": "Min Ansatte" }, "min_omsetning_nok": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Minimum annual revenue (driftsinntekter) in NOK, from the company's own accounts (not consolidated/group figures), latest year with a reported figure. NOTE: companies with no reported revenue are EXCLUDED from the results when this filter is set, as are accounts reported in a foreign currency. Must be combined with at least one of q/nace/kommune.", "title": "Min Omsetning Nok" }, "nace": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "NACE code or prefix. Norwegian BRREG uses 5-digit SN2007 codes internally (e.g. '56.110' for restaurants, '47.111' for grocery stores). Any prefix works: '47' matches all retail (2-digit), '47.1' matches food/beverage retail (3-digit), '47.11' matches grocery stores (4-digit), '47.111' is the most specific (5-digit). If a 4-digit code yields no results, try appending '0' for the 5-digit form (e.g. '56.110' instead of '56.10').", "title": "Nace" }, "q": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Free-text search across company names.", "title": "Q" }, "status": { "anyOf": [ { "enum": [ "aktiv", "konkurs", "under_avvikling", "avregistrert" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "Filter on company status.", "title": "Status" }, "stiftet_etter": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO 8601 date — only companies founded on/after.", "title": "Stiftet Etter" }, "stiftet_for": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "ISO 8601 date — only companies founded on/before.", "title": "Stiftet For" } }, "type": "object" }, "name": "firmaradar_search_companies", "outputSchema": { "$defs": { "CompanyHit": { "properties": { "antall_ansatte": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Antall Ansatte" }, "kommune": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Kommune" }, "naeringskode": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Naeringskode" }, "navn": { "title": "Navn", "type": "string" }, "organisasjonsform": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Organisasjonsform" }, "orgnr": { "title": "Orgnr", "type": "string" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "stiftelsesdato": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stiftelsesdato" } }, "required": [ "orgnr", "navn" ], "title": "CompanyHit", "type": "object" } }, "properties": { "items": { "items": { "$ref": "#/$defs/CompanyHit" }, "title": "Items", "type": "array" }, "next_cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Next Cursor" }, "omsetning_filter_note": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Set only when a revenue range was requested: explains that companies without a reported NOK revenue figure were excluded, so an empty result may mean missing accounts rather than no matching companies.", "title": "Omsetning Filter Note" }, "total_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Total Count" } }, "required": [ "items" ], "type": "object" } }, { "description": "Search for Norwegian persons in the shareholder/role-holder dataset by name. PII-sensitive — requires the search_full_enabled tier. Returns separate shareholder and role-holder hit lists with stable IDs that can be passed to `get_person_companies` and `get_person_roles`.", "inputSchema": { "properties": { "birth_year": { "anyOf": [ { "maximum": 2100, "minimum": 1900, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Filter on birth year (helps disambiguate common names).", "title": "Birth Year" }, "kommune_hint": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Optional kommune name to help disambiguate matches.", "title": "Kommune Hint" }, "limit": { "default": 30, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer" }, "q": { "description": "Name to search (min 2 characters).", "minLength": 2, "title": "Q", "type": "string" } }, "required": [ "q" ], "type": "object" }, "name": "firmaradar_search_persons", "outputSchema": { "$defs": { "RolePersonHit": { "properties": { "active_company_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Active Company Count" }, "birth_year": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Birth Year" }, "company_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Company Count" }, "name": { "title": "Name", "type": "string" }, "role_person_id": { "description": "Stable key — pass to `get_person_roles`.", "title": "Role Person Id", "type": "string" } }, "required": [ "role_person_id", "name" ], "title": "RolePersonHit", "type": "object" }, "ShareholderHit": { "properties": { "birth_year": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Birth Year" }, "country_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Country Code" }, "owner_name": { "title": "Owner Name", "type": "string" }, "owner_person_key": { "description": "Stable key — pass to `get_person_companies`.", "title": "Owner Person Key", "type": "string" }, "poststed": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Poststed" }, "shareholding_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Shareholding Count" } }, "required": [ "owner_person_key", "owner_name" ], "title": "ShareholderHit", "type": "object" } }, "properties": { "query": { "title": "Query", "type": "string" }, "role_persons": { "items": { "$ref": "#/$defs/RolePersonHit" }, "title": "Role Persons", "type": "array" }, "role_persons_count": { "title": "Role Persons Count", "type": "integer" }, "shareholders": { "items": { "$ref": "#/$defs/ShareholderHit" }, "title": "Shareholders", "type": "array" }, "shareholders_count": { "title": "Shareholders Count", "type": "integer" } }, "required": [ "query", "shareholders", "shareholders_count", "role_persons", "role_persons_count" ], "type": "object" } }, { "description": "Start generating an AML risk report ASYNCHRONOUSLY for a Norwegian company. Returns immediately with a report_id and status 'pending' — the report is built in the background. Poll `get_aml_report` with the report_id until status is 'done' (then read score/level/factors) or 'failed'. Use this instead of `get_aml_score` for large/complex ownership structures that may otherwise time out, or to start many screenings in parallel. Generates an auditable report stored for 60 months per Hvitvaskingsloven §35.", "inputSchema": { "properties": { "orgnr": { "description": "9-digit norwegian organization number.", "title": "Orgnr", "type": "string" }, "purpose": { "default": "kyc_onboarding", "description": "Purpose of the screening — recorded for audit trail.", "enum": [ "kyc_onboarding", "kyc_review", "risk_monitoring", "manual" ], "title": "Purpose", "type": "string" } }, "required": [ "orgnr" ], "type": "object" }, "name": "firmaradar_start_aml_report", "outputSchema": { "properties": { "orgnr": { "title": "Orgnr", "type": "string" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "report_id": { "description": "Job/report id — poll with `get_aml_report` until status is 'done' or 'failed'.", "title": "Report Id", "type": "string" }, "status": { "description": "One of: pending, running, done, failed (starts at 'pending').", "title": "Status", "type": "string" } }, "required": [ "report_id", "orgnr", "status" ], "type": "object" } }, { "description": "Subscribe to industry (NACE) monitoring: when any Norwegian company in the chosen industry triggers a monitored event (new announcement, status change such as bankruptcy/dissolution, or ownership update), Firmaradar delivers a webhook to your URL. Use list_nace_codes first to resolve the exact code. A subscription on a parent code matches all child codes. Restrict `events` (e.g. ['status_changed']) and use geographic/size filters to cut volume in large industries, or pick a digest `aggregation_mode`. One subscription per user and NACE code; a retry with the same callback replaces nonsecret settings and returns its ID; omitted secrets are retained, and an explicit empty value clears them. Another callback returns HTTP 409. Use PATCH for partial updates or DELETE before registering another flow. Requires a user whose plan has Firmaovervakning enabled. Call only when the user has asked to set up industry monitoring.", "inputSchema": { "properties": { "aggregation_mode": { "default": "real_time", "description": "Delivery cadence. 'real_time' (default) posts each event immediately. 'hourly_digest' / 'daily_digest' batch events to reduce noise in high-volume industries.", "enum": [ "real_time", "hourly_digest", "daily_digest" ], "title": "Aggregation Mode", "type": "string" }, "aktivert": { "default": true, "description": "Whether the subscription is active immediately (default true).", "title": "Aktivert", "type": "boolean" }, "bearer_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Optional bearer token Firmaradar sends as `Authorization: Bearer <token>` when calling your webhook URL, so your endpoint can authenticate the delivery. Stored encrypted.", "title": "Bearer Token" }, "events": { "description": "Which event types to deliver. Omit for all of them. Restrict to e.g. ['status_changed'] to receive only bankruptcy/dissolution signals and cut volume dramatically in large industries.", "items": { "enum": [ "created", "updated", "deleted", "status_changed" ], "type": "string" }, "title": "Events", "type": "array" }, "fylke_filter": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Optional geographic filter: only companies in these fylker (county numbers).", "title": "Fylke Filter" }, "kommune_filter": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Optional geographic filter: only companies in these kommuner (4-digit kommunenummer).", "title": "Kommune Filter" }, "landsdel_filter": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Optional geographic filter: only companies in these landsdeler.", "title": "Landsdel Filter" }, "min_ansatte": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Optional size filter: only companies with at least this many employees.", "title": "Min Ansatte" }, "min_omsetning_nok": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Optional size filter: only companies with at least this much revenue (NOK).", "title": "Min Omsetning Nok" }, "nace_code": { "description": "The NACE code to monitor. Accepts a section letter ('G'), a group ('47'), or a more specific code ('47.110'). Resolve the exact code first with list_nace_codes if unsure. A subscription on a parent code also matches events in all child codes.", "title": "Nace Code", "type": "string" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "HTTPS webhook URL that receives a POST for each matched event. Omit only if you intend to add it later via the portal.", "title": "Url" } }, "required": [ "nace_code" ], "type": "object" }, "name": "firmaradar_subscribe_nace", "outputSchema": { "properties": { "aggregation_mode": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Aggregation Mode" }, "aggregation_mode_en": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Aggregation Mode En" }, "aktivert": { "default": false, "title": "Aktivert", "type": "boolean" }, "created_at": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Created At" }, "events": { "items": { "type": "string" }, "title": "Events", "type": "array" }, "id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "ID of the created subscription.", "title": "Id" }, "nace_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Nace Code" }, "raw": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Raw" }, "updated_at": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Updated At" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Url" } }, "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:44fdd417513e5d524a6348346ff36afed1ccac01d43581f1a2dfb4b0c55df7ff | sha256sum