Swedish business intelligence
for humans and agents.
The Norric MCP server exposes Swedish economic intelligence — credit risk, procurement signals, BRF data, and company lifecycle signals — through a single Model Context Protocol endpoint. Built for Claude Code, Cursor, Windsurf, and any MCP-compatible agent runtime.
https://norric-mcp-production.up.railway.app/mcpProtocol: Streamable HTTP (MCP 2026 standard) · FastMCP 3.2.3
Tools: 19 live · 4 in development
Coverage: Sweden · expanding to Denmark + Norway (2027)
NorricResponse envelope with confidence, ttl, suggested_action, and data_freshness_seconds — fields designed for autonomous agent decision loops, not just human dashboards.
Quickstart
1. Add to Claude Code (~/.claude.json)
{
"mcpServers": {
"norric": {
"type": "http",
"url": "https://norric-mcp-production.up.railway.app/mcp",
"headers": {
"X-Norric-Key": "nk_prod_signal_YOUR_KEY_HERE"
}
}
}
}
2. Call your first tool
# Score a Swedish company for payment risk
curl -X POST https://norric-mcp-production.up.railway.app/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-Norric-Key: nk_prod_kreditvakt_YOUR_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "kreditvakt_score_company_v1",
"arguments": {
"org_nr": "556714-7916",
"include_graph": false
}
}
}'
3. Get this week's SIGNAL call list
mcp__norric__signal_weekly_call_list_v1(
vertikal="aldreomsorg",
limit=10
)
Authentication
Norric uses capability-scoped API keys. Each key grants access to specific product verticals. Keys are passed via the X-Norric-Key header or as a Bearer token.
Key format
nk_{environment}_{capabilities}_{random}
# Examples
nk_prod_signal_a7f3k9x2 # SIGNAL tools only, production
nk_prod_kreditvakt_m2p8q1z4 # Kreditvakt tools only, production
nk_prod_all_b5r7n3w9 # All tools, production
nk_sandbox_all_c4t6y8v2 # All tools, sandbox (free tier)
| Scope | Tools included | Pricing track |
|---|---|---|
| signal | signal_weekly_call_list_v1, signal_score_municipality_v1, signal_municipality_briefing_v1, signal_contract_expiry_alerts_v1, signal_sweden_pulse_v1 | SIGNAL plans |
| kreditvakt | kreditvakt_score_company_v1, kreditvakt_batch_score_v1, kreditvakt_debt_signals_v1, kreditvakt_bankruptcy_status_v1 | Kreditvakt plans |
| sigvik | sigvik_brf_lookup_v1, sigvik_brf_score_v1, sigvik_energiklass_v1 | Sigvik plans |
| all | All tools | Enterprise / institutional |
Response format
Every tool returns the universal NorricResponse envelope. This is non-negotiable — no tool deviates from this schema. Agents can rely on it unconditionally.
confidence before acting on a result. If confidence < 0.7, treat the result as advisory only. If warnings is non-empty, inspect before escalating to a human action.
SIGNAL tools
Municipality procurement intelligence. 13 signal sources across 290 Swedish municipalities. Operates at procurement step 1 — intent signals — vs Mercell/Opic which operate at step 4.
# Parameters
vertikal: str # aldreomsorg | skola | it_digital | fastighet | hr | bygg | annat
limit: int # 1–50, default 10
# Returns
entries: [{
rank: int
kommunkod: str # 4-digit Swedish municipality code
municipality_name: str
composite_score: float # 0–100. Malmö 87.8, Stockholm 85.0
urgency: str # hot | warm | quiet
components: list # 7-component score breakdown
}]
Kreditvakt tools
Swedish B2B payment risk engine. Reads Kronofogden enforcement cases, Skatteverket debt trajectory, and Bolagsverket filings. Backtest validated: 6x lift factor, 9-month median warning, 80% bankruptcy coverage.
org_nr: OrgnrStr # Swedish format: XXXXXX-XXXX
include_graph: bool # Include ownership chain (default false)
# Returns
signal: str # GREEN | AMBER | RED
recommendation_sv: str # Plain Swedish action e.g. "Kräv förskottsbetalning"
hard_gate_fired: bool
reason_codes: list[str]
confidence: float
Roadmap tools
Agent patterns
Norric tools are designed for autonomous agent workflows. Here are the four canonical patterns.
Pattern 1: Due diligence agent
# Before onboarding a new B2B customer
result = mcp__norric__kreditvakt_score_company_v1(org_nr="556714-7916")
if result.data["signal"] == "RED":
# Agent flags for human review, does not proceed
escalate(result.data["recommendation_sv"])
elif result.data["signal"] == "AMBER":
# Agent adjusts payment terms automatically
set_payment_terms(days=14, upfront=0.5)
else:
# GREEN — proceed with standard 30-day terms
proceed_standard()
Pattern 2: Procurement monitoring agent
# Runs nightly — Monday generates the week's call list
call_list = mcp__norric__signal_weekly_call_list_v1(
vertikal="aldreomsorg",
limit=10
)
for municipality in call_list.data["entries"]:
if municipality["urgency"] == "hot":
briefing = mcp__norric__signal_municipality_briefing_v1(
kommunkod=municipality["kommunkod"],
vertikal="aldreomsorg"
)
schedule_call(municipality, briefing.data["talking_points"])
Pattern 3: Portfolio monitoring agent (nightly)
# Runs at 02:00 CET — silent unless exception threshold crossed
watchlist = load_customer_org_nrs() # Your customer portfolio
changes = mcp__norric__norric_watchlist_diff( # Q3 2026
org_nr_list=watchlist,
since_timestamp=yesterday_midnight
)
for entity in changes.data["changed"]:
if entity["severity"] == "high":
alert_account_manager(entity) # Only escalates material changes
TTL and caching
Every NorricResponse includes a ttl field in seconds. Agents must respect this. Do not re-call a tool before the TTL expires — data will not have changed and you will waste call quota.
| Tool category | TTL | Reason |
|---|---|---|
| kreditvakt_score_* | 43,200s (12h) | Nightly data refresh from Skatteverket/Bolagsverket |
| signal_weekly_call_list_v1 | 43,200s (12h) | Weekly score — refreshed Monday 06:00 CET |
| signal_municipality_briefing_v1 | 86,400s (24h) | NLP briefing cached per municipality/vertical/day |
| kreditvakt_bankruptcy_status_v1 | 3,600s (1h) | Hard confirmation — checked more frequently |
| norric_watchlist_diff | 0s | Always live — diff from timestamp provided |
Pricing — Human tier
Priced for Swedish SMBs, redovisningskonsulter, and sales teams. Flat monthly subscriptions. No per-call complexity. Works like any SaaS tool.
Pricing — Agent tier
Priced per call, not per seat. Agents don't churn, don't need onboarding, and call at scale. A single agent deployment can call Norric 10,000 times per month — pricing reflects this asymmetry. Agents that work don't get changed.
Agent-specific pricing for watchlist monitoring
| Use case | Tool | Price | Agent value |
|---|---|---|---|
| Due diligence per entity | kreditvakt_score_company_v1 | 2 kr/call (deep) · 0.50 kr (standard) | Agent checks every new customer automatically |
| Portfolio monitoring | norric_watchlist_diff | 10 kr/entity/month | Agent monitors 200 customers for 2,000 kr/mo |
| Procurement scan | signal_weekly_call_list_v1 | Included in SIGNAL plans | Agent generates SDR call list every Monday |
| Market entry brief | norric_sector_brief | 5,000 kr/brief | Agent generates full sector intelligence on demand |
Pricing — Institutional tier
At this tier, Norric is not selling software. It is licensing a proprietary Swedish economic intelligence dataset that accumulates daily and cannot be replicated. Pricing is annual contract, not monthly SaaS.
| Buyer | What they buy | Pricing model | Example contract |
|---|---|---|---|
| Factoring companies (Svea, Resurs, Hoist) | Invoice pre-qualification scores on their portfolio | 0.1% of invoice face value scored · min 50,000 kr/mo | Svea scores 500 MSEK/mo = 500,000 kr/mo |
| Banks (Swedbank, Handelsbanken) | SMB lending early warning signals — portfolio distress monitoring | 200,000–500,000 kr/year per institution | One bank = 300,000 kr ARR |
| Insurance (Atradius, Coface) | Trade credit underwriting data | Per-policy pricing · custom contract | TBD via pilot |
| Private equity | Portfolio company distress monitoring | 5,000 kr/company/month | 40-company portfolio = 200,000 kr/mo |
| Consultancies, investors | Norric intelligence platform access | 50,000–200,000 kr/year | Full platform = top tier |
Pricing roadmap
How Norric's pricing evolves as the AI economy matures. The model shifts from human SaaS → agent-native → data licensing.
Rate limits
Error codes
All errors return a machine-readable error_code alongside a human message. Agents should branch on error_code, not on the message string.
| Code | HTTP | Meaning | Agent action |
|---|---|---|---|
| ORG_NOT_FOUND | 404 | Organisationsnummer not in Bolagsverket | Verify format XXXXXX-XXXX, retry once. If still 404, flag for human review. |
| ORG_NR_FORMAT | 400 | Invalid org_nr format | Strip spaces and dashes, reformat to XXXXXX-XXXX, retry. |
| LOW_CONFIDENCE | 200 | Score returned but data is stale or incomplete | Check data_freshness_secs. If > 86400, treat result as advisory only. |
| CACHE_MISS | 200 | Org_nr not yet in cache — async fetch triggered | Wait 30s and retry. Result will be available after ingestion run. |
| RATE_LIMITED | 429 | Too many requests | Exponential backoff: 1s, 2s, 4s, 8s. |
| SCOPE_DENIED | 403 | API key does not have permission for this tool | Do not retry. Alert human — wrong key scope. |
| INGESTION_ERROR | 200 | Upstream data source temporarily unavailable | Return cached value if available. Set warnings flag. Retry next cycle. |
Changelog
Norric AB · MCP Developer Docs · April 2026 · norric.io · edgar@norric.io