taiwan-data-mcp 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +2 -2
- package/src/server.mjs +16 -1
- package/src/sources.mjs +45 -0
package/README.md
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
| `taiwan_drug_info` | 用許可證字號查藥品成分/適應症/健保價/回收/短缺 | health-hub |
|
|
23
23
|
| `taiwan_gov_tender_by_company` | 查某公司投標/得標的政府採購案 | 政府電子採購網(g0v PCC API) |
|
|
24
24
|
| `taiwan_gov_tender_search` | 用標案名稱關鍵字搜尋政府採購案 | 政府電子採購網(g0v PCC API) |
|
|
25
|
+
| `taiwan_farm_price` | 查蔬果批發市場最新行情(菜價) | 農業部 data.moa.gov.tw |
|
|
25
26
|
|
|
26
27
|
跨工具串接是重點:例如「查這家公司 → 看它登記地址那區的房價 → 查它官網是不是詐騙」,一次問答內 AI 自己串起來。
|
|
27
28
|
|
|
@@ -78,6 +79,7 @@ node test/e2e.mjs # MCP 協定層測試
|
|
|
78
79
|
- 165 防詐查詢 — **[fraud.tw](https://fraud.tw)**(防詐雷達)
|
|
79
80
|
- 藥品/健康查詢 — **[health-hub](https://health-hub-epx.pages.dev)**(衛福部食藥署資料)
|
|
80
81
|
- 政府標案查詢 — 政府電子採購網開放資料(透過 [g0v PCC API](https://pcc.g0v.ronny.tw))
|
|
82
|
+
- 農產批發行情 — 農業部開放資料([data.moa.gov.tw](https://data.moa.gov.tw))
|
|
81
83
|
|
|
82
84
|
三站皆為聚合台灣政府開放資料的免費查詢服務。
|
|
83
85
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "taiwan-data-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server for Taiwan public data — 實價登錄、公司登記查核、165
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "MCP server for Taiwan public data — 實價登錄、公司登記查核、165 防詐、藥品查詢、政府標案、農產行情。Query real Taiwan data from Claude, Cursor, etc.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"taiwan-data-mcp": "src/server.mjs"
|
package/src/server.mjs
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
realpriceSearch, realpriceLocate, realpriceArea, realpriceEstimate, realpriceRoad,
|
|
8
8
|
drugSearch, drugInfo,
|
|
9
9
|
tenderByCompany, tenderSearch,
|
|
10
|
+
farmPrice,
|
|
10
11
|
} from './sources.mjs';
|
|
11
12
|
|
|
12
13
|
const TOOLS = [
|
|
@@ -183,6 +184,20 @@ const TOOLS = [
|
|
|
183
184
|
},
|
|
184
185
|
run: (a) => tenderSearch(a.keyword, a.page),
|
|
185
186
|
},
|
|
187
|
+
{
|
|
188
|
+
name: 'taiwan_farm_price',
|
|
189
|
+
description:
|
|
190
|
+
'查台灣農產品批發市場最新交易行情:某蔬果的平均、最高、最低批發價(元/公斤)與交易量。颱風季菜價查詢常用。涵蓋蔬果花卉,不含禽蛋肉品。資料來源:農業部 data.moa.gov.tw。',
|
|
191
|
+
inputSchema: {
|
|
192
|
+
type: 'object',
|
|
193
|
+
properties: {
|
|
194
|
+
crop: { type: 'string', description: '蔬果名稱,例如「高麗菜」「香蕉」「青蔥」「番茄」' },
|
|
195
|
+
market: { type: 'string', description: '批發市場(可選,預設「台北一」),例如「台北一」「台北二」「台中」「三重」「高雄」' },
|
|
196
|
+
},
|
|
197
|
+
required: ['crop'],
|
|
198
|
+
},
|
|
199
|
+
run: (a) => farmPrice(a.crop, a.market),
|
|
200
|
+
},
|
|
186
201
|
];
|
|
187
202
|
|
|
188
203
|
const server = new Server(
|
|
@@ -207,4 +222,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
207
222
|
|
|
208
223
|
const transport = new StdioServerTransport();
|
|
209
224
|
await server.connect(transport);
|
|
210
|
-
console.error('taiwan-data-mcp running (stdio) —
|
|
225
|
+
console.error('taiwan-data-mcp running (stdio) — 15 tools: 防詐 / 公司登記 / 實價登錄 / 藥品健康 / 政府標案 / 農產行情');
|
package/src/sources.mjs
CHANGED
|
@@ -107,6 +107,51 @@ export async function companyRisk(id) {
|
|
|
107
107
|
};
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
// ── 農產批發行情 MOA(農業部農產品交易行情)──────────────────────
|
|
111
|
+
function _rocToAd(s) {
|
|
112
|
+
const m = String(s || '').match(/^(\d{2,3})\.(\d{2})\.(\d{2})$/);
|
|
113
|
+
return m ? `${Number(m[1]) + 1911}-${m[2]}-${m[3]}` : s || null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// 常見俗名 → 農業部資料作物名(資料用正式名,民眾用俗名)
|
|
117
|
+
const CROP_ALIAS = { 高麗菜: '甘藍', 蕃茄: '番茄', 西紅柿: '番茄', 小蕃茄: '小番茄', 聖女番茄: '小番茄' };
|
|
118
|
+
|
|
119
|
+
export async function farmPrice(crop, market) {
|
|
120
|
+
let c = String(crop || '').trim();
|
|
121
|
+
if (!c) return { error: '請提供農產品名稱,例如「高麗菜」「香蕉」「青蔥」' };
|
|
122
|
+
if (CROP_ALIAS[c]) c = CROP_ALIAS[c];
|
|
123
|
+
const mkt = String(market || '台北一').trim();
|
|
124
|
+
const { ok, body } = await fetchJson(
|
|
125
|
+
`https://data.moa.gov.tw/Service/OpenData/FromM/FarmTransData.aspx?Market=${encodeURIComponent(mkt)}`,
|
|
126
|
+
{ timeout: 20000 }
|
|
127
|
+
);
|
|
128
|
+
if (!ok || !Array.isArray(body)) return { error: '查詢失敗(農業部農產行情)', crop: c, market: mkt };
|
|
129
|
+
const matched = body
|
|
130
|
+
.filter((r) => String(r['作物名稱'] || '').includes(c))
|
|
131
|
+
.map((r) => ({
|
|
132
|
+
crop: r['作物名稱'],
|
|
133
|
+
date: _rocToAd(r['交易日期']),
|
|
134
|
+
market: r['市場名稱'],
|
|
135
|
+
avg_price_ntd_kg: r['平均價'],
|
|
136
|
+
high_ntd_kg: r['上價'],
|
|
137
|
+
low_ntd_kg: r['下價'],
|
|
138
|
+
volume_kg: r['交易量'],
|
|
139
|
+
}));
|
|
140
|
+
if (!matched.length) {
|
|
141
|
+
return { crop: c, market: mkt, count: 0,
|
|
142
|
+
note: `${mkt}市場最新交易日查無「${c}」,可換關鍵字或市場(如 台北一/台北二/台中/三重/高雄)`,
|
|
143
|
+
source: '農業部農產品批發市場交易行情 data.moa.gov.tw' };
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
crop: c,
|
|
147
|
+
market: mkt,
|
|
148
|
+
count: matched.length,
|
|
149
|
+
items: matched.slice(0, 30),
|
|
150
|
+
note: '價格單位:元/公斤;交易量:公斤;為該市場最新交易日資料',
|
|
151
|
+
source: '農業部農產品批發市場交易行情 data.moa.gov.tw',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
110
155
|
// ── 政府標案 PCC(g0v 政府採購開放資料)─────────────────────────
|
|
111
156
|
const PCC_BASE = 'https://pcc-api.openfun.app';
|
|
112
157
|
|