MCP connector to the data
Everything the site shows, you can query yourself. An MCP server (Model Context Protocol) gives Claude, Codex, Kimi, GLM and your own scripts the same numbers as tools: the time series behind the index, every occupation with its tasks and Claude use, and every field of study. All of it is aggregate data that is already public. No login.
Connect
The endpoint is https://kiindeksen-mcp.fly.dev/mcp
(Streamable HTTP, JSON-RPC 2.0).
Claude Code. One command:
claude mcp add --transport http kiindeksen https://kiindeksen-mcp.fly.dev/mcp
claude.ai. Settings, Connectors, Add custom connector. Paste the address above. Then ask Claude for, say, "the headline number with uncertainty for those under 31" or "compare occupations 4110 and 3312".
Your own script. client_example.py shows the whole exchange with the server and needs only Python, no packages:
python3 client_example.py
Other clients and models
The connector is open MCP over HTTP and is not tied to Claude. Any
client that takes a URL can use it, and the URL is the same
everywhere: https://kiindeksen-mcp.fly.dev/mcp.
| Client | How to add it |
|---|---|
| Codex CLI (OpenAI) | codex mcp add kiindeksen --url https://kiindeksen-mcp.fly.dev/mcp, or in ~/.codex/config.toml: [mcp_servers.kiindeksen] with url = "https://kiindeksen-mcp.fly.dev/mcp" |
| Kimi Code CLI (Moonshot) | kimi mcp add --transport http kiindeksen https://kiindeksen-mcp.fly.dev/mcp |
| GLM from Z.ai | The models are used through Claude Code, OpenCode, Cline or Kilo Code. Add the connector in the client you use; the Claude Code command is above. |
| OpenCode | In opencode.json: "mcp": {"kiindeksen": {"type": "remote", "url": "https://kiindeksen-mcp.fly.dev/mcp", "enabled": true}} |
| Gemini CLI | In ~/.gemini/settings.json: "mcpServers": {"kiindeksen": {"httpUrl": "https://kiindeksen-mcp.fly.dev/mcp"}} |
| Cursor, VS Code, Cline and others | Add a server of type HTTP (Streamable HTTP) with the URL above. Clients that only know the older SSE transport use https://kiindeksen-mcp.fly.dev/sse. |
| Clients that only launch local servers | Download server.py and register the command python3 server.py --stdio. It fetches the data from the site and needs no packages. |
From code, with any provider
The OpenAI and Anthropic model APIs call the server directly, without
an MCP client of your own. With OpenAI (Responses API) the tool is
{"type": "mcp", "server_label": "kiindeksen", "server_url": "https://kiindeksen-mcp.fly.dev/mcp", "require_approval": "never"}.
With Anthropic (Messages API, beta header mcp-client-2025-11-20)
the server is {"type": "url", "url": "https://kiindeksen-mcp.fly.dev/mcp", "name": "kiindeksen"}
in mcp_servers, and the tool is
{"type": "mcp_toolset", "mcp_server_name": "kiindeksen"}.
Any other model with function calling, such as Kimi, GLM, Gemini or
Mistral, can use the same tools as plain HTTP calls. Every tool exists
as GET /tools/<name> with the arguments in the query
string (lists comma-separated) or as POST with a JSON
body. openapi.json describes them, so
GPTs, Dify, Coze and similar platforms can import them. Try:
curl "https://kiindeksen-mcp.fly.dev/tools/get_headline?young=true&reference=claudecode"
curl "https://kiindeksen-mcp.fly.dev/tools/compare_occupations?codes=4110,3312&index_base=2025-02"
The tools
| Tool | What it returns |
|---|---|
get_release | Release, period, normalisation month, number of occupations and fields of study, the headline number with uncertainty |
list_packages | Every time-series package: employment, new hires, pay, private and public sector, Eloundou and Mouchel quintiles, occupation cases, usage patterns |
get_series | Series from a package, with a choice of specification (raw, sa, percap, percap_sa), facet, series, period, base month and smoothing |
get_growth | Growth from a reference month to the last month for every series in a package, plus the gap quintile 5 minus quintile 1 |
get_headline | The site's headline number: the index with bootstrap standard error and 95 % interval, per measure, reference and age group |
get_composition | Share of employees per age group and quintile |
search_occupations | Search STYRK-08 occupations, Norwegian or English |
get_occupation | One occupation: exposure, quintiles, Claude use per release, closest occupations, tasks with use and automation |
get_occupation_series | Employment or pay for one occupation, monthly from 2021 |
compare_occupations | Several occupations side by side on a common base |
list_education_levels, search_education, get_education_group | Education: fields of study, the tasks in the jobs, the most common jobs |
list_downloads, get_data_dictionary | The release's CSV files and their documentation |
get_studio_papers | The Studio reading list |
Two resources (kiindeksen://om,
kiindeksen://konvensjoner) and two prompts
(analyser_yrkespar, maanedsrapport) come
with it.
Conventions
- The series are indices with 100 in November 2022, the month
ChatGPT arrived. Use
index_baseto move the base, for example2025-02for Claude Code. sais seasonally adjusted,percapis per resident in the age group.- The index is growth in the most exposed fifth against growth in
the least exposed, in percentage points.
get_headlinegives the site's number with uncertainty.get_growthlets you compute your own references and smoothing. - Occupations are four-digit STYRK-08. Only occupations with at least 30 employees every month have a series. Automation is Anthropic's rule: directive plus feedback loop.
- Fields of study are three-digit NUS groups, level plus field.
- State the release, specification and base month when you report numbers.
Example: same exposure, different automation
The question: two occupations have almost the same AI exposure. Is
AI used the same way in them, and does employment move the same
way? This is what client_example.py does, and what
Claude does if you ask for the prompt analyser_yrkespar
with codes 4110 and 3312.
get_releaseandget_headline. Release 2026-10 covers January 2021 to July 2026. The index for ages 21–60 with ChatGPT as reference is +1.5 percentage points, standard error 2.7. For ages 21–30 since Claude Code it is −2.9, standard error 2.0.get_growthonby_exposurewith reference 2025-01 and three-month smoothing. From January 2025 to July 2026, seasonally adjusted: least exposed fifth −0.3 percent, most exposed −0.3 percent. The gap is −0.1 percentage points. The same call onage_by_exposurefor ages 21–30: −1.8 in the least exposed, −4.6 in the most exposed.compare_occupationswith codes 4110 and 3312, employment, seasonally adjusted, base month 2025-02:Occupation Eloundou Mouchel Automation (Feb 2026) Employment July 2026 4110 General office clerks 0.59 (Q5) 0.59 (Q5) 67 % 95.7 3312 Credit and loans officers 0.61 (Q5) 0.62 (Q5) 30 % 96.5 get_occupationfor each occupation, platformclaude_ai, gives the tasks. Office clerks: troubleshooting office equipment (1.26 percent of all Claude use, automation 60 percent), forms and expense reports (66 percent) and office machines (51 percent). Credit officers: recommending financial strategy (24 percent), explaining credit assessment and regulation (22 percent) and explaining loan types (27 percent).- The interpretation is yours: the same exposure score, but in one occupation the work is ordered finished, in the other it is discussed. That is what the exposure measure does not see and the usage data shows.
The same exercise for a field of study: search_education
with "økonomi" at bachelor level gives group 641 Business and
administration. It has 101 315 employed, exposure 0.55, half in the
most exposed fifth and automation 43 percent.
get_education_group gives the ten most common tasks in
the jobs and the most common jobs, accountants first.
All numbers above were read from the server on 15 October 2026 with release 2026-10. New releases give new numbers. Run the script again.
Operation and source code
The server fetches the JSON files from kiindeksen.no at start-up
and every six hours, so it follows the monthly release without a
new deployment. It is written in Python's standard library and runs
as its own Fly.io app in Stockholm. The source is in
dashboard/mcp/ in the project repository, and
server.py can be downloaded here. You can
run it locally against downloaded data files with
python3 server.py --data-dir <folder> --port 8765.
