trafikkmeldinger-mcp

trafikkmeldinger-mcp

Enables querying Norwegian traffic messages (roadworks, closures, detours) from Statens vegvesen, filtered by route and time window. Supports both current and future travel times, with tools for route-based and general searches.

Category
访问服务器

README

trafikkmeldinger-mcp

MCP-server for norsk veitrafikk — vegarbeid, stengte veier og omkjøringer fra Statens vegvesen, filtrert på ruta di og når du faktisk kjører. Og hvor mange biler som faktisk kjører der, time for time, så «når bør jeg dra» slutter å være gjetting.

Ingen API-nøkkel. Endepunktet er åpent — klon, bygg, kjør.

Hvorfor ikke bare slå opp på vegvesen.no?

Fordi nettsida og appen svarer på «hva er stengt ». Det er sjelden spørsmålet ditt når du planlegger en tur.

Et konkret eksempel. En kveldstur nordover E6 gjennom Øyer 10. august 2026:

E6 Øyertunnelen i Øyer
  isActiveNow: false          ← klokka er 12, tunnelen er åpen
  stengt 20:00–06:00 mandag–torsdag, 10.–14. august

Kjører du forbi klokka 21, er veien stengt. Men meldingen rapporterer isActiveNow: false midt på dagen, så et filter på «aktiv nå» dropper den — og det er den mest inngripende meldingen på hele turen.

Vegvesenet publiserer heldigvis gjentakelsene som strukturerte data, ikke bare som prosa. Denne serveren tolker dem, slik at du kan spørre om et framtidig tidspunkt.

Tre feller denne serveren lukker

1. Fylkesveier lagres med kategoribokstav. Det alle skriver som «fv. 27» eller bare «27» ligger som F27. Et filter på strengen "27" gir null treff — og null treff ser nøyaktig ut som «ingen vegarbeid på strekningen». Det er den farligste feilen denne serveren kan gjøre, så et bart tall utvides til alle fire veiklassene (E27, R27, F27, K27) framfor å gjette.

2. Kommune ligger ikke der du tror. Feltet location.municipalities er tomt på nesten alle meldinger — 2 av 1 293 målt 10. august 2026. Kommunen står i locationDescriptionDetails. Et geografisk filter bygget på det strukturerte-utseende feltet alene mister nesten alt.

3. De to Vegvesen-API-ene skriver veinummer ulikt. Et tellepunkt oppgir veien sin som RV19, EV6, KV2620. En trafikkmelding skriver R19, E6, K2620. Samme etat, to konvensjoner — og filtrerer du tellepunkter med meldingenes skrivemåte, får du null treff. Serveren oversetter til én skrivemåte i roadOfPoint, slik at resten av koden bare ser den ene.

Alle tre er dekket av tester, så en regresjon gir rødt bygg.

Installasjon

Krever Node 20 eller nyere.

git clone https://github.com/smlhus1/trafikkmeldinger-mcp.git
cd trafikkmeldinger-mcp
npm install
npm run build

Legg den til i Claude Code:

claude mcp add trafikkmeldinger -- node /full/sti/til/trafikkmeldinger-mcp/dist/src/index.js

Eller i .mcp.json:

{
  "mcpServers": {
    "trafikkmeldinger": {
      "command": "node",
      "args": ["/full/sti/til/trafikkmeldinger-mcp/dist/src/index.js"]
    }
  }
}

Verktøy

langs_ruta

Trafikkmeldinger for en konkret biltur. Definer strekningen med fylker eller kommuner, og gjerne når du kjører.

{
  "fylker": ["Akershus", "Innlandet"],
  "vei": ["E6", "fv27"],
  "avreise": "2026-08-10T16:00:00+02:00",
  "ankomst": "2026-08-10T22:00:00+02:00"
}

Bruk fylker når du er usikker. Kommuner er mer presist, men utelater du én, forsvinner meldingene der uten et ord — og fylke kombinert med veinummer treffer nesten like presist. Feil skal helle mot å vise for mye, ikke for lite.

Skriv æ, ø og å. Stedsnavn sammenlignes eksakt (store og små bokstaver spiller ingen rolle, men bokstavene gjør det): Sør-Fron treffer, Sor-Fron gir null treff — og null treff ser nøyaktig ut som en rein vei. Samme gjelder fylker.

Svaret skiller det som treffer deg fra det som bare er registrert på strekningen:

{
  "reisevindu": { "avreise": "...", "ankomst": "..." },
  "antallPaaRuta": 19,
  "antallSomTrefferDeg": 13,
  "antallVist": 3,
  "avkortet": "Viser 3 av 13. Øk «maksAntall» eller snevre inn filteret.",
  "merknad": "19 meldinger er registrert på strekningen; 13 av dem gjelder i reisevinduet ditt.",
  "meldinger": [ /* verst først */ ],
  "ikkeIReisevinduet": [ /* med når de faktisk gjelder */ ]
}

Alle tallene oppgis med vilje. Ser du bare ett av dem, kan du ikke skille «rein vei» fra «feil tidsfilter» fra «lista ble kappet».

Svarformat per melding

{
  "sted": "E6 Strandløkken - Strandlykkja, Stange, Innlandet, retning mot Gardermoen",
  "melding": "Vegarbeid, vegen er stengt. Omkjøring er skiltet.",
  "veier": ["E6"],
  "virkning": "large",          // none | small | large | very_large | unknown
  "vegstatus": "RoadClosed",    // RoadOpen | Regulation | RoadClosed
  "gjelderNaa": false,
  "gjelderPaaReisen": true,     // kun når du har oppgitt et reisevindu
  "naarGjelderDen": "...",      // kun når den IKKE gjelder på reisen din
  "antattSlutt": "2026-08-14T06:00:00+02:00",
  "nesteEndring": "RoadClosed fra 2026-08-10T20:00:00+02:00",
  "omkjoeringSkiltet": true,
  "iTunnel": true,
  "kommuner": ["Stange"]
}

Felter utelates når de ikke bærer informasjon. naarGjelderDen følger for eksempel bare med når meldingen ikke treffer reisen din — da er «når gjelder den da» hele poenget; treffer den deg, sier melding allerede det du trenger.

trafikkmeldinger

Generelt oppslag på vei, kommune, fylke og hvor mye det påvirker trafikken. Veinummer kan skrives slik folk snakker: E6, fv27, riksveg 3, eller bare 27.

Uten tidspunkt får du alt som er registrert, også nattarbeid som ikke er aktivt akkurat nå. Oppgi tidspunkt (ISO) for å se kun det som faktisk gjelder da — gjentakelsesreglene tolkes, så en tunnel stengt 20:00–06:00 dukker opp for kl. 21 og ikke for kl. 12.

naar_bor_jeg_kjore

Typisk trafikkmengde time for time på en gitt ukedag — svarer på når du bør dra, ikke på hva som skjer akkurat nå.

{ "vei": ["E6"], "kommune": ["Moss"], "ukedag": "torsdag", "uker": 4 }

Dataene kommer fra tellepunkter: sløyfer og radar i asfalten som teller hver eneste bil som passerer. Det er en måling, ikke et estimat — men den vet bare noe om selve punktet, ingenting om veien mellom punktene.

{
  "ukedag": "torsdag",
  "antallPunkterFunnet": 1,
  "punkter": [{
    "punkt": "Storebaug",
    "vei": "E6",
    "sted": "Moss, Østfold",
    "typiskPerTime": { "06": 1398, "07": 1947, /* ... */ "15": 4709, /* ... */ "22": 1132 },
    "toppTime": { "time": 15, "biler": 4709 },
    "roligsteDagtid": { "time": 6, "biler": 1398 },
    "ukerBakTallene": 4
  }]
}

Tre valg verdt å vite om:

  • Median, ikke gjennomsnitt. Én stengt vei, én helligdag eller én festival flytter et gjennomsnitt med hundrevis av biler, og da beskriver tallet en uke som aldri skjer.
  • Timer med under 90 % dekning forkastes, ikke skaleres. En halvdød sensor rapporterer omtrent halve trafikken — det ser ut som en stille vei, og det er den farligste løgnen denne serveren kan fortelle.
  • ukerBakTallene står i svaret. En median av to uker er en median av to tall. Det skal du få vite, ikke gjette.

doctor

Kaller begge de ekte endepunktene og rapporterer svartid, antall meldinger, hvor mange som har gjentakelsesregler, og hvor mange tellepunkter som svarer. Bruk den når noe oppfører seg rart.

Utvikling

npm test      # enhetstester mot fast fikstur — ingen nettverk
npm run smoke # mot ekte API + serveren som prosess (krever nett)
npm run bench # måler hva rutefilteret koster på en lang tur (krever nett)

Enhetstestene bruker en frosset fikstur slik at et rødt bygg alltid betyr «koden er feil», ikke «wifi-en er nede». Røyktesten snakker MCP over stdio til en spawnet server — en test som bare importerer moduler finner aldri ut om kommandoen i det hele tatt starter.

Om datakildene

Begge er fra Statens vegvesen, og ingen av dem krever nøkkel eller registrering.

Trafikkmeldinger: traffic-info.atlas.vegvesen.no/traffic-information/messages — det samme endepunktet som Vegvesenets egen trafikk-app bruker. Krever headeren X-System-ID.

Tellepunkter: trafikkdata-api.atlas.vegvesen.no — et GraphQL-API over ~5 900 punkter som teller kjøretøy (10 000+ hvis du tar med sykkeltellere og punkter som er ute av drift; serveren filtrerer bort begge).

Fire ting som er lette å snuble i om du kaller endepunktene selv:

  • Accept: application/json gir 406. Innholdstypen er application/vnd.svv.v1+geo+json, og innholdsforhandlingen er streng.
  • Uten X-System-ID får du 400 med en feilmelding som ikke nevner headeren.
  • GraphQL-sider er maks 100. first: 101 feiler med «An unknown error occurred» — det er et tak, ikke en anbefaling, så paginering er obligatorisk og ikke en optimalisering.
  • Datex-feeden er ikke lenger åpen. datex-server-get-v3-1.atlas.vegvesen.no svarer 401 og krever registrering.

Bruk av dataene er underlagt Vegvesenets vilkår: https://www.vegvesen.no/om-oss/om-organisasjonen/apne-data/

Dette prosjektet er ikke tilknyttet eller støttet av Statens vegvesen.

Lisens

MIT — se LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选