trafikverket-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@trafikverket-mcpWhat's the weather on E4?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| 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 |
| string | No | - | Substring filter (case-insensitive) |
| 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 |
| number | Yes | - | WGS84 latitude (-90 to 90) |
| number | Yes | - | WGS84 longitude (-180 to 180) |
| number | No | 30 | Search radius in kilometers |
| number | No | 50 | Maximum stations to return |
get_weather_observations
Get historical weather observations for trend analysis.
Parameter | Type | Required | Default | Description |
| number | Yes | - | Measurement point ID |
| number | No | 10 | Maximum observations (1-100) |
Camera Tools
get_cameras
Get traffic cameras with optional filtering.
Parameter | Type | Required | Default | Description |
| string | No | - | Substring filter (e.g., "E4") |
| number | No | - | Swedish county code (1-25) |
| 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 |
| number | Yes | - | WGS84 latitude |
| number | Yes | - | WGS84 longitude |
| number | No | 30 | Search radius in kilometers |
| number | No | - | County filter for efficiency |
| number | No | 50 | Maximum cameras (1-1000) |
get_camera_image
Fetch the actual image from a traffic camera.
Parameter | Type | Required | Description |
| string | Yes | Photo URL from |
Returns: Base64-encoded camera image.
Traffic Tools
get_traffic_situations
Get current traffic incidents, accidents, roadwork, and closures.
Parameter | Type | Required | Default | Description |
| string | No | - | Road filter (e.g., "E4", "väg 862") |
| number | No | - | County code (1-25) |
| 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 |
| number | No | - | County code (1-25) |
| number | No | - | Trafikverket region (1-6) |
| string | No | - | Filter: "good", "degraded", "bad" |
| number | No | 50 | Maximum measurements |
get_road_conditions
Get road surface conditions including ice, snow, and water.
Parameter | Type | Required | Default | Description |
| string | No | - | Road filter (e.g., "E4") |
| 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
Node.js 18+
Trafikverket API key (free from api.trafikinfo.trafikverket.se)
Setup
# Clone the repository
git clone https://github.com/hniska/trafikverket-mcp.git
cd trafikverket-mcp
# Install dependencies
npm install
# Build
npm run buildConfiguration
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 |
| Run with tsx (development) |
| Compile TypeScript |
| Run compiled server |
| Run unit tests |
| Run E2E tests against real API |
| Lint code |
| 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 outputArchitecture
Claude (MCP Client)
↓ JSON-RPC over STDIO
MCP Server
↓ XML Request
Trafikverket API
↓ XML Response
Parser → TypeScript Types
↓ Formatted Response
ClaudeError 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 toolsget_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.
| Name | Required | Description | Default |
|---|---|---|---|
| photoUrl | Yes | The photo URL from a camera (obtained from get_cameras tool) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of cameras to return (default: 10) | |
| county | No | Optional Swedish county number (1-25) to filter cameras by region | |
| namePattern | No | Optional pattern to filter camera names (SQL LIKE syntax) |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of cameras to return (default: 50) | |
| county | No | Optional Swedish county number to filter results by region | |
| latitude | Yes | Latitude in WGS84 (e.g., 64.75 for Skellefteå) | |
| radiusKm | No | Search radius in kilometers (default: 30) | |
| longitude | Yes | Longitude in WGS84 (e.g., 20.95 for Skellefteå) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of road conditions to return (default: 50) | |
| roadNumber | No | Road number to filter (e.g., 'E4', '45') |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of traffic flow measurements to return (default: 50) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of situations to return (default: 50) | |
| county | No | County number (1-25) to filter | |
| roadNumber | No | Road number to filter (e.g., 'E4', '45') |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of observations to return (default: 10) | |
| measurepointId | Yes | ID of the measurement point to get observations for |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stationName | Yes | Name of the weather station to query |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of stations to return (default: 50) | |
| latitude | Yes | Latitude in WGS84 (e.g., 64.75 for Skellefteå) | |
| radiusKm | No | Search radius in kilometers (default: 30) | |
| longitude | Yes | Longitude in WGS84 (e.g., 20.95 for Skellefteå) |
TDQS
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.
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.
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.
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.
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.
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').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of stations to return (default: 100) | |
| namePattern | No | Optional pattern to filter station names (SQL LIKE syntax) |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.1.0- First observed
get_camera_image - First observed
get_cameras - First observed
get_cameras_near_location - First observed
get_road_conditions - First observed
get_traffic_flow - First observed
get_traffic_situations - First observed
get_weather_observations - First observed
get_weather_station - First observed
get_weather_stations_near_location - First observed
list_weather_stations
TDQS
Scored across 10 tools
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.
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.
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.
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
Related MCP Connectors
Stockholm transit: realtime departures, trip planning, disruptions and personal commute status.
Swedish flight tracking: live status, gates, airport boards, nearby-aircraft ADS-B scan.
Nordic weather: forecasts, warnings, HD radar, rain nowcast, lightning, aurora, satellite AI.
Norwegian transport (Entur) and geodata (Kartverket): trips, departures, addresses, elevation.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides 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.25 npmMIT
- AlicenseAqualityFmaintenanceQuery Swedish public data from AI tools. Includes company data, SCB statistics, weather, transport, public agencies, and more through the Apiverket API.235 npm2MIT
- AlicenseAqualityCmaintenanceProvides 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.3MIT
- AlicenseAqualityCmaintenanceProvides AI agents with live access to over 1 million traffic cameras worldwide, enabling search by bounding box, radius, route, or nearest point and fetching live frames.6MIT