Refnusa

Indonesia reference data: holidays, wages, regions, postal codes, tax, food prices, KBLI, BPS stats

Should I use this

Quality & Safety

A
Description quality
86%
Schema completeness
89%
Naming quality
99%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (11)

  • LOWTool 'get_postal_code' description lacks action verbin get_postal_code
  • LOWTool 'reverse_postal_code' description lacks action verbin reverse_postal_code
  • LOWTool 'get_ptkp' description lacks action verbin get_ptkp
  • LOWTool 'get_bpjs_rates' description lacks action verbin get_bpjs_rates
  • LOWTool 'get_passport_fees' description lacks action verbin get_passport_fees
  • LOWTool 'get_kbli' description lacks action verbin get_kbli
  • LOWTool 'get_tax_rates' description lacks action verbin get_tax_rates
  • LOWTool 'get_zakat' description lacks action verbin get_zakat
  • LOWTool 'get_het_prices' description lacks action verbin get_het_prices
  • LOWTool 'get_stat_series' description lacks action verbin get_stat_series

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~5,422Tokens (tool definitions)
~864 BTypical response size
Significant attention impact (4.24% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "refnusa": {
      "url": "https://refnusa.dev/mcp"
    }
  }
}

Remote endpoints

https://refnusa.dev/mcpstreamable-http

What it can do

Tool inventory

Tools (33)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢list_datasets

Coverage and status of every dataset: status, row count, source instrument, effective date, publisher, official source URL, last check, data period, cadence, maximum age, next expected update, and the catalogue page. The licence, caveat and fallback fields are Indonesian text.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟢get_holidays(year)

Public holidays (libur nasional) and joint leave days (cuti bersama) for one year, from that year's SKB 3 Menteri decree.

Input Schema

{
  "type": "object",
  "properties": {
    "year": {
      "type": "integer",
      "description": "Calendar year, for example 2026",
      "minimum": 2000,
      "maximum": 2100
    }
  },
  "required": [
    "year"
  ]
}
🟢check_holiday(date)

Whether one date is a public holiday or cuti bersama, with the decree it was checked against. Weekends count only when the decree names them.

Input Schema

{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "description": "Date in YYYY-MM-DD form",
      "format": "date"
    }
  },
  "required": [
    "date"
  ]
}
🟢get_ump(year, province_code)

Provincial minimum wage (UMP) for one year (default: the newest loaded), all provinces or one province. For 2026, 29 provinces cite the governor decree and 9 the BPS table; 1997 to 2025 rows cite the BPS yearly table (2017 and Jawa Barat 2016: BPS Statistik Indonesia 2018, Tabel 3.2.23).

Input Schema

{
  "type": "object",
  "properties": {
    "year": {
      "type": "integer",
      "description": "Calendar year, for example 2026; omit for the newest year loaded",
      "minimum": 1997,
      "maximum": 2100
    },
    "province_code": {
      "type": "string",
      "description": "Kemendagri province code, optional",
      "pattern": "^\\d{2}$"
    }
  },
  "required": []
}
🟢get_ump_history(province_code)

Every loaded year of the provincial minimum wage (UMP) for one province, oldest first, each row with its source (governor decree or BPS table) and URL. 1997 to 2026. Without province_code: the same rows for all provinces in one response, ordered by province then year (for charts and bulk analysis).

Input Schema

{
  "type": "object",
  "properties": {
    "province_code": {
      "type": "string",
      "description": "Kemendagri province code; omit for all provinces",
      "pattern": "^\\d{2}$"
    }
  },
  "required": []
}
🟢get_umk(year, regency_code, province_code)

Regency or city minimum wage (UMK) for one year. With regency_code: that kabupaten/kota (default year: its newest). Without it: every kabupaten/kota with a confirmed figure for the year (default: the newest loaded), in one response, optionally limited to one province_code.

Input Schema

{
  "type": "object",
  "properties": {
    "year": {
      "type": "integer",
      "description": "Calendar year, for example 2026; omit for the newest year loaded",
      "minimum": 1997,
      "maximum": 2100
    },
    "regency_code": {
      "type": "string",
      "description": "Kemendagri kabupaten/kota code; omit to list all",
      "pattern": "^\\d{2}\\.\\d{2}$"
    },
    "province_code": {
      "type": "string",
      "description": "Kemendagri province code; used only when regency_code is omitted",
      "pattern": "^\\d{2}$"
    }
  },
  "required": []
}
🟢get_umk_history(regency_code)

Every loaded year of the regency or city minimum wage (UMK) for one kabupaten/kota, oldest first, each row with its source instrument and URL: a governor decree, or for some regions the open-data portal of the regional government (source_instrument then starts with Portal and notes that the dataset has no decree number). Covers Jawa Barat 2023 to 2026, Jawa Tengah 2022 to 2026, Jawa Timur 2024 to 2026, a few Riau and Bali regions for 2024, Kalimantan Barat (2019, 2022, 2025), Banten (2020 to 2024), seven Sumatera Selatan regions (2024), five Kalimantan Timur regions (Berau, Kutai Barat, Kutai Timur, Penajam Paser Utara, Samarinda), six Magelang-area regions 2014 to 2020, Kota Tegal 2021 and Rembang (2010, 2019). Where no decree or portal row exists, BPS provincial tables fill in (source_instrument then starts with BPS table, one amount per year, no decree number or effective date): Sumatera Utara 2015 to 2024, Kepulauan Riau 2016 to 2025, Jawa Tengah 2017 to 2021, Banten 2014 to 2019, Nusa Tenggara Timur 2016 to 2025 (not 2019), Lampung 2017 to 2025, DI Yogyakarta 2016 to 2025, plus UMK 2026 for Nusa Tenggara Timur and 12 Lampung regions.

Input Schema

{
  "type": "object",
  "properties": {
    "regency_code": {
      "type": "string",
      "description": "Kemendagri kabupaten/kota code",
      "pattern": "^\\d{2}\\.\\d{2}$"
    }
  },
  "required": [
    "regency_code"
  ]
}
🟢get_wilayah(level, parent_code, code)

Administrative regions: the 38 provinces, the children of one parent code, or one region by code.

Input Schema

{
  "type": "object",
  "properties": {
    "level": {
      "type": "string",
      "description": "Level to list; anything below provinsi needs parent_code",
      "enum": [
        "provinsi",
        "kabupaten",
        "kecamatan",
        "kelurahan"
      ]
    },
    "parent_code": {
      "type": "string",
      "description": "List the children of this code",
      "pattern": "^\\d{2}(\\.\\d{2}){0,2}(\\.\\d{4})?$"
    },
    "code": {
      "type": "string",
      "description": "Return this one region",
      "pattern": "^\\d{2}(\\.\\d{2}){0,2}(\\.\\d{4})?$"
    }
  },
  "required": []
}
🟢get_postal_code(wilayah_code)

Postal codes of one kelurahan or desa by its wilayah code.

Input Schema

{
  "type": "object",
  "properties": {
    "wilayah_code": {
      "type": "string",
      "description": "Kemendagri wilayah code",
      "pattern": "^\\d{2}(\\.\\d{2}){0,2}(\\.\\d{4})?$"
    }
  },
  "required": [
    "wilayah_code"
  ]
}
⚪reverse_postal_code(postal_code)

Regions (kelurahan or desa) that carry one postal code.

Input Schema

{
  "type": "object",
  "properties": {
    "postal_code": {
      "type": "string",
      "description": "Postal code",
      "pattern": "^\\d{5}$"
    }
  },
  "required": [
    "postal_code"
  ]
}
🟢get_pph21_ter(category, income_idr)

PPh 21 effective average rate (TER) bracket for a monthly gross income and TER category A, B or C, per PP 58/2023.

Input Schema

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "description": "TER category A, B or C",
      "enum": [
        "A",
        "B",
        "C"
      ]
    },
    "income_idr": {
      "type": "integer",
      "description": "Monthly gross income in rupiah",
      "minimum": 0
    }
  },
  "required": [
    "category",
    "income_idr"
  ]
}
🟢get_ptkp(status)

Annual non-taxable income (PTKP) for a taxpayer status such as TK/0 or K/1.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "PTKP status code",
      "pattern": "^(TK|K|K\\/I)\\/[0-3]$"
    }
  },
  "required": [
    "status"
  ]
}
🟢get_prayer_times(city_code, date)

Prayer times for one kabupaten/kota and date, computed by a documented hisab method; not an official Kemenag feed.

Input Schema

{
  "type": "object",
  "properties": {
    "city_code": {
      "type": "string",
      "description": "Kemendagri kabupaten/kota code; a kecamatan or kelurahan code falls back to its parent",
      "pattern": "^\\d{2}(\\.\\d{2}){0,2}(\\.\\d{4})?$"
    },
    "date": {
      "type": "string",
      "description": "Date in YYYY-MM-DD form",
      "format": "date"
    }
  },
  "required": [
    "city_code",
    "date"
  ]
}
🟢get_bpjs_rates(program, status)

BPJS contribution rates as a percent of monthly wage, per program (JHT, JP, JKK, JKM, JKP, JKN), with the decree behind each rate. JKK serves the PP 6/2025 bands; the 2026 JP wage cap is Rp10.547.400 (the BPJS article 18913 says Rp10.547.000, see the row note).

Input Schema

{
  "type": "object",
  "properties": {
    "program": {
      "type": "string",
      "description": "Program; omit for all",
      "enum": [
        "JHT",
        "JP",
        "JKK",
        "JKM",
        "JKP",
        "JKN"
      ]
    },
    "status": {
      "type": "string",
      "description": "current (default) or superseded rows, or all",
      "enum": [
        "current",
        "superseded",
        "all"
      ]
    }
  },
  "required": []
}
🟢get_bank_codes(code, name)

Three-digit bank codes (Sandi Bank) of the commercial and sharia banks on the OJK head-office list of June 2026, by code or by part of the bank name; no argument lists all 105.

Input Schema

{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "description": "Sandi Bank, optional",
      "pattern": "^\\d{3}$"
    },
    "name": {
      "type": "string",
      "description": "Part of the bank name, optional"
    }
  },
  "required": []
}
🟢get_fuel_prices(fuel)

Retail price per litre of the subsidised and special-assignment fuels (Solar, minyak tanah, RON 90) from Kepmen ESDM 218.K/MG.01/MEM.M/2022. Non-subsidised fuels are not included.

Input Schema

{
  "type": "object",
  "properties": {
    "fuel": {
      "type": "string",
      "description": "kerosene, gas_oil (Solar) or ron90; omit for all three",
      "enum": [
        "kerosene",
        "gas_oil",
        "ron90"
      ]
    }
  },
  "required": []
}
🟢list_food_commodities

The 10 staple food groups and their 21 items that PIHPS Nasional (Bank Indonesia) reports per province, with code, Indonesian and English name, unit (Rp/kg), the markets (tradisional, modern) that have a price on the newest day, and for the groups the first and last month of the monthly series.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟢get_food_prices_latest(commodity, market, province_code, month)

Latest PIHPS Nasional (Bank Indonesia) price of a staple food per province, in Rp/kg, on the newest observation day, plus PIHPS national averages. Covers the 10 groups and 21 items. Without market you get one row per province and commodity: the traditional-market (tradisional) price when it exists, otherwise the modern-market price; each row names its market and day. Traditional markets report for fewer provinces than modern ones. Pass market for one market only. Filter by commodity, province and market. With month (YYYY-MM): the monthly series price instead, for the 10 groups in traditional markets only.

Input Schema

{
  "type": "object",
  "properties": {
    "commodity": {
      "type": "string",
      "description": "Commodity code from list_food_commodities (a group or an item), optional; with month, groups only",
      "enum": [
        "beras",
        "daging_ayam",
        "daging_sapi",
        "telur_ayam",
        "bawang_merah",
        "bawang_putih",
        "cabai_merah",
        "cabai_rawit",
        "minyak_goreng",
        "gula_pasir",
        "beras_bawah_1",
        "beras_bawah_2",
        "beras_medium_1",
        "beras_medium_2",
        "beras_super_1",
        "beras_super_2",
        "daging_ayam_ras",
        "daging_sapi_1",
        "daging_sapi_2",
        "telur_ayam_ras",
        "bawang_merah_sedang",
        "bawang_putih_sedang",
        "cabai_merah_besar",
        "cabai_merah_keriting",
        "cabai_rawit_hijau",
        "cabai_rawit_merah",
        "minyak_goreng_curah",
        "minyak_goreng_kemasan_1",
        "minyak_goreng_kemasan_2",
        "gula_pasir_premium",
        "gula_pasir_lokal"
      ]
    },
    "market": {
      "type": "string",
      "description": "tradisional or modern; omit for one row per province and commodity, tradisional first then modern (with month: tradisional only)",
      "enum": [
        "tradisional",
        "modern"
      ]
    },
    "province_code": {
      "type": "string",
      "description": "Kemendagri province code, optional (Papua and Papua Barat only: 91, 92)",
      "pattern": "^\\d{2}$"
    },
    "month": {
      "type": "string",
      "description": "Return this month instead of the newest on file, optional",
      "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
    }
  },
  "required": []
}
🟢get_food_price_series(commodity, province_code, from, to)

Monthly PIHPS Nasional (Bank Indonesia) price series, in Rp/kg, for one province and one staple food from May 2017; each point is the price on the first day of the month with data (observed_on). Optional from and to months.

Input Schema

{
  "type": "object",
  "properties": {
    "commodity": {
      "type": "string",
      "description": "Commodity code from list_food_commodities",
      "enum": [
        "beras",
        "daging_ayam",
        "daging_sapi",
        "telur_ayam",
        "bawang_merah",
        "bawang_putih",
        "cabai_merah",
        "cabai_rawit",
        "minyak_goreng",
        "gula_pasir"
      ]
    },
    "province_code": {
      "type": "string",
      "description": "Kemendagri province code",
      "pattern": "^\\d{2}$"
    },
    "from": {
      "type": "string",
      "description": "First month, optional",
      "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
    },
    "to": {
      "type": "string",
      "description": "Last month, optional",
      "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
    }
  },
  "required": [
    "commodity",
    "province_code"
  ]
}
🟢get_passport_fees(category, fee_code)

Imigrasi PNBP fees from PP 45/2024: passport (biasa 5 and 10 years, electronic and non-electronic, SPLP, same-day service) and visa kunjungan (single and multiple trip). Government fee only.

Input Schema

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "description": "passport or visa; omit for all",
      "enum": [
        "passport",
        "visa"
      ]
    },
    "fee_code": {
      "type": "string",
      "description": "One fee by code, optional",
      "pattern": "^[a-z0-9_]+$"
    }
  },
  "required": []
}
🟢search_kbli(q, level, limit)

Search the KBLI 2020 business-field classification (Peraturan BPS 2/2020) by part of the title or a code prefix, optionally one of its five levels (kategori, golongan_pokok, golongan, subgolongan, kelompok). Returns code, level, parent and title; fetch one code for its description.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "description": "Part of the title, or the start of a code, optional"
    },
    "level": {
      "type": "string",
      "description": "Restrict to one level, optional",
      "enum": [
        "kategori",
        "golongan_pokok",
        "golongan",
        "subgolongan",
        "kelompok"
      ]
    },
    "limit": {
      "type": "integer",
      "description": "Maximum items returned, default 50",
      "minimum": 1,
      "maximum": 200
    }
  },
  "required": []
}
🟢get_kbli(code)

One KBLI 2020 entry by code (a letter A to U, or 2, 3, 4 or 5 digits) with its description, its ancestors up to the kategori and its children.

Input Schema

{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "description": "KBLI code",
      "pattern": "^([A-U]|\\d{2,5})$"
    }
  },
  "required": [
    "code"
  ]
}
🟢get_tax_rates(category, rate_code)

Tax and duty rates, each with its decree: PPN 12% and the 11/12 DPP (PMK 131/2024), Bea Meterai tariff and threshold (UU 10/2020), and the domestic cukai hasil tembakau table (PMK 97/2024 Lampiran I).

Input Schema

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "description": "ppn, bea_meterai or cukai_hasil_tembakau; omit for all",
      "enum": [
        "ppn",
        "bea_meterai",
        "cukai_hasil_tembakau"
      ]
    },
    "rate_code": {
      "type": "string",
      "description": "One rate by code, optional",
      "pattern": "^[a-z0-9_]+$"
    }
  },
  "required": []
}
🟢get_ojol_tariffs(zone_code)

Ride-hailing motorbike fare limits per zone (per-km lower and upper bound, minimum fare for the first 4 km) from KP 667/2022. A 2026 decision may supersede it; see the dataset note.

Input Schema

{
  "type": "object",
  "properties": {
    "zone_code": {
      "type": "string",
      "description": "zona_1, zona_2 or zona_3; omit for all",
      "enum": [
        "zona_1",
        "zona_2",
        "zona_3"
      ]
    }
  },
  "required": []
}
🟢get_zakat(category, zakat_code)

BAZNAS RI 2026 zakat figures: fitrah (SK 14/2026) and the nisab and rate of zakat penghasilan dan jasa (SK 15/2026).

Input Schema

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "description": "fitrah or penghasilan; omit for all",
      "enum": [
        "fitrah",
        "penghasilan"
      ]
    },
    "zakat_code": {
      "type": "string",
      "description": "One figure by code, optional",
      "pattern": "^[a-z0-9_]+$"
    }
  },
  "required": []
}
🟢get_het_prices(commodity, region)

Harga eceran tertinggi: beras medium and premium by wilayah (Keputusan Kepala Bapanas 299/2025, 22 Aug 2025) and LPG 3 kg in Jawa Timur (Kepgub 801/2024).

Input Schema

{
  "type": "object",
  "properties": {
    "commodity": {
      "type": "string",
      "description": "Commodity; omit for all",
      "enum": [
        "beras_medium",
        "beras_premium",
        "lpg_3kg"
      ]
    },
    "region": {
      "type": "string",
      "description": "Part of the region name, for example Kalimantan, optional"
    }
  },
  "required": []
}
🟢list_stat_indicators

Regional statistics from BPS tables: the indicator ids with unit, level (province or kabupaten/kota), every period available, source table and caveats. Includes unemployment (TPT), poverty and poverty lines, HDI (IPM), wages, population, GRDP per capita, life expectancy and monthly inflation and CPI (inflation_mom, inflation_yoy, inflation_ytd, cpi for provinces; inflation_yoy_regency for CPI cities; periods YYYY-MM from 2024-01, base 2022=100). Start here, then call get_stat_values or get_stat_series.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟢get_stat_values(indicator, period)

One BPS indicator for one period across all regions in a single call (for a map), plus the national figure. Period is YYYY or YYYY-MM as listed by list_stat_indicators; omit it for the latest. A bare year on a semester indicator resolves to the latest period in that year.

Input Schema

{
  "type": "object",
  "properties": {
    "indicator": {
      "type": "string",
      "description": "Indicator id",
      "pattern": "^[a-z0-9_]+$"
    },
    "period": {
      "type": "string",
      "description": "Period, optional (default: latest)",
      "pattern": "^\\d{4}(-\\d{2})?$"
    }
  },
  "required": [
    "indicator"
  ]
}
🟢get_stat_series(indicator, region_code)

The time series of one BPS indicator for one region: a province (2 digits), a kabupaten/kota (5 characters like 32.73, hdi_regency and inflation_yoy_regency only) or 00 for Indonesia.

Input Schema

{
  "type": "object",
  "properties": {
    "indicator": {
      "type": "string",
      "description": "Indicator id",
      "pattern": "^[a-z0-9_]+$"
    },
    "region_code": {
      "type": "string",
      "description": "Kemendagri region code, or 00 for Indonesia",
      "pattern": "^(00|\\d{2}(\\.\\d{2})?)$"
    }
  },
  "required": [
    "indicator",
    "region_code"
  ]
}
🟢get_fao_indonesia(series)

FAOSTAT series for Indonesia: undernourishment, food insecurity, dietary energy and protein supply, and the supply of main staples (rice, wheat, maize, cassava, sugar, vegetable oils, soyabeans, poultry, eggs, fish). FAO methodology and population estimates, not comparable with BPS figures. Call without series for the list, then with series for the values.

Input Schema

{
  "type": "object",
  "properties": {
    "series": {
      "type": "string",
      "description": "Series id; omit for the list of series",
      "pattern": "^[a-z0-9_]+$"
    }
  },
  "required": []
}
🟡validate_nik(nik)

Checks the structure of a 16-digit NIK and looks up its region digits in the wilayah table. Send the NIK in the JSON body; it is never logged.

Input Schema

{
  "type": "object",
  "properties": {
    "nik": {
      "type": "string",
      "description": "The 16-digit NIK",
      "maxLength": 32
    }
  },
  "required": [
    "nik"
  ]
}
⚪validate_plate(plate)

Checks the format of an Indonesian vehicle plate and names the region of its prefix when the prefix table is loaded.

Input Schema

{
  "type": "object",
  "properties": {
    "plate": {
      "type": "string",
      "description": "Plate such as B 1234 XYZ",
      "maxLength": 16
    }
  },
  "required": [
    "plate"
  ]
}
🟢calculate_net_salary(gross, regency_code, ptkp, jkk_band, jp, ...)

Estimated take-home pay from a monthly gross salary: worker BPJS deductions (JHT, JP, JKN), PPh 21 by the PP 58/2023 TER table or the December annual recalculation, and the employer's own contributions, each line with its decree. Give gross, or regency_code to use that kabupaten/kota UMK. An estimate; the employer payslip decides.

Input Schema

{
  "type": "object",
  "properties": {
    "gross": {
      "type": "integer",
      "description": "Monthly gross salary in rupiah; omit when regency_code is given",
      "minimum": 0,
      "maximum": 1000000000
    },
    "regency_code": {
      "type": "string",
      "description": "Use this kabupaten/kota newest UMK as the gross, optional",
      "pattern": "^\\d{2}\\.\\d{2}$"
    },
    "ptkp": {
      "type": "string",
      "description": "PTKP status",
      "enum": [
        "TK/0",
        "TK/1",
        "TK/2",
        "TK/3",
        "K/0",
        "K/1",
        "K/2",
        "K/3"
      ]
    },
    "jkk_band": {
      "type": "string",
      "description": "JKK risk band of the employer; default sangat_rendah (the lowest band, 0,24%)",
      "enum": [
        "sangat_rendah",
        "rendah",
        "sedang",
        "tinggi",
        "sangat_tinggi"
      ]
    },
    "jp": {
      "type": "string",
      "description": "Whether Jaminan Pensiun applies, default true",
      "enum": [
        "true",
        "false"
      ]
    },
    "jkn": {
      "type": "string",
      "description": "Whether BPJS Kesehatan applies, default true",
      "enum": [
        "true",
        "false"
      ]
    },
    "jp_cap": {
      "type": "integer",
      "description": "JP wage cap in rupiah; default is the stored 2026 cap (Rp10.547.400), give it to use another",
      "minimum": 1,
      "maximum": 1000000000
    },
    "month": {
      "type": "string",
      "description": "monthly (TER, January to November) or december (annual recalculation), default monthly",
      "enum": [
        "monthly",
        "december"
      ]
    },
    "jkn_employer_taxable": {
      "type": "string",
      "description": "Count the employer JKN premium as taxable income, default true",
      "enum": [
        "true",
        "false"
      ]
    }
  },
  "required": [
    "ptkp"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded33 tools