serbian-data-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_datasetsA | Search data.gov.rs datasets. ALWAYS call this first — never guess dataset IDs. Returns dataset IDs needed for get_dataset(). Serbian and English both work (e.g. 'stanovništvo' or 'population', 'budžet' or 'budget'). Returns: {datasets: [{id, title, organization, resources, tags, ...}], total, page, page_size, has_next} |
| list_organizationsA | List publishers on data.gov.rs. Use returned IDs to filter search_datasets(). Key orgs: РЗС (statistics), Министарство финансија (budget), Завод за јавно здравље (health). Returns: {organizations: [{id, name, description, url, logo}], count, page, page_size} |
| suggest_datasetsA | Autocomplete dataset titles. Use when unsure of exact Serbian terms. Example: suggest_datasets("stanov") → ["Stanovništvo Republike Srbije", ...] |
| search_by_tagB | Find all datasets tagged with specific topics regardless of publisher. Common tags: "statistika", "budžet", "obrazovanje", "zdravlje", "saobraćaj", "cene", "registar", "ekologija", "stanovništvo". Returns: Same shape as search_datasets(). |
| get_portal_statisticsB | Get dataset and organization counts for the portal overview. |
| intelligent_searchA | Search datasets with semantic understanding and fallback suggestions (RECOMMENDED). Uses the cached local catalog for fast results without API rate limits. Expands queries with synonyms and Serbian↔English translations, and offers related-dataset suggestions when no exact match is found. Prefer this over search_datasets() unless you need live API results or organization/format filters. |
| preview_datasetA | Show dataset metadata with a data preview (first N rows) before downloading. Use this BEFORE get_resource_data() to understand structure cheaply. Reads metadata and sample rows from the first downloadable resource. |
| get_datasetC | Get dataset details. detail_level controls response size. |
| get_resource_dataA | Download and parse a data file from data.gov.rs. Parses JSON, CSV, XLSX, XLS, and XML automatically. Resource IDs come from get_dataset(detail_level="metadata"). |
| compare_datasetsB | Compare two datasets side by side. Helps choose the best dataset for analysis. Shows differences in publisher, tags, resource count, formats, quality. |
| browse_recent_datasetsA | Discover newly added/updated datasets. Returns most recently modified first. |
| get_dataset_resourcesA | List the data files (resources) available for a specific dataset. Use this before get_resource_data() to discover:
Equivalent to get_dataset(detail_level="resources"), exposed as its own tool for callers that only need the file listing. |
| get_data_summaryA | Quick schema summary of a resource's data without downloading the full file. Returns column names, dtypes, row count, and sample values for the first few rows. Much faster than get_resource_data() for large XLSX/CSV files where you only need to know the schema. |
| transform_dataC | Transform data: filter, group, aggregate, sort, or select columns. |
| filter_data_toolA | Filter rows by criteria. Shorthand for transform_data(operation='filter'). |
| group_data_toolA | Group data by one or more columns with optional aggregations. Shorthand for transform_data(operation='group'). Returns one row per group with the requested aggregation(s) applied. Aggregation functions: sum, mean, median, min, max, count, std, var. |
| aggregate_data_toolA | Aggregate a single column using a function. Shorthand for transform_data(operation='aggregate'). Returns the scalar result as {"value": ..., "column": ..., "function": ...}. Functions: sum, mean, median, min, max, count, std, var. |
| sort_data_toolA | Sort data by one or more columns. Shorthand for transform_data(operation='sort'). |
| select_columns_toolA | Select specific columns from data, dropping all others. Shorthand for transform_data(operation='select'). |
| create_chartA | Create interactive charts from data. Supports 20+ chart types. BASIC CHARTS (most common):
|
| apply_chart_themeA | Apply visual theme to a chart figure from create_chart(). Themes: 'dark' (data-journalism), 'light' (clean), 'infographic' (large type). Add annotations: [{"text": "...", "x": val, "y": val}] for callouts. Add zones: [{"x_start": val, "x_end": val, "label": "..."}] for highlights. |
| build_infographicA | Create a complete infographic HTML: headline + big number + chart + insights. Self-contained HTML with responsive design. Opens in any browser. Saved to exports/ directory. Returns: {filepath, metadata, insights, headline} |
| build_dashboardB | Build multi-panel dashboard HTML. Each panel: chart, HTML, or big number. |
| enhance_chart_tooltipsA | Add rich contextual tooltips to any Plotly figure. Enriches hover with formatted values, deviation from mean, and rank. Without: 'Value: 7150000'. With: 'Value: 7.15M / Prosečno: 4.2M / Rank: #1'. Returns: Enhanced figure dict |
| add_chart_annotationC | Add a callout annotation to a chart for storytelling. Text box with optional arrow pointing to a data point. |
| add_chart_highlight_zoneA | Add a shaded vertical highlight zone to a chart. Highlights a time period with a colored band. Ideal for: COVID years, crisis periods, policy changes. Returns: Enhanced figure dict |
| add_chart_calloutsA | Add multiple annotation callout boxes to highlight data points. Each box has arrow pointing to data. Points: {x, y, text, color?, ax?, ay?} Returns: Enhanced figure dict |
| add_chart_threshold_lineB | Add a horizontal threshold/reference line with label. Ideal for: EU average benchmark, target/goal line, critical threshold. Returns: Enhanced figure dict |
| create_data_tableA | Create a styled, responsive HTML data table with conditional formatting. Professional table with ranking indicators and value formatting. Highlights max or min value row. Ideal for: district statistics, budget breakdowns, top-N listings. Returns: {filepath, title, rows, total_rows, columns} |
| data_profileA | Understand data structure BEFORE creating charts or transforming. Returns column names, types, unique counts, null counts, sample values. For numeric columns: min, max, mean, median. ALWAYS use after get_resource_data() and before create_chart() to choose correct columns. |
| extract_data_insightsA | Extract surprising findings from data: extremes, trends, outliers, inequality. Each insight has severity (critical/high/medium/low), headline, and narrative. Sorted by severity. Use AFTER data_profile() to identify time/entity columns. Returns: {insights: [...], total_found, headline, severity_summary} |
| generate_data_narrativeC | Generate a data story: headline, big number, narrative text. Returns: {title, headline, big_number, big_label, insights, summary} |
| compute_metricsA | Compute derived metrics: YoY changes, per-capita, growth rates, index (base=100). Returns: {yoy_changes, per_capita, growth_rates, index_values, derived_data} |
| forecast_dataB | Forecast future values using regression. 'At this rate, X by 2030.' Returns: {forecast_data, growth_rate, projection_note, r_squared, historical_data, trend_line} |
| benchmark_dataB | Compare against benchmarks (EU average, regional, custom). Returns: {statistical_benchmarks, best_performer, worst_performer, comparisons, insights} |
| compare_cross_datasetA | Extract insights by comparing two related datasets. Finds correlations, divergences, and rank disagreements. Ideal for: 'population vs air quality' analyses. Returns: {summary_a, summary_b, correlation, insights} |
| create_serbia_mapA | Choropleth map of Serbia by 25 administrative districts. Color-coded by metric. District names in Natural Earth format (English transliteration). Cyrillic and city shorthand also supported (e.g., 'Niš', 'Novi Sad'). Use list_serbia_districts() to see all recognized names. Returns: {filepath, districts_matched, total_districts, title} |
| list_serbia_districtsA | List 25 administrative districts for create_serbia_map(). Returns recognized names. |
| create_bubble_mapA | Bubble map of Serbia — circle size = magnitude. Avoids large-district bias. Returns: {filepath, districts_matched, title} |
| create_multi_layer_mapA | Multi-layer choropleth with toggle buttons between indicators. Each layer: {data, name_column, value_column, label, colorscale} Returns: {filepath, layer_count, title} |
| export_visualizationA | Save a chart from create_chart() to a file. |
| export_dataB | Save data from get_resource_data() or transform_data() to file. Formats: 'csv' (universal), 'json' (API-friendly), 'xlsx' (requires openpyxl). |
| export_chart_pdfA | Export a chart to PDF. Requires kaleido (pip install kaleido). Returns: {filepath, format, width, height} or {error} if kaleido missing |
| generate_embedA | Generate iframe embed code for sharing a chart in websites/blogs. Self-contained embed snippet pasteable into any website or CMS. Renders via Plotly.js CDN. Returns: {iframe_code, width, height, note} |
| export_to_datawrapperA | Export data to Datawrapper for professional cloud-hosted charts. Creates a chart on Datawrapper (datawrapper.de) with your data, publishes it, and returns embed URLs and embed code. Requires the DATAWRAPPER_ACCESS_TOKEN environment variable. Get a free API token at: https://app.datawrapper.de/account/api-tokens Supported chart types:
|
| health_checkA | Check server health and API connectivity. |
| get_config_toolA | Get the current MCP server configuration settings. Returns the resolved runtime configuration: API endpoint, rate limit, request timeout, and the cache/export directories. Useful for debugging connectivity or understanding where exported files are written. |
| get_catalog_statsA | Get statistics about the cached dataset catalog. Summarizes the local catalog (used by intelligent_search/preview_dataset) without triggering a refresh: total datasets, distinct organizations and formats, downloadable count, and cache age. Returns: {total_datasets, total_organizations, total_formats, downloadable_datasets, formats, organizations, cache_path, cache_age_hours, cache_exists} |
| refresh_catalogA | Refresh the dataset catalog cache from data.gov.rs. Re-fetches all datasets from the API and rebuilds the local cache used by intelligent_search() and preview_dataset(). The cache also auto-refreshes every 24h on first use; call this when you need fresh data immediately. Returns: {total_datasets, cache_path, built_at, duration_seconds, timestamp} |
| create_arrow_chartA | Arrow-style chart showing directional changes. Green=positive, red=negative. Ideal for: rankings change, budget surplus/deficit, growth/decline. Returns: {filepath, title, rows} |
| create_dumbbell_chartA | Dumbbell chart: before/after comparison with connected dots. Green=increase, red=decrease. Shows magnitude and direction. Ideal for: population 2010 vs 2022, budget planned vs executed. Returns: {filepath, title, rows} |
| create_lollipop_chartA | Lollipop chart — dots on stems for clean ranking. Can highlight one entity. Ideal for: district population ranking, budget by ministry, top-N lists. Returns: {filepath, title, rows} |
| create_slope_chartA | Slope chart: ranking changes between two periods with connecting lines. Green=gained rank, red=lost rank. Ideal for: census ranking 2002→2022, budget share shifts, district reorderings. Returns: {filepath, title, rows} |
| create_waffle_chartA | Waffle chart (icon grid) for proportional data. 'X out of 100' visualization. More intuitive than pie charts for showing proportions. Ideal for: '1 in 4 Serbs live in Belgrade', budget share, sector breakdown. Returns: {filepath, title, categories} |
| create_population_pyramidA | Population pyramid: age × sex distribution. Males left, females right. Essential for census data from RZS. Classic demographic visualization. Returns: {filepath, title, age_groups} |
| create_sankey_diagramA | Sankey (alluvial) diagram showing flow between categories. Ideal for: budget flow (revenue→ministry→spending), energy distribution, migration flows, supply chains. Returns: {filepath, title, flows} |
| create_radar_chartA | Radar/spider chart for multi-metric comparison. Compare entities across multiple indicators on one radar plot. Ideal for: comparing districts on population+budget+schools+hospitals+air quality. Returns: {filepath, title, entities, metrics} |
| create_animated_chartC | Create animated charts with smooth transitions and play/pause. |
| create_scrollytelling_storyA | Create a scroll-driven HTML data story (scrollytelling). Multi-section page with narrative text scrolling left and interactive charts updating right — the visualise.admin.ch pattern. |
| create_scatter_3dA | Interactive 3D scatter / bubble chart (WebGL, orbit-able). Plots three numeric dimensions as points in 3-space, with optional color, bubble size, and marker shape encoding up to three more variables. Ideal for: spatial data (lat/lon/altitude), district × year × population, exploring three census indicators at once. Returns: {filepath, title, rows} |
| create_line_3dA | Interactive 3D line / trajectory chart (WebGL, orbit-able). Connects points through 3-space — a trajectory. Split into one line per category via color_column. Ideal for: a route through lat/lon/altitude, a metric evolving across region × time, multi-decade demographic trajectories. Returns: {filepath, title, rows} |
| create_surface_3dA | Interactive 3D surface (landscape) chart from gridded data (WebGL, orbit-able). Long-format (x, y, z) rows are pivoted into a z-value grid and rendered as a continuous surface. Suited to elevation, density, or any scalar field sampled on a regular grid. Ideal for: temperature/air-quality across city × month, terrain surfaces, optimization landscapes. Returns: {filepath, title, rows} |
| create_mesh_3dA | Interactive 3D mesh from scattered points (WebGL, orbit-able). Triangulates scattered (x, y, z) points into a connected surface or
enclosing hull — unlike Ideal for: irregular terrain/field point clouds, region bounding shapes, sparse 3D samples (e.g. pollution at uneven monitoring stations). Returns: {filepath, title, rows} |
| create_isosurface_3dA | Interactive 3D iso-surface from a volumetric scalar field (WebGL, orbit-able). Renders the 3D boundary where Ideal for: pollution/concentration thresholds across a 3D monitoring volume, isotherms, groundwater head surfaces, any "region where value ≥ threshold". Returns: {filepath, title, rows} |
| create_cone_3dA | Interactive 3D vector field / quiver plot (WebGL, orbit-able). Renders a cone at each (x, y, z) anchor pointing along the vector (u, v, w) — a 3D arrow field of direction + magnitude. Cones are colored by vector magnitude and sized by sizeref. Distinct from the scalar 3D charts: a cone field encodes a vector (flow, gradient, force) at each sample point. Ideal for: wind / air-flow fields, magnetic or electric fields, fluid-flow simulations, gradient directions across a 3D domain. Returns: {filepath, title, rows} |
| create_streamtube_3dA | Interactive 3D streamtube plot of a vector field's flow (WebGL, orbit-able). Integrates the (u, v, w) vector field into streamlines rendered as tubes
whose diameter encodes local flow magnitude. Distinct from
Ideal for: wind / ocean circulation, ventilation or HVAC airflow, magnetic / electric field lines, any continuous flow domain where the path of the flow matters more than the per-point arrow. Returns: {filepath, title, rows} |
| create_volume_3dA | Interactive 3D volume render of a volumetric scalar field (WebGL, orbit-able). Renders the full semi-transparent scalar field across (x, y, z) — a
see-through cloud whose density + color encode Ideal for: 3D pollution / concentration clouds, temperature or humidity fields across a monitoring volume, groundwater head distributions, any scalar field where the interior structure — not just the boundary — matters. Returns: {filepath, title, rows} |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| search_prompt | Prompt for searching datasets. |
| visualize_prompt | Prompt for visualization workflow. |
| data_journalism_prompt | Prompt for data journalism exploration. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| usage_guide | Dynamic guide that teaches the LLM the recommended workflow. |
| popular_datasets | Curated popular datasets with search terms and use cases. |
| topics | Available topic categories with search terms. |
| server_info | Server metadata. |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/acailic/serbian-data-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server