mcp-skatteetaten
Enables AI assistants to query Norwegian tax data, submit reports, look up population register information, and validate VAT returns through Skatteetaten APIs using Maskinporten authentication.
README
mcp-skatteetaten
A comprehensive Model Context Protocol (MCP) server for Skatteetaten — the Norwegian Tax Administration.
Exposes 35+ tools covering all major Skatteetaten APIs so that LLM agents and AI assistants can query tax data, submit reports, look up population register information, validate VAT returns, and more — all authenticated via Maskinporten.
Covered APIs
| API | Description |
|---|---|
| Inntekt | Employer-reported income (monthly/yearly) |
| Beregnet Skatt | Calculated tax: trinnskatt, trygdeavgift, fellesskatt |
| Summert Skattegrunnlag | Aggregated tax basis (income, assets, deductions) |
| Skattemelding | Tax return retrieval and validation |
| Restanse | Outstanding tax debts and arrears |
| Formuesobjekt Fast Eiendom | Property ownership and classification |
| Formuesgrunnlag Eiendomsskatt | Property value basis for property tax |
| Folkeregisteret | Population register: lookup, search, event feed |
| A-Melding | Wage/personnel reporting (replaces Altinn A02) |
| A-Melding Tilbakemelding | Feedback for submitted A-meldinger |
| MVA-Melding | VAT return validation |
| Skattekorttilarbeidsgiver | Tax deduction cards for employers |
| Krav og Betalinger | Claims and payment history (Fremtidens innkreving) |
| Tredjepartsopplysninger | Third-party data reporting (banks, brokers, etc.) |
Prerequisites
- A Norwegian organisation with an organisation number
- Access to Maskinporten with a registered client and private key
- Rights packages (rettighetspakker) granted by Skatteetaten for the APIs you need
- Node.js 20+
Getting Access
- Register your Maskinporten client at Samarbeidsportalen
- Request the relevant scopes from Skatteetaten at skatteetaten.no/deling
- For test environments, use Tenor test data to get synthetic identifiers
Installation
npm install
npm run build
Configuration
Copy .env.example to .env and fill in your credentials:
cp .env.example .env
| Variable | Required | Description |
|---|---|---|
MASKINPORTEN_CLIENT_ID |
Yes | Your Maskinporten client ID |
MASKINPORTEN_PRIVATE_KEY_PATH |
Yes* | Path to your RSA private key PEM file |
MASKINPORTEN_PRIVATE_KEY_JWK |
Yes* | Or provide the JWK as a JSON string |
SKATTEETATEN_ENV |
No | test (default) or production |
MASKINPORTEN_ISSUER |
No | Override Maskinporten issuer URL |
MASKINPORTEN_TOKEN_ENDPOINT |
No | Override token endpoint URL |
FOLKEREGISTERET_AUTH_PACKAGE |
No | offentlig-med-hjemmel (default), offentlig-uten-hjemmel, or privat |
*Either MASKINPORTEN_PRIVATE_KEY_PATH or MASKINPORTEN_PRIVATE_KEY_JWK is required.
Usage
With Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"skatteetaten": {
"command": "node",
"args": ["/path/to/mcp-skatteetaten/dist/index.js"],
"env": {
"MASKINPORTEN_CLIENT_ID": "your-client-id",
"MASKINPORTEN_PRIVATE_KEY_PATH": "/path/to/private-key.pem",
"SKATTEETATEN_ENV": "test"
}
}
}
}
With Claude Code
claude mcp add skatteetaten -- node /path/to/mcp-skatteetaten/dist/index.js
Or run directly:
MASKINPORTEN_CLIENT_ID=... MASKINPORTEN_PRIVATE_KEY_PATH=... npm start
Available Tools
Income (inntekt)
| Tool | Description |
|---|---|
get_inntekt |
Income for a person in a specific month |
get_inntekt_for_year |
All income across 12 months for a year |
Tax (skatt)
| Tool | Description |
|---|---|
get_beregnet_skatt |
Calculated tax breakdown |
get_summert_skattegrunnlag |
Aggregated tax basis |
get_skattemelding |
Retrieve tax return document |
validate_skattemelding |
Validate a tax return XML |
get_restanse |
Outstanding tax debts |
Property (eiendom)
| Tool | Description |
|---|---|
get_formuesobjekt_fast_eiendom |
Property assets for a person |
get_formuesgrunnlag_eiendomsskatt |
Property value for tax purposes |
Population Register (folkeregisteret)
| Tool | Description |
|---|---|
get_person_folkeregisteret |
Full person record lookup |
search_personer_folkeregisteret |
Search by criteria |
get_folkeregisteret_hendelser |
Change event feed |
get_folkeregisteret_current_sekvens |
Current event feed position |
Wage Reporting (amelding)
| Tool | Description |
|---|---|
submit_amelding |
Submit monthly A-melding |
get_amelding_status |
Check submission status |
get_amelding_tilbakemelding |
Get feedback on submitted report |
list_amelding_for_maaned |
List submissions for a month |
VAT (mva)
| Tool | Description |
|---|---|
validate_mva_melding_xml |
Validate VAT return XML |
validate_mva_melding_json |
Validate VAT return JSON |
get_mva_koder |
List valid VAT codes |
Tax Deduction Cards (skattekort)
| Tool | Description |
|---|---|
get_skattekort |
Get deduction card for an employee |
order_skattekort |
Bulk order deduction cards |
get_skattekort_ordre_status |
Check order status |
get_skattekort_resultat |
Retrieve completed order results |
Claims & Payments (krav-og-betalinger)
| Tool | Description |
|---|---|
get_krav |
Outstanding claims |
get_betalinger |
Payment history |
Third-Party Reporting (tredjepartsopplysninger)
| Tool | Description |
|---|---|
submit_tredjepartsopplysninger |
Submit third-party data |
get_tredjepartsopplysninger_status |
Check submission status |
get_tredjepartsopplysninger_oppgavetyper |
List valid report types |
Authentication
All APIs use Maskinporten for server-to-server OAuth2 authentication with enterprise certificates.
The client automatically:
- Creates signed JWT grants using your RSA private key
- Exchanges them for Maskinporten access tokens
- Caches tokens until 30 seconds before expiry
- Fetches per-scope tokens (different scopes for different APIs)
Test environment: https://test.maskinporten.no/
Production: https://maskinporten.no/
API Documentation
- Skatteetaten API Documentation
- Folkeregisteret API
- MVA-Meldingen
- Skattemeldingen
- Maskinporten Guide
- SwaggerHub — Skatteetaten
Development
# Run in development mode
npm run dev
# Type check
npm run typecheck
# Build
npm run build
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.