Vi bruker informasjonskapsler til autentisering og — med ditt samtykke — til analyse. Les mer.
Mål: under 5 minutter fra signup til svar i agenten.
Logg inn med Google eller e-post. Dev-tier aktiveres automatisk — 1 000 MCP-kall/mnd og tilgang til alle åpne datakilder. Ingen betalingskort.
Gå til /dashboard → API-nøkler. Gi nøkkelen et navn (f.eks. «claude-desktop-laptop») og kopier den. Nøkler kan roteres og revokeres når som helst.
Lim inn én av kode-snippene under. KETL eksponerer verktøy via Streamable HTTP — én MCP-server per connector på data.ketl.no/mcp/<connector>.
Spør agenten: «Søk opp Equinor i Brreg og sjekk mot EU-sanksjonslisten». Du får svar + kilde-referanser + audit-event i /dashboard.
Samme endepunkt, samme audit-logg — velg klient etter workflowen din.
Lim inn i ~/Library/Application Support/Claude/claude_desktop_config.json (macOS). Start Claude på nytt. KETL-verktøyene dukker opp i tool-panel.
{
"mcpServers": {
"ketl-brreg": {
"url": "https://data.ketl.no/mcp/brreg",
"transport": "streamable-http",
"headers": {
"Authorization": "Bearer ketl_live_••••"
}
}
}
}Cursor støtter MCP via ~/.cursor/mcp.json (Settings → MCP). Samme Streamable HTTP-oppsett virker i Cline og Windsurf.
{
"mcp.servers": {
"ketl-brreg": {
"type": "streamable-http",
"url": "https://data.ketl.no/mcp/brreg",
"headers": {
"Authorization": "Bearer ketl_live_••••"
}
}
}
}For egen agent eller backend-bruk. Anthropic’s offisielle @modelcontextprotocol/sdk kobler direkte til KETL via Streamable HTTP — samme verktøy som Claude Desktop. Du kan også bruke fetch mot REST-endepunktene (se /mcp).
// npm install @modelcontextprotocol/sdk
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("https://data.ketl.no/mcp/brreg"),
{
requestInit: {
headers: { Authorization: `Bearer ${process.env.KETL_API_KEY}` },
},
},
);
const ketl = new Client({ name: "min-agent", version: "1.0.0" });
await ketl.connect(transport);
// Robust wrapper med retry på 429 og distinkte feilkoder
async function callKetl(name: string, args: Record<string, unknown>) {
try {
return await ketl.callTool({ name, arguments: args });
} catch (err) {
const status = (err as { status?: number; code?: number }).status
?? (err as { code?: number }).code;
if (status === 401) throw new Error("Ugyldig eller utløpt API-nøkkel — roter via /dashboard");
if (status === 403) throw new Error("Verktøyet krever høyere tier — sjekk /pricing");
if (status === 404) throw new Error(`Ukjent verktøy: ${name}`);
if (status === 429) {
// Rate-limit: vent og prøv på nytt (én gang). Ved 2× 429 → bubble opp.
await new Promise((r) => setTimeout(r, 2_000));
return ketl.callTool({ name, arguments: args });
}
if (status && status >= 500) throw new Error(`KETL upstream nede (${status}) — prøv igjen senere`);
throw err;
}
}
// Søk i Enhetsregisteret + sanksjonssjekk
const result = await callKetl("brreg_search", { query: "Equinor", type: "entity" });
const risk = await callKetl("sanctions_check", {
orgnr: "923609016",
lists: ["EU", "OFAC", "UK", "UN"],
});
console.log(result, risk);Foretrekker du REST og curl? Eksempel med eksplisitt statuskode-håndtering (4xx/5xx/429):
# Søk i Enhetsregisteret — med curl --fail-with-body for å fange 4xx/5xx
curl --fail-with-body --silent --show-error \
--max-time 30 \
-H "Authorization: Bearer $KETL_API_KEY" \
-H "Accept: application/json" \
"https://data.ketl.no/api/connectors/brreg/search?navn=Equinor" \
| jq '.'
# Statuskode-håndtering i shell-skript
status=$(curl -o /tmp/body -w "%{http_code}" -s \
-H "Authorization: Bearer $KETL_API_KEY" \
"https://data.ketl.no/api/connectors/brreg/search?navn=Equinor")
case "$status" in
200) jq '.' /tmp/body ;;
401) echo "Ugyldig API-nøkkel — roter via /dashboard" >&2; exit 1 ;;
429) echo "Rate limit — vent 60 sek og prøv igjen" >&2; exit 2 ;;
5*) echo "KETL upstream nede ($status) — prøv igjen senere" >&2; exit 3 ;;
*) echo "Uventet feil ($status):" >&2; cat /tmp/body >&2; exit 4 ;;
esacStatuskoder du vil møte:
401 ugyldig/utløpt API-nøkkel — roter via/dashboard403 verktøyet krever høyere tier — se/pricing404 ukjent verktøy eller objekt429 rate-limit nådd — vent og prøv igjen (header Retry-After respekteres)5xx upstream nede — implementer retry med eksponentiell backoffDirekteintegrasjon med Claude Desktop, Cursor og Cline. Ingen egen proxy-server, ingen OAuth-dans.
421+ verktøy eksponert — Brreg, SSB, Kartverket, Sokkel, Norges Bank og resten av norsk offentlig data.
Hvert MCP-kall logges med kilde, tidsstempel og response-hash. Eksport som signert JSON for revisor.
OpenAPI + MCP-manifest på data.ketl.no/.well-known/mcp.json. Semver på verktøy-responser.
MCP og REST gir tilgang til 162 kilder; under ligger fem strukturelle moats som dekker det startup-en ellers måtte bygge selv. Hver moat har et eget startup-use-case med kode- og arkitektur-vinkel — agent-state, webhooks, EU AI Act- audit-format, SOC2-bevisgrunn, og norsk eiendoms-stack.
Living business record
Per-tenant stateful kontekst, vektor-db-init, snapshot- diff, GDPR art. 20-eksport og SOC2 CC6.5-deprovisioning — som agent-state by default, ikke som du må bygge.
Event-driven review engine
Webhook-multiplikator: Cloud Scheduler, dedup på event- IDs, retry-policy med backoff og signature-verifisering — multi-tenant routing uten å designe egen pipeline.
Explainability by design
EU AI Act-klar fra dag én — kilde, regel, konfidens og modellversjon i hver `Explanation`-pakke. Slipp å designe eget audit-felt-format for kundenes compliance-team.
Audit trail by default
SOC2/ISO 27001/GDPR-bevisgrunn med tamper-evident hash- kjede ferdig fra dag én. Eksport pr. kunde uten å bygge eget audit-store eller revisor-eksport-format.
Kartverket-kobling
Norsk eiendoms-stack uten egen Matrikkel-/Grunnbok- integrasjon. Proptech og insurtech får tomt, bygning, tinglyste rettigheter og eiendoms-events via ett API.
Mount alle moats som MCP-verktøy
Claude Desktop, Cursor, Cline og Windsurf får tilgang til samme audit- og webhook-stack via Streamable HTTP. Ett kontaktpunkt for både agent-state og produksjons-API.