Skip to main content
Glama
README.md
# 臺南心理衛生資源 MCP

把散在台南市衛生局十幾層選單裡的心理資源,變成**一句話就查得到**的東西。

```
你說:我們機構在哪幾份官方名單上?
它做:查四個來源 → 寬欣心理治療所 + 芯寬欣,兩個據點都在,
      而且你們在「免費諮商合作名單」裡,每週一至五 8:00-21:00
```

---

## 這支存在的理由

這些資料 **手動都查得到**。問題是那些網址長這樣:

```
https://health.tainan.gov.tw/page.asp?mainid=0A3943E7-033E-4686-8514-7BD39368D32D
```

**沒有語意,只有一串 GUID。** 你不可能用猜的,只能從首頁一層一層點。

所以這支的價值不在「取得資料」,在 **把跨來源的交叉比對自動化**:

- 三份官方名單互相漏收了誰?
- 一個行政區到底歸哪一處心衛中心管?
- 免費諮商的時段集中在星期幾、哪幾天等於沒有?

這些手動要花半天,而且下個月資料一動就得重做。

---

## 五分鐘裝好

```bash
git clone https://github.com/scatjay/kxmind-tainan-mental-mcp.git
cd kxmind-tainan-mental-mcp
pip install -r requirements.txt
```

`claude_desktop_config.json` 加:

```json
{
  "mcpServers": {
    "tainan-mental": {
      "command": "python",
      "args": ["C:/你的路徑/kxmind-tainan-mental-mcp/server.py"]
    }
  }
}
```

重開 Claude,然後說「**跑一下 ping**」。看到資料筆數就代表通了。

**沒有帳號要註冊,沒有金鑰要申請。** repo 裡已經附好資料快照。

---

## 九支工具

### 讀取層

| 工具 | 做什麼 |
|---|---|
| `ping` | 確認接上了,順便看快照多新 |
| `find_myself` | **查一家機構出現在哪幾份名單上** |
| `list_clinics` | 列治療所/諮商所/精神科診所,可依區、依類型 |
| `find_free_counseling` | 找免費諮商,可指定行政區與星期 |
| `which_center` | 這個行政區的社區心衛中心是哪一處 |
| `list_datasets` | 接了哪些來源、何時抓的 |

### 分析層 —— 這一層才是重點

| 工具 | 手動要多久 |
|---|---|
| `diff_clinic_sources` | **40–60 分鐘**(3 個分頁、80 筆抄進 Excel、正規化名稱、兩次 VLOOKUP) |
| `free_slots_by_weekday` | **50 分鐘以上**(58 筆逐筆讀時段文字、手動歸類、再按區 group) |
| `count_by_layer` | 這件事一般不會有人去做 —— 因為要開 5 個來源、發現數字不一樣、然後放棄 |

---

## 三個現場跑得動的實例

### 1. `find_myself("寬欣")` — 查自己

```
「寬欣」出現在 6 個地方:
  【地圖/心理治療、諮商所】寬欣心理治療所    北區育德一街227號1、2樓  (06)2510966
  【地圖/心理治療、諮商所】芯寬欣心理治療所  北區北安路一段273號      (06)2510560
  【免費諮商合作名單】      寬欣心理治療所    週一 每週一至五 8:00-21:00
  【衛生局名冊】…
```

### 2. `diff_clinic_sources()` — 三份官方名單互相漏收誰

```
衛生局名冊 32 家 / 資源地圖 26 家 / 兩邊都有 24 家

只在名冊、地圖沒有(8 家)
   誼仁、欣空間、欣橋、星語、愛相會、好心情、山實、沐盼

只在地圖、名冊沒有(2 家)
   心物語、李慧芳
```

**這不是單向漏收,是兩份官方文件互相不知道對方。**

### 3. `which_center("永康區")` — 沒人猜得對的那題

```
永康區 → 善化區社區心理衛生中心   (06)581-0105
```

不是永康自己。6 處中心的服務區域加起來 **剛好 37 區,不重不漏**,
所以任何行政區都查得到答案,demo 不會開天窗。

---

## 🔴 現場紀律:預設讀快照,不要全班同時打政府網站

`data/` 裡放的是 **2026-08-27 抓的快照**,附抓取時間戳。所有工具預設讀它。

理由:一場工作坊十幾個人、同一個 IP、同一時間。一起打政府網站有觸發速率限制的
風險,而且場地 WiFi 品質通常不明。

要更新資料:

```bash
python fetch_snapshot.py
```

或呼叫 `refresh_snapshot()` —— **但現場只由講師示範一次,其餘人讀快照。**

---

## 資料來源

全部是公開資料,**不需要申請任何權限**。每一筆都在 2026-08-27 經過
獨立的對抗性查核(100 筆通過、22 筆因網址失效或內容對不上被剔除)。

| 來源 | 內容 |
|---|---|
| [臺南市心理健康資源地圖](https://www.google.com/maps/d/kml?mid=1YhZw1eQCaI3gtDb_E8WBO1XP_-E&forcekml=1) | KML,141 個標點、4 圖層 |
| [心理諮商所、心理治療所名冊](https://health.tainan.gov.tw/page.asp?mainid=0A3943E7-033E-4686-8514-7BD39368D32D) | 治療所 12 + 諮商所 20 |
| [免付費諮商-公部門地點](https://health.tainan.gov.tw/page.asp?mainid=586CAFE0-5DA5-49E6-831F-1D54499B808C) | 40 個點 |
| [免付費諮商-需場地費地點](https://health.tainan.gov.tw/page.asp?mainid=499FD2AD-07B9-4A27-AA13-E0397489855A) | 22 家民間機構 |
| [社區心理衛生中心據點](https://health.tainan.gov.tw/page.asp?mainid=%7B6048F242-90E2-4CC2-9DAB-45D4CCB2ACAD%7D) | 6 處,涵蓋 37 區 |
| [免費諮商據點 CSV](https://data.tainan.gov.tw/File/ResourceCsvDownload/351ee754-b3ca-4efc-bdc0-5ecb4c0ec57b) / [各區代碼 CSV](https://data.tainan.gov.tw/File/ResourceCsvDownload/5b389f60-dee6-425a-8a40-f5cb2f949cf1) | 43 筆/37 區 |

---

## 資料品質:這些坑寫在程式碼裡

寫這支的時候踩到、而且都留在註解裡:

- **免費諮商那 58 筆,`<name>` 全部是同一個字串**「預約免費心理諮商」。
  真正的地點在 ExtendedData 的「諮商地點」欄。直接讀 name 會得到 58 個一模一樣的點。
- **CSV 有雙重 BOM**(`EF BB BF EF BB BF`)。`utf-8-sig` 只剝一層,第一個欄名會殘留看不見的字元。
- **心衛中心的服務區域**:第一版我用「在中心名稱附近 900 字元裡 regex 撈所有 XX區」,
  結果善化中心變成 26 區,還混進「服務區」「願景園區」「社區」這種假的。
  查詢**碰巧**會對 —— 但碰巧對的工具不能拿去教人。改成照 `服務區域:` 那一行讀,
  現在 6 處加起來剛好 37 區。
- **機構名要正規化才比得起來**:台南/臺南、有沒有「社團法人」前綴。

---

## ⚠️ 使用上的提醒

- 這裡的資料是**公開資訊的快照**,不是即時系統。轉介前建議先打電話確認。
- 「臺南有幾家精神醫療機構」沒有單一答案 —— `count_by_layer()` 會告訴你為什麼,
  而且 **能收強制住院的「指定機構」只有 7 家,不是 41 家**。
- 本工具不處理任何個案資料。查詢的是機構,不是人。

## 授權

MIT。資料版權屬臺南市政府衛生局與臺南市政府資料開放平臺。