fgiscs-history-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., "@fgiscs-history-mcpHow has the salary of a grade-1 construction worker in Irkutsk Oblast changed since 2020?"
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.
fgiscs-history-mcp
MCP server over the version history of Russian construction-pricing open data (ФГИС ЦС — the Federal State Information System for Construction Pricing, operated by Glavgosekspertiza of Russia under Government Decree № 1452 of 23.12.2016).
The source portal publishes only the latest export of each dataset. This server serves what the portal does not: what changed, when — and what did not change despite being republished.
History covers 198 versions of 15 datasets, from 2017 to 2026.
Why this exists
Open data portals are built for downloading, not for comparing. If you want to know how a value moved over six years, you have to find every past export, unpack it, repair it and stitch it together. That work is done here once, so it does not have to be done again.
A concrete example the server can answer and the portal cannot: two exports of the
construction resources classifier — 2018-11-22 and 2019-06-17 — are byte-identical.
The portal published an update in which nothing had changed. A user of the portal sees
only the publication date and concludes, wrongly, that the data moved.
Related MCP server: mcp-egrul
Install
Requires Python 3.10+.
git clone https://github.com/elysosss/fgiscs-history-mcp
cd fgiscs-history-mcp
pip install -e .Add to your MCP client config (Claude Desktop, Claude Code, Cursor, …):
{
"mcpServers": {
"fgiscs-history": {
"command": "python",
"args": ["/absolute/path/to/fgiscs-history-mcp/server.py"]
}
}
}No API key, no account, no network calls — the data ships with the server (240 KB).
Tools
Tool | What it answers |
| Which datasets exist and how deep the history goes for each |
| Every version of one dataset, flagging schema changes and republished-but-unchanged exports |
| Monthly wage rate for a grade-1 construction worker in a given region, 2020 → 2026 |
| Regions ranked by wage growth over the full period |
Example questions your assistant can now answer:
«Как менялась ставка рабочего 1 разряда в Иркутской области с 2020 года?» → +202.5 % (41 621 → 125 911 ₽), with the value for each of the 8 published versions.
«В каких регионах оплата труда росла медленнее всего?» → Ненецкий АО +44.7 %, Республика Коми +51.1 %, median across 74 regions +88.9 %.
«Сколько раз менялась схема Классификатора строительных ресурсов?» → once, on 2022-11-17, across 41 versions.
Data
File | Contents |
| 15 datasets: version count, period covered, schema count, export size |
| 198 versions: date, schema date, size, sha256, duplicate flag, source URL |
| 662 rows — wage series by region across 8 versions |
Every value carries its source: each version record links back to the original file on
fgiscs.minstroyrf.ru. Nothing here is scraped — the portal's open-data API is public
and anonymous, and the ingestion pipeline respects it with pauses and backoff.
Known caveats
Region names in the source exports contain latin look-alike letters inside Russian words (
Республика Caxa,Чукотский автономный oКруг), inconsistent spellings across versions, and renames. Series are therefore keyed by region code, not by name.Price-zone slicing changes between versions (91 zone rows in 2020, 117 in 2026), so the per-region figure is a median across that region's zones; min and max are kept.
11 of 85 regions lack a start-to-end series: most appeared in the data after 2020.
Licence
MIT. The code is free to copy. The data is public open data, and its history is what took the work.
Russian: docs/ru/README.md
Available Tools
4 toolsdataset_versionsA
История версий одного набора: когда публиковалась и менялось ли содержимое.
Главное здесь — отметка о версиях, содержимое которых совпадает с другой версией: портал публикует обновление, но данные при этом не менялись. По самому порталу этого не видно — там указана только дата публикации.
Args: dataset: идентификатор набора, например 7707082071-ksrms (см. list_datasets)
| Name | Required | Description | Default |
|---|---|---|---|
| dataset | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of behavioral disclosure. It notably reveals that the portal itself hides unchanged versions, while this tool marks them—critical context for interpreting results. It does not mention any side effects or read-only status, but for a version-history tool this is implied and not a significant gap.
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 concise and well-structured: it leads with the core purpose, highlights an important nuance, and ends with an argument reference. It avoids unnecessary details and is easy to scan, though the 'Args' section slightly overlaps with the schema.
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?
Given a single parameter and the existence of an output schema, the description covers the essential context: what the tool does, how to call it, and a key interpretation detail about unchanged content. It does not explain return value structure, but that is presumably handled by the output schema, so overall it is 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?
The schema provides no description for the `dataset` parameter, so the tool description must compensate. It does so by giving a concrete example (7707082071-ksrms) and pointing to list_datasets for obtaining valid identifiers. This is sufficient for basic usage, though it could elaborate on format or constraints.
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 clearly indicates the tool provides version history for a single dataset, including publication timing and content-change status. It distinguishes itself from sibling tools by focusing on version-level details rather than dataset listings or salary metrics. However, it lacks an explicit action verb like 'returns' or 'shows,' making it slightly less directive.
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 implicitly guides usage by requiring a dataset identifier and referencing list_datasets as the source for valid IDs. It also explains a unique scenario where the tool adds value (detecting versions with unchanged content), which helps the agent decide when to use it. It does not explicitly name alternatives, but the sibling tools are clearly distinct in purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasetsA
Перечислить наборы открытых данных ФГИС ЦС и глубину истории по каждому.
Возвращает название набора, число сохранённых версий, период, за который доступна история, и число различных схем данных за этот период.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It explains the return fields (name, versions count, period, schema count) but does not explicitly state safety traits like read-only or mention potential side effects, rate limits, or permissions. For a simple listing, this is adequate but not exhaustive.
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 two sentences, front-loaded with the main action, and every sentence adds value. It avoids redundancy and is appropriately sized for a simple no-parameter listing tool.
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?
Given the tool's simplicity, the description is complete: no parameters, an output schema exists, and the description explains the return semantics. It covers the essential information an agent needs to invoke it 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?
The tool has zero parameters, so the schema fully covers the input. Per the rubric, 0 params yields a baseline of 4. The description adds no parameter details but none are needed.
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 clearly states the tool lists open data sets of FGIS CS with history depth, using a specific verb and resource. It distinguishes from siblings like dataset_versions (which likely focuses on a specific dataset) by covering all datasets, making its 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 description provides no guidance on when to use this tool versus alternatives such as dataset_versions or salary_history. The only context is the purpose itself; there are no explicit exclusions or cross-references to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salary_growth_rankingA
Рейтинг регионов по росту оплаты труда в строительстве за всю доступную историю.
Args: limit: сколько регионов показать ascending: True — начиная с наименьшего роста, False — с наибольшего
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| ascending | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses a key behavioral trait—using 'entire available history'—and explains the effect of the ascending parameter on sorting. However, it does not state that the operation is read-only or describe the return format, though the output schema covers that.
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 two lines: a purpose statement followed by a concise Args section. Every element earns its place, and the parameter explanations are directly mapped. There is no verbose or redundant content.
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?
The description covers the core purpose and both parameters, and the output schema is available to document the return structure. It is complete for a simple ranking tool, though it could mention potential edge cases like missing data. Overall, it leaves no major gaps.
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?
The schema provides no descriptions for the parameters, but this description fully compensates by explaining 'limit' as the number of regions to show and 'ascending' as whether to start from smallest or largest growth. This adds clear semantic meaning beyond the bare type declarations.
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 clearly states the tool ranks regions by salary growth in construction over all available history. This is specific and distinct from siblings like salary_history, which provides historical data for individual entities. The purpose is unambiguous despite using a noun phrase rather than a verb.
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 usage when a ranking of regions by salary growth is needed, but it does not explicitly contrast this tool with sibling tools like salary_history or list_datasets. There are no exclusions or alternative recommendations, so usage guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salary_historyA
Динамика среднемесячной оплаты труда рабочего 1 разряда в строительстве по региону.
Показывает ставку по каждой версии данных с 2020 года. В источнике лежит только последняя выгрузка — динамики там нет.
Args: subject: название или часть названия субъекта РФ, например «Иркутская» или «Москва»
| Name | Required | Description | Default |
|---|---|---|---|
| subject | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 discloses that the tool returns rates for each data version since 2020 and notes that the source only has the latest snapshot, which is a useful behavioral trait. However, it does not mention output format, ordering, error behavior, or limitations such as potential missing versions.
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 compact and well-structured: a one-sentence summary, a clarification about the data source, and a clearly formatted Args section. Every sentence adds value without redundancy or filler.
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 single-parameter tool with an output schema, the description covers the essential aspects: what the tool does, what parameter to provide, and a notable caveat about the source data. It does not explain the output structure, but the output schema presumably covers that. The only minor gap is the absence of guidance on handling missing subjects or unclear matches.
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?
The schema has no descriptions (0% coverage), so the parameter explanation in the description is essential. It specifies 'subject' as a full or partial name of a Russian region with concrete examples ('Иркутская' or 'Москва'), clarifying the matching behavior. This adequately compensates for the missing schema metadata, though it could also mention case sensitivity or formatting nuances.
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 clearly states that the tool shows the dynamics of average monthly wages for a 1st-category construction worker by region, with a specific verb 'Показывает' (shows) and a defined scope: rate per data version since 2020. This differentiates it from siblings like salary_growth_ranking and dataset_versions by focusing on historical version-over-version values.
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 explains that the source only contains the latest upload and that dynamics are not present there, indicating this tool is needed to see historical version data. However, it does not explicitly compare against alternatives like salary_growth_ranking or provide clear conditions for when to prefer one tool over another.
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.
4 tool updates
v0.1.0- First observed
dataset_versions - First observed
list_datasets - First observed
salary_growth_ranking - First observed
salary_history
TDQS
Scored across 4 tools
Each tool targets a distinct purpose: listing datasets, showing version history, salary dynamics for a specific region, and regional ranking by salary growth. No two tools overlap in function, and the descriptions make their differences clear.
All names use lowercase snake_case with descriptive two-word compounds. While 'list_datasets' is verb-first, the others are noun phrases (dataset_versions, salary_history, salary_growth_ranking), but the style is uniform and predictable.
With only 4 tools, the server is well-scoped and focused on its purpose of providing historical data analysis. Each tool serves a distinct need, and the count is neither too thin nor excessive.
The server covers listing, version history, and two specific salary analyses, but lacks a tool to retrieve the actual data content of a dataset version. This leaves a notable gap for users who need raw historical dataset values rather than derived salary insights.
Maintenance
Related MCP Connectors
MCP server for Brazilian Federal Senate open data (legislative, administrative, e-Cidadania).
MCP server for Codat — companies, connections, invoices, bills and financial statements.
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
MCP server for the Seline Analytics API
Related MCP Servers
- AlicenseBqualityAmaintenanceMCP server that provides programmatic access to the Israeli Central Bureau of Statistics (CBS) price indices and economic data913 npm4MIT
- AlicenseAqualityAmaintenanceMCP server for the Russian state registries EGRUL (legal entities) and EGRIP (individual entrepreneurs), built on official Federal Tax Service open-data dumps. Self-hosted via local SQLite.856 PyPI2MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for parsing, diffing, and validating Turkish public construction unit price catalogs (ÇŞB birim fiyat) from PDFs, enabling AI agents to compute with structured price data.1MIT
- AlicenseAqualityBmaintenanceOffline MCP server for querying Russian construction normative rates (FSNB-2022/GESN) via SQLite with full-text search.510 npmMIT