Skip to main content
Glama
hniska
by hniska

Trafikverket MCP Server

A Model Context Protocol (MCP) server providing real-time access to Swedish road weather, traffic cameras, road conditions, and traffic flow data from Trafikverket (Swedish Transport Administration).

Features

  • Real-time weather data from 850+ Swedish road weather stations

  • Traffic camera access with live images and geographic search

  • Traffic situations including accidents, roadwork, and closures

  • Traffic flow data with vehicle counts and average speeds

  • Road surface conditions including ice, snow, and water depth

  • Geographic proximity search for cameras and weather stations

  • County-based filtering for regional queries

Related MCP server: Apiverket MCP Server

Available Tools

Weather Tools

get_weather_station

Get current weather data for a specific station by name.

Parameter

Type

Required

Description

stationName

string

Yes

Station name (e.g., "Kiruna", "Stockholm")

Returns: Air/road temperatures, humidity, visibility, wind, precipitation, road conditions.

list_weather_stations

List available weather stations with optional filtering.

Parameter

Type

Required

Default

Description

namePattern

string

No

-

Substring filter (case-insensitive)

limit

number

No

100

Maximum stations to return (1-1000)

get_weather_stations_near_location

Find weather stations near geographic coordinates.

Parameter

Type

Required

Default

Description

latitude

number

Yes

-

WGS84 latitude (-90 to 90)

longitude

number

Yes

-

WGS84 longitude (-180 to 180)

radiusKm

number

No

30

Search radius in kilometers

limit

number

No

50

Maximum stations to return

get_weather_observations

Get historical weather observations for trend analysis.

Parameter

Type

Required

Default

Description

measurepointId

number

Yes

-

Measurement point ID

limit

number

No

10

Maximum observations (1-100)

Camera Tools

get_cameras

Get traffic cameras with optional filtering.

Parameter

Type

Required

Default

Description

namePattern

string

No

-

Substring filter (e.g., "E4")

county

number

No

-

Swedish county code (1-25)

limit

number

No

10

Maximum cameras (1-100)

Returns: Camera locations, GPS coordinates, bearings, photo URLs.

get_cameras_near_location

Find cameras near geographic coordinates.

Parameter

Type

Required

Default

Description

latitude

number

Yes

-

WGS84 latitude

longitude

number

Yes

-

WGS84 longitude

radiusKm

number

No

30

Search radius in kilometers

county

number

No

-

County filter for efficiency

limit

number

No

50

Maximum cameras (1-1000)

get_camera_image

Fetch the actual image from a traffic camera.

Parameter

Type

Required

Description

photoUrl

string

Yes

Photo URL from get_cameras

Returns: Base64-encoded camera image.

Traffic Tools

get_traffic_situations

Get current traffic incidents, accidents, roadwork, and closures.

Parameter

Type

Required

Default

Description

roadNumber

string

No

-

Road filter (e.g., "E4", "väg 862")

county

number

No

-

County code (1-25)

limit

number

No

50

Maximum situations

Supports SQL-style wildcards: E% matches E4, E20, etc.

get_traffic_flow

Get real-time traffic density and speed data.

Parameter

Type

Required

Default

Description

county

number

No

-

County code (1-25)

region

number

No

-

Trafikverket region (1-6)

dataQuality

string

No

-

Filter: "good", "degraded", "bad"

limit

number

No

50

Maximum measurements

get_road_conditions

Get road surface conditions including ice, snow, and water.

Parameter

Type

Required

Default

Description

roadNumber

string

No

-

Road filter (e.g., "E4")

limit

number

No

50

Maximum conditions

Swedish County Reference

Code

County

Code

County

1

Stockholm

14

Västra Götaland

3

Uppsala

17

Värmland

4

Södermanland

18

Örebro

5

Östergötland

19

Västmanland

6

Jönköping

20

Dalarna

7

Kronoberg

21

Gävleborg

8

Kalmar

22

Västernorrland

9

Gotland

23

Jämtland

10

Blekinge

24

Västerbotten

12

Skåne

25

Norrbotten

13

Halland

Installation

Prerequisites

Setup

# Clone the repository
git clone https://github.com/hniska/trafikverket-mcp.git
cd trafikverket-mcp

# Install dependencies
npm install

# Build
npm run build

Configuration

Claude Desktop / Claude Code

Add to your MCP configuration (use absolute paths):

Production (compiled JavaScript):

{
  "mcpServers": {
    "trafikverket": {
      "command": "node",
      "args": ["/path/to/trafikverket-mcp/dist/index.js"],
      "env": {
        "TRAFIKVERKET_API_KEY": "YOUR_API_KEY"
      }
    }
  }
}

Development (TypeScript):

{
  "mcpServers": {
    "trafikverket": {
      "command": "npx",
      "args": ["tsx", "/path/to/trafikverket-mcp/src/index.ts"],
      "env": {
        "TRAFIKVERKET_API_KEY": "YOUR_API_KEY"
      }
    }
  }
}

Restart Claude after updating configuration.

Usage Examples

# Weather queries
"What's the current weather at Kiruna?"
"List weather stations near Stockholm"
"Find weather stations within 50km of Gothenburg"

# Camera queries
"Show traffic cameras on E4"
"Get cameras near Skellefteå"
"Fetch the image from camera X"

# Traffic queries
"Any traffic incidents on E4?"
"Check road conditions in Norrbotten"
"What's the traffic flow like in Stockholm county?"

Development

Scripts

Command

Description

npm run dev

Run with tsx (development)

npm run build

Compile TypeScript

npm start

Run compiled server

npm test

Run unit tests

npm run test:integration

Run E2E tests against real API

npm run lint

Lint code

npm run format

Format with Prettier

Project Structure

trafikverket-mcp/
├── src/
│   ├── index.ts                 # Entry point (STDIO transport)
│   ├── server.ts                # MCP server (tool handlers)
│   ├── lib/
│   │   ├── trafikverket-client.ts  # API client with caching
│   │   ├── xml-builder.ts          # XML query construction
│   │   ├── xml-parser.ts           # Response parsing
│   │   └── county-mapping.ts       # County code lookup
│   └── types/
│       └── trafikverket.ts      # TypeScript interfaces
├── design/
│   └── schemas/                 # Official Trafikverket XML schemas
└── dist/                        # Compiled output

Architecture

Claude (MCP Client)
    ↓ JSON-RPC over STDIO
MCP Server
    ↓ XML Request
Trafikverket API
    ↓ XML Response
Parser → TypeScript Types
    ↓ Formatted Response
Claude

Error Handling

  • Invalid API key: Clear message with registration link

  • Network errors: Timeout (10s) and connection failures

  • API errors: Trafikverket error messages forwarded

  • Validation errors: Zod schema validation with details

  • Not found: Graceful handling for missing stations/cameras

Resources

License

MIT

Available Tools

10 tools
get_camera_imageFetch Camera ImageA

Fetch the actual image from a traffic camera. Takes a photo URL (obtained from get_cameras tool) and returns the image as base64-encoded data. Use this to retrieve the current traffic camera photo for viewing.

ParametersJSON Schema
NameRequiredDescriptionDefault
photoUrlYesThe photo URL from a camera (obtained from get_cameras tool)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the return format (base64-encoded data), which is useful behavioral context. However, it doesn't state whether this is a read-only operation (implied), whether it requires auth, or any rate limits. The base64 disclosure is a meaningful addition that a schema alone wouldn't provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with the core action. Slight redundancy: the photoUrl origin is stated twice (once in description body and once in schema), but the description itself is efficient with no wasted clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 1-param retrieval tool with no output schema, the description covers the essential call semantics (input origin, output format). However, with no annotations, it misses the safety profile (read-only nature) and error-handling context (e.g., what if URL is invalid or camera offline). Adequate but with a gap for a no-annotation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents the photoUrl parameter with the origin note. The description repeats this origin constraint ('Takes a photo URL (obtained from get_cameras tool)') but adds no syntax or format details beyond what the schema provides. Baseline 3 applies when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch the actual image from a traffic camera'), clearly distinct from sibling tools like get_cameras which lists cameras rather than retrieving imagery.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the dependency: the photo URL must be obtained from the get_cameras tool first. Names the workflow context ('Use this to retrieve the current traffic camera photo for viewing'), routing the agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_camerasGet Traffic CamerasA

Get information about traffic cameras in Sweden with photo URLs. Returns camera details including photo URLs, location, direction, county, and GPS coordinates. Use the photo URLs to fetch current camera images. Can be filtered by camera name pattern or by Swedish county number.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of cameras to return (default: 10)
countyNoOptional Swedish county number (1-25) to filter cameras by region
namePatternNoOptional pattern to filter camera names (SQL LIKE syntax)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it does disclose what a result contains (photo URLs, location, direction, county, GPS), which is valuable given there is no output schema. It says nothing about pagination, default limiting behavior, permissions, or rate limits, so the disclosure is only partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the purpose front-loaded and the return fields following immediately. Slight redundancy between 'Get information about traffic cameras' and the enumerated return details, but nothing wasteful enough to penalize heavily.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema and no annotations, the description covers purpose, filter dimensions, and the shape of the response, which is enough for an agent to call it correctly. It would be fully complete with a note on default limit behavior or routing against get_cameras_near_location.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented in the schema, making 3 the baseline. The description restates the name-pattern and county filters without adding syntax, format, or constraint detail beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource (get information about traffic cameras in Sweden) and enumerates the returned fields (photo URLs, location, direction, county, GPS). It does not explicitly differentiate itself from the sibling get_cameras_near_location, which is the closest alternative, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: 'Use the photo URLs to fetch current camera images' nudges the agent toward get_camera_image, and the filtering sentence hints at broad retrieval. There is no explicit statement of when to choose this over get_cameras_near_location or the other camera/weather siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cameras_near_locationFind Nearby CamerasA

Find traffic cameras near a specific geographic location. Returns cameras within the specified radius, sorted by distance. Coordinates must be in WGS84 format (latitude, longitude). Example: cameras near Skellefteå (latitude: 64.75, longitude: 20.95)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of cameras to return (default: 50)
countyNoOptional Swedish county number to filter results by region
latitudeYesLatitude in WGS84 (e.g., 64.75 for Skellefteå)
radiusKmNoSearch radius in kilometers (default: 30)
longitudeYesLongitude in WGS84 (e.g., 20.95 for Skellefteå)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose useful behavior: results are limited to the radius and sorted by distance, and coordinates must be WGS84. It omits error behavior, empty-result handling, and response shape, so it is helpful but incomplete for a geo-query tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the purpose before the coordinate-format constraint and example. The example earns its place by clarifying coordinate ordering, though 'latitude, longitude' is already stated in the same sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 5 parameters, no annotations, and no output schema, the description covers the essential call-time concerns: coordinate system, radius scoping, and result ordering. It does not describe what a returned camera object contains, but the schema fully documents inputs and the geo-query semantics are clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (latitude, longitude, radiusKm, limit, county) is already documented in the schema. The description only restates the WGS84 coordinate format and repeats the Skellefteå example, adding no meaning beyond the schema; baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Find traffic cameras') plus scope ('near a specific geographic location'), which implicitly separates it from the sibling get_cameras (all cameras) and get_camera_image. It never names an alternative sibling explicitly, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the near-location framing and the radius parameter, but the description never says when to prefer this over get_cameras or get_weather_stations_near_location, nor any prerequisites beyond coordinate format. Adequate but leaves routing to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_road_conditionsGet Road ConditionsB

Get current road condition status including ice, snow, and water on road surfaces. Returns location-specific information about road surface conditions and temperatures. Can be filtered by road number.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of road conditions to return (default: 50)
roadNumberNoRoad number to filter (e.g., 'E4', '45')

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral disclosure, and it does describe the returned content (surface conditions and temperatures) plus a filtering capability. However, it omits data freshness, update cadence, pagination behavior, and any auth requirements for what is implicitly a read-only data feed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the core purpose and returned data front-loaded; no filler. It could be slightly tighter but every sentence contributes information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the brief summary of returned fields is welcome but thin, and no pagination or freshness detail is given. Since all parameters are fully described in the schema, the main remaining gap is behavioral context rather than call correctness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters (limit, roadNumber) are already fully documented in the schema. The description only echoes road-number filtering and adds no syntax or format detail beyond examples already present, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (road conditions) and enumerates the concrete data returned (ice, snow, water, temperatures). The resource is clearly distinct from siblings like get_weather_station, get_cameras, and get_traffic_flow, though it never explicitly names them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no when-to-use guidance, no conditions selecting it over siblings such as get_traffic_situations or get_weather_observations, and no prerequisites. 'Can be filtered by road number' is parameter information rather than usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_traffic_flowGet Traffic FlowB

Get real-time traffic flow data including vehicle counts and average speeds at measurement points. Returns current traffic density and speed information from monitoring sites across Sweden.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of traffic flow measurements to return (default: 50)

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does usefully disclose that data is real-time and geographically scoped to Sweden, which tells the agent about freshness and coverage. However, it says nothing about update cadence, pagination, or rate limits for what is presumably a live feed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the primary purpose and followed by the return content. No filler, though the second sentence partly restates the first's 'traffic flow' framing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with a fully documented schema, the description is adequate on content but thin on operating context. There is no output schema, and while the description gestures at return fields, it leaves routing and freshness details unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single limit parameter, so the schema already explains the default and meaning. The description adds no parameter detail, which lands at the baseline for fully documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource plus the data content: real-time vehicle counts, average speeds, and density from measurement points. It is clear what the tool returns, though it never distinguishes itself from siblings like get_traffic_situations or get_road_conditions, which an agent must disambiguate on its own.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus the traffic-related siblings, nor any prerequisites or exclusions. The agent gets a description of the payload but no routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_traffic_situationsGet Traffic IncidentsA

Get current traffic situations including accidents, roadwork, closures, and incidents in Sweden. Returns active traffic disturbances with severity levels, locations, and time information. Can be filtered by road number or county.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of situations to return (default: 50)
countyNoCounty number (1-25) to filter
roadNumberNoRoad number to filter (e.g., 'E4', '45')

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses that only active disturbances are returned and what fields accompany them (severity, location, time), which helps set expectations. However, it omits permissions, rate limits, pagination behavior, and any note that this is a non-mutating read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with zero filler: purpose first, then return content, then filtering options. Front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema and three well-documented parameters, the description covers purpose, return content, and filters adequately. It could mention the default limit/pagination behavior, but otherwise an agent has what it needs to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (limit, county, roadNumber) are already documented in the schema. The description reiterates the road number and county filters but adds no format or syntax detail beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (traffic situations), enumerates exactly what it covers (accidents, roadwork, closures, incidents), and scopes it geographically to Sweden. This clearly distinguishes it from siblings like get_traffic_flow and get_road_conditions, which cover different data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description notes it 'can be filtered by road number or county,' giving some usage context, but never states when to prefer this tool over get_traffic_flow or get_road_conditions, nor any prerequisites. Usage is implied rather than explicitly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_weather_observationsGet Weather HistoryB

Get historical weather observations for a specific measurement point. Returns time-series data of past weather conditions. Useful for analyzing weather trends.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of observations to return (default: 10)
measurepointIdYesID of the measurement point to get observations for

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses that this is a read-only retrieval returning time-series past conditions, but it omits authorization needs, rate limits, pagination/ordering behavior, and any implicit time bounds on 'historical' data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences, front-loaded with the purpose and free of filler. Each sentence contributes either purpose, return shape, or a use case, though the final sentence is somewhat generic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with no output schema, the description gives a broad return shape ('time-series data of past weather conditions') but does not clarify time range, ordering, or how the limit parameter affects results. It is minimally adequate rather than fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the two parameters are already fully documented in the schema. The description adds only that observations are for a specific measurement point and are time-series; it provides no extra syntax, format, or meaning beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (Get) and resource (historical weather observations) scoped to a measurement point, so the agent knows this retrieves past weather data. It does not explicitly distinguish itself from sibling get_weather_station, but the historical/time-series framing makes the core purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Useful for analyzing weather trends' gives an implied use case but does not state when to choose this over alternatives such as get_weather_station or list_weather_stations. No exclusions or prerequisites are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_weather_stationGet Weather StationA

Get current weather data for a specific Swedish weather station by name. Returns temperature, humidity, wind, precipitation, and road conditions. Use this to check current road weather conditions in Sweden.

ParametersJSON Schema
NameRequiredDescriptionDefault
stationNameYesName of the weather station to query

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses the returned fields (temperature, humidity, wind, precipitation, road conditions), which is useful, but says nothing about station-name matching semantics, failure behavior for unknown stations, or freshness of the data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences, front-loaded with the core action and followed by return values and the use case. Slight redundancy between 'current weather data' and 'current road weather conditions', but nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, listing the returned fields and the geographic scope covers most of what an agent needs. Only the absence of a pointer to list_weather_stations for name resolution leaves a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single stationName parameter, so the schema already documents it. The description adds only that the name must be a Swedish station, which is mild added meaning; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Get current weather data for a specific Swedish weather station by name') and the 'by name' qualifier implicitly separates it from get_weather_stations_near_location. It stops short of explicitly naming a sibling, but the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to check current road weather conditions in Sweden' gives an implied use case and geographic scope, but there is no when-not guidance and no pointer to list_weather_stations for name discovery or to the near-location variant. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_weather_stations_near_locationFind Nearby Weather StationsA

Find weather measurement stations near a specific geographic location. Returns stations within the specified radius, sorted by distance. Coordinates must be in WGS84 format (latitude, longitude). Example: weather stations near Skellefteå (latitude: 64.75, longitude: 20.95)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of stations to return (default: 50)
latitudeYesLatitude in WGS84 (e.g., 64.75 for Skellefteå)
radiusKmNoSearch radius in kilometers (default: 30)
longitudeYesLongitude in WGS84 (e.g., 20.95 for Skellefteå)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses return ordering ('sorted by distance') and coordinate-format requirements, but does not state read-only safety, authentication needs, or what a returned station contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences with no filler: purpose, return behavior, and input-format guidance in order of importance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read query with rich schema coverage and no output schema, the description supplies enough to select and invoke the tool. It could state what station fields are returned or how empty results are handled, but these gaps are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description repeats the WGS84 coordinate requirement and example already present in the schema, adding no extra parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Find'), resource ('weather measurement stations'), and scope ('near a specific geographic location'), with radius and distance-sorting details that distinguish it from list_weather_stations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it ('near a specific geographic location') but does not explicitly name alternatives or when-not-to-use conditions such as list_weather_stations for non-spatial listing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_weather_stationsList Weather StationsA

List available Swedish weather stations with optional name filtering. Use this to discover station names before querying specific weather data. Search uses case-insensitive substring matching (e.g., 'Timrå', 'Fjärryta', 'Uppsala', '222', 'Lidingöbron').

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of stations to return (default: 100)
namePatternNoOptional pattern to filter station names (SQL LIKE syntax)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses the geographic scope (Swedish stations) and the case-insensitive substring matching behavior, but omits return format, pagination/limit behavior, and whether the operation is read-only. For a simple list tool this is adequate but incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and usage, then adds search semantics. Every sentence contributes to selection or invocation, and the examples, while numerous, are directly useful for the name pattern. No structural waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter discovery tool, the description covers why to use it and how name filtering works. However, with no output schema and no annotations, it does not describe what the return contains (e.g., station names, IDs, coordinates) or the default limit behavior. It is sufficient to invoke correctly but incomplete for interpreting results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds meaningful clarification for namePattern, including case-insensitive substring matching and example values, though it does not explain the limit parameter. There is a slight tension between the schema's 'SQL LIKE syntax' and the description's 'substring matching', but it remains useful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('Swedish weather stations') with optional name filtering. It distinguishes itself from get_weather_station by framing the tool as discovery of station names before querying specific weather data. Sibling tools are not named explicitly, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use this tool to discover station names before querying specific weather data, giving clear context for invocation. It does not state when to prefer siblings like get_weather_station or get_weather_stations_near_location, so no exclusions or alternatives are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.0
    • First observedget_camera_image
    • First observedget_cameras
    • First observedget_cameras_near_location
    • First observedget_road_conditions
    • First observedget_traffic_flow
    • First observedget_traffic_situations
    • First observedget_weather_observations
    • First observedget_weather_station
    • First observedget_weather_stations_near_location
    • First observedlist_weather_stations

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation4/5

Most tools target distinct resources and actions, such as cameras, weather stations, traffic situations, traffic flow, and road conditions. However, get_weather_station, list_weather_stations, get_weather_stations_near_location, and get_weather_observations have some overlap in weather-station-related retrieval, and get_road_conditions partially overlaps with weather station road condition data. Descriptions help clarify, but an agent could still hesitate between current station weather and historical observations.

Naming Consistency4/5

The set is almost entirely consistent snake_case with a get_ prefix (e.g., get_weather_station, get_cameras, get_traffic_flow), which is predictable. The one deviation is list_weather_stations, which uses a different verb but is still conventional and readable. Overall the naming is coherent with a minor stylistic variation.

Tool Count5/5

Ten tools is a well-scoped size for a domain-specific Swedish traffic and weather data server. Each tool covers a distinct data type or access pattern, and there is no evident bloat or missing essential operation within the count itself.

Completeness4/5

The surface covers cameras (list, near-location, image), weather stations (list, specific, near-location, historical observations), traffic situations, traffic flow, and road conditions. This is broad and lifecycle-appropriate for the apparent domain. Minor gaps may exist, such as no direct near-location query for traffic situations, but agents can likely work around that with existing filters.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Provides access to current weather conditions and hourly forecasts for any location in Sweden using the SMHI Open Data API. It supports built-in city lists, coordinate inputs, and geocoding fallback to deliver detailed meteorological data without requiring authentication.
    2
    5 npm
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Query Swedish public data from AI tools. Includes company data, SCB statistics, weather, transport, public agencies, and more through the Apiverket API.
    2
    35 npm
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides access to real-time Danish road traffic events, roadworks, and queues via public data from Vejdirektoratet, enabling AI assistants to check road conditions without any API keys.
    3
    MIT