arimair-mcp
OfficialClick 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., "@arimair-mcp Show me today's PM2.5 and PM10 averages."
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.
ARIM MCP Server
An MCP (stdio) server that lets Claude directly query measurement data, statistics, corrections, and reports from the Arim Air monitoring system.
Query-only. It does not include features that change server state (report publishing, applying corrections, device commands, backfill, alarm registration/deletion).
Installation
Node.js 18 or higher is required.
macOS / Linux
cd /Users/amdmania/Project/arimair-mcp
npm install
npm run build
./setup-arim-mcp.sh # Claude Code + Claude Desktop 자동 등록Windows
Place the repository in a location of your choice (e.g., C:\Users\<user>\arimair-mcp) and run it from that folder.
The installation script resolves paths relative to its own location, so it works no matter where you put it.
In PowerShell:
cd C:\Users\<사용자>\arimair-mcp
npm install
npm run build
powershell -ExecutionPolicy Bypass -File .\setup-arim-mcp.ps1-ExecutionPolicy Bypass is an option that allows running an unsigned script just this once.
It does not change system policy.
What the installation script does (common)
The server address is fixed to the production server (https://monitor.arimair.com), so it is not prompted for.
Both scripts only ask for the ID, password, and account type, then register in the two places below.
Claude Code CLI (
claude mcp add arim -s user) — skipped if theclaudecommand is not availableClaude Desktop configuration file — the existing file is backed up as
.bak.<timestamp>, and other MCP servers already registered are preserved
OS | Claude Desktop configuration path |
macOS |
|
Windows |
|
After registration, you must fully quit and reopen Claude Desktop for the tools to appear.
Manual registration
# macOS / Linux
claude mcp add arim -s user -t stdio \
-e ARIM_API_BASE_URL=https://monitor.arimair.com \
-e ARIM_MCP_USER=<아이디> \
-e ARIM_MCP_PASS=<비밀번호> \
-- node /Users/amdmania/Project/arimair-mcp/build/index.js# Windows (PowerShell) — 경로는 실제 설치 위치로
claude mcp add arim -s user -t stdio `
-e "ARIM_API_BASE_URL=https://monitor.arimair.com" `
-e "ARIM_MCP_USER=<아이디>" `
-e "ARIM_MCP_PASS=<비밀번호>" `
-- node C:\Users\<사용자>\arimair-mcp\build\index.jsIf you did not register a password, you can log in with the arim_login tool after connecting.
Related MCP server: GigAPI MCP Server
Environment variables
Variable | Default value | Description |
|
| Target server address. The installation script registers it fixed to this value, so you normally do not need to touch it; only change it to |
| — | Auto-login ID |
| — | Auto-login password |
|
|
|
|
| Request timeout (ms) |
If credentials are set as environment variables, the server auto-logs in on the first tool call, and if the session expires, it re-logs in once and retries.
Authentication method
The ARIM server does not issue JWTs; it authenticates via HttpSession + session cookie (Spring Session's SESSION).
The MCP stores the cookie received from the /account/login call and sends it with subsequent requests.
All requests include the X-Mcp-Client: 1 header. When this header is present, the server's AuthorizeInterceptor returns a 401 JSON instead of a 302 redirect to the login page, and the MCP treats this as session expiry and re-logs in.
Sites
Device, measurement data, statistics, and report queries are all based on the currently selected site.
Internally, the server uses the session's monitorId (the monitoring target administrator account), but the tools treat it as a "site."
This is the same as the site selection combo at the top of the web screen.
site_list → 선택 가능한 사이트와 현재 사이트
site_select { site: "울산 환경보건센터" } → 사이트 변경site_select accepts even a partial site name. Even if the words are in a different order than the registered name (e.g., the registered name is [환경보건센터] 울산 울산대), it will find it as long as all the words are present. It searches the display name (company), the contact person's name (name), and the siteId.
If there are multiple candidates, it does not pick one arbitrarily; it returns the candidate list (e.g., "환경보건센터" → 9 locations)
An exact name match takes precedence over partial matches (e.g., "도로교통연구원" →
arimsc_ex)
General user accounts see only approved providers; admin accounts see the full list (same rule as the web screen).
Tool list
Authentication
Tool | Description |
| Log in (can use environment variable credentials) |
| Query login status / monitorId / system settings |
| End session |
Sites
Tool | Description |
| List selectable sites and the current site |
| Change the query target site |
Devices
Tool | Description |
| Device list |
| Device details |
| Latest values for all devices (raw) |
| Latest values for all devices (corrected) |
| Nearby Air Korea stations |
Measurement data
Tool | Description |
| Period query (auto-switches between raw/hourly average/daily average by period) |
| Always queries minute-level raw data |
| Most recently collected data |
Statistics & weather
Tool | Description |
| Query average data |
| Collection rate (missing rate) by device × date |
| KMA station list |
| KMA observation history (hourly/daily) |
| Sensor metadata (unit, decimal places) |
Corrections
Tool | Description |
| Devices subject to correction and application status |
| Correction factor trend (last 12 months) |
| Time series comparison before/after correction |
| Correction factors for a specific application month |
| Correction model version history |
Reports
Tool | Description |
| Publication history |
| History details |
| List of target months for publication |
| New report (V2) HTML body |
Alarms
Tool | Description |
| Alarm occurrence history |
| Sensor threshold SMS notification settings |
Monitoring aggregation
Tool | Description |
| Operation/communication status aggregation |
| Normal operation rate |
| Collection count aggregation |
| Faulty/abnormal devices |
| Monitoring period query |
| Pollution rose |
Large response handling
Time series query tools accept maxRows (default 500). The server has no row limit, so even a single day of minute-level queries can produce over 1,400 rows; when exceeded, the server performs uniform interval sampling and returns totalRows / returnedRows / sampled in the response. The last (most recent) row is always preserved.
Server-side dependencies
This MCP assumes the following server changes.
Location | Change |
| Return 401 JSON when |
| Add |
| Add |
If /account/me and /setting/sensorlist are missing, only arim_whoami, sensor_list, and alarm_config_list (when adminId is omitted) will not work; the other tools will work normally. site_list also works, but without /account/me it cannot ask the server for the current site, so it displays the value selected via site_select in this session as the current site.
The site feature itself uses only existing APIs (/site/update/{id}, /admin/list, /datarequest/providerlist) without any server modification.
Available Tools
36 toolsalarm_config_listA
센서 임계치 문자 알림 설정을 조회한다. adminId 를 생략하면 arim_whoami 의 monitorId 를 쓴다.
Inputs: adminId.
alarm_listB
발생한 알람 이력을 조회한다.
Inputs: maxRows.
arim_loginA
ARIM 모니터링 서버에 로그인해 세션을 만든다. 인자를 생략하면 ARIM_MCP_USER/ARIM_MCP_PASS 환경변수를 쓴다.
Inputs: userId, password, userType.
arim_logoutA
세션을 종료하고 쿠키를 폐기한다.
Inputs: no named parameters.
arim_whoamiA
현재 로그인 상태와 조회 필터의 기준이 되는 monitorId, 시스템 설정을 조회한다.
Inputs: no named parameters.
correction_compareA
보정 전/후 시간별 시계열을 나란히 조회한다. 보정 효과 검증에 쓴다.
Inputs: endDate (required), deviceId (required), startDate (required), maxRows.
correction_devicesB
보정 대상 측정기 목록과 보정 적용 현황을 조회한다.
Inputs: no named parameters.
correction_factorsB
특정 적용월에 사용된 보정 인자를 조회한다.
Inputs: deviceId (required), applyMonth (required).
correction_trendA
측정기의 보정 인자 변화 추이(최근 12개월)를 조회한다.
Inputs: deviceId (required), item.
correction_versionsA
보정 모델의 버전 이력(성능 지표 포함)을 조회한다.
Inputs: deviceId (required), item, limit, periodType.
data_raw_searchA
기간과 무관하게 항상 분단위 원시 데이터를 조회한다. 통계 테이블을 거치지 않는다.
Inputs: endDate (required), deviceId (required), startDate (required), maxRows.
data_recentB
측정기의 최근 수집 데이터를 조회한다.
Inputs: deviceId (required), maxRows.
data_searchB
측정 데이터를 기간으로 조회한다. 조회 기간에 따라 서버가 단위를 자동 전환한다 (1일 이하: 분단위 원시, 30일 이하: 시간평균, 초과: 일평균).
Inputs: endDate (required), deviceId (required), startDate (required), maxRows.
device_getB
측정기 한 대의 상세 정보를 조회한다.
Inputs: deviceId (required).
device_listA
로그인 계정이 볼 수 있는 측정기 목록을 조회한다. (id, 이름, 주소, 경위도, 센서/네트워크 상태, 보정 적용 여부)
Inputs: no named parameters.
device_nearby_stationsA
측정기 인근의 에어코리아 측정소 목록을 거리순으로 조회한다. 보정 기준국 확인에 쓴다.
Inputs: deviceId (required).
device_realtimeA
전체 측정기의 최신 측정값을 조회한다. (보정 미적용 원시값 기준)
Inputs: no named parameters.
device_realtime_correctionA
전체 측정기의 최신 측정값을 보정 적용값으로 조회한다.
Inputs: no named parameters.
monitor_data_countB
데이터 수집 건수 집계를 조회한다.
Inputs: no named parameters.
monitor_device_stateB
측정기 가동/통신 상태 집계를 조회한다.
Inputs: no named parameters.
monitor_fault_devicesA
고장·이상 상태로 판정된 측정기 목록을 조회한다.
Inputs: no named parameters.
monitor_roseB
오염장미도(풍향별 농도 분포) 데이터를 조회한다.
Inputs: period (required).
monitor_rose_searchC
지정 기간의 오염장미도 데이터를 조회한다.
Inputs: endDate (required), startDate (required).
monitor_searchC
모니터링 화면과 동일한 기준으로 측정기의 기간별 데이터를 조회한다.
Inputs: endDate (required), deviceId (required), startDate (required), maxRows.
monitor_working_percentB
측정기 정상 가동률을 조회한다.
Inputs: no named parameters.
report_getB
리포트 발행 이력 한 건의 상세를 조회한다.
Inputs: no (required).
report_listB
리포트 발행 이력을 조회한다. (측정기, 대상월, 생성/메일 발송 여부, 파일명)
Inputs: no named parameters.
report_monthsA
리포트를 발행할 수 있는 대상 월 목록을 조회한다.
Inputs: no named parameters.
report_v2_htmlA
신규 리포트(V2)의 HTML 본문을 조회한다. 저장본이 없으면 서버가 생성하며 LLM 소견 생성 때문에 오래 걸릴 수 있다.
Inputs: deviceId (required), yearMonth (required), maxChars.
sensor_listA
센서 메타 정보(항목 id, 이름, 단위, 소수점 자릿수)를 조회한다. 측정값 해석·표기에 쓴다. digit 은 'F1','F2' 형식이라 숫자만 뽑아 쓴다.
Inputs: no named parameters.
site_listA
조회 대상으로 선택할 수 있는 사이트 목록과 현재 선택된 사이트를 조회한다. 측정기·데이터·리포트 조회는 모두 현재 사이트를 기준으로 한다.
Inputs: no named parameters.
site_selectA
조회 대상 사이트를 바꾼다. 사이트 이름의 일부(예: '부산시설공단')만 줘도 되고, 정확한 siteId 를 줘도 된다. 이후의 모든 조회가 이 사이트 기준으로 바뀐다.
Inputs: site (required).
stat_collection_rateA
측정기 × 일자별 데이터 수집률(결측률)을 조회한다. 결측 구간 파악에 쓴다.
Inputs: end (required), start (required), maxRows, deviceId.
stat_daily_avgA
평균 데이터를 기간으로 조회한다. 1일 이하는 원시, 30일 이하는 시간평균, 초과는 일평균으로 서버가 자동 전환한다.
Inputs: endDate (required), deviceId (required), startDate (required), maxRows.
stat_weatherA
기상청 관측 이력(기온·풍향·풍속·습도 등)을 시간별 또는 일별로 조회한다.
Inputs: stnId (required), endDate (required), startDate (required), mode, +1 more.
stat_weather_stationsA
기상청(KMA) 관측소 목록을 조회한다. stat_weather 의 stnId 를 찾을 때 쓴다.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 36 tools
Multiple tools overlap in purpose, especially around data queries: data_recent vs device_realtime, monitor_search vs data_search vs data_raw_search vs stat_daily_avg, and monitor_rose vs monitor_rose_search. Descriptions clarify some differences, but several tool boundaries remain unclear and could easily cause misselection.
Most tool names use snake_case with domain prefixes like device_, data_, stat_, correction_, report_, and monitor_, which provides structure. However, action verbs are inconsistent and some names are non-verb nouns or adjectives such as data_recent, monitor_rose, correction_factors, and report_v2_html, making the pattern less predictable.
With 36 tools, the server exceeds the 25+ threshold and feels heavy. Several tools could be consolidated, such as the realtime variants, rose variants, and overlapping period-based data query tools, even though the overall domain is fairly broad.
The tool set gives broad read coverage for authentication, site/device context, raw and aggregated measurements, corrections, reports, and alarms. The lack of create/update/delete operations is acceptable for a monitoring-focused server, though alarm config is read-only and some reporting workflows are only partially surfaced.
Maintenance
Related MCP Connectors
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
Read-only Google Analytics 4 MCP server for AI assistants.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThis read-only MCP Server allows you to connect to Adobe Analytics data from Claude Desktop through CData JDBC Drivers. For full CRUD support, check out the first managed MCP platform: CData Connect AI (https://www.cdata.com/ai/).3MIT
- AlicenseCqualityDmaintenanceAn MCP server that provides seamless integration with Claude Desktop for querying and managing timeseries data in GigAPI Timeseries Lake.76Apache 2.0
- AlicenseNot gradedqualityCmaintenanceMCP server for the air-Q Cloud API, enabling remote retrieval of air quality sensor data and historical analysis through read-only tools like listing devices, fetching readings, and exporting charts or data.46 PyPIApache 2.0
- AlicenseAqualityDmaintenanceRead-only MCP server enabling natural language querying of personal health and cultural activity scores from the health.ojimpo.com dashboard via Claude.514 npmMIT