ckan-mcp-server について
CKAN MCP Server は、CKAN オープンデータポータル向けの MCP サーバーで、データセットの検索、組織の閲覧、表形式データの照会、メタデータの読み取りを自然言語で行えます。ジャーナリスト、研究者、行政職員、開発者を想定しており、ホスト型エンドポイントとローカルインストールの両方を利用できます。
主な機能
- 01データセットの検索と完全なメタデータの取得
- 02組織、グループ、タグの閲覧
- 03DataStore による表形式データの照会
- 04ポータルの検索とカタログ統計の取得
活用シーン
- 01報道内容の検証に使う公開データの確認
- 02政府機関が公開するデータセットの検索
- 03データパイプライン向けに特定の形式のリソースを探す
MCP 対応
本プロジェクトは MCP サーバーであり、ckan_* 系の検索・照会ツール、sparql_query ツール、ckan:// リソーステンプレートを MCP クライアントに公開して、CKAN ポータルのデータへのアクセスを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
20掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| q | string | いいえ | Solr 構文の検索クエリ |
| fq | string | いいえ | Solr 構文のフィルタークエリ。スコアリング後に適用され、関連度には影響しません。CKAN の extras フィールドには接頭辞 'extras_' を使用します(例:extras_hvd_category)。同じフィールドで OR を使う場合は field:(val1 OR val2) とし、field:val1 OR field:val2 は使用しないでください(警告なしに機能しなくなります)。例:'organization:comune-palermo'、'res_format:CSV'、'extras_hvd_category:("uri1" OR "uri2")'。 |
| page | integer | いいえ | ページ番号(1 始まり)。start の別名です。指定すると start を上書きします。 |
| rows | integer | いいえ | 返す結果の件数 |
| sort | string | いいえ | 並べ替えフィールドと順序(例:'metadata_modified desc') |
| start | integer | いいえ | ページネーションのオフセット |
| page_size | integer | いいえ | page を使用する場合の 1 ページあたりの結果数(デフォルト:10) |
| server_url | string | はい | CKAN サーバーのベース URL |
| facet_field | array | いいえ | ファセット集計するフィールド |
| facet_limit | integer | いいえ | フィールドごとのファセット値の最大数 |
| query_parser | enum | いいえ | 検索パーサーを上書きします('text' はフィールド指定のないクエリに text:(...) を強制適用します)default | text |
| content_recent | boolean | いいえ | 最近のコンテンツを対象にするため issued 日付を使用し、存在しない場合は metadata_created にフォールバックします |
| include_drafts | boolean | いいえ | ドラフトのデータセットを含めます |
| response_format | enum | いいえ | 出力形式:人が読みやすい 'markdown'、または機械可読な 'json'markdown | json |
| content_recent_days | integer | いいえ | content_recent の日数範囲(デフォルト:30) |
詳細
CKAN MCP Server
あらゆる(CKAN)オープンデータポータルを対話型に。
AI アシスタントからあらゆる CKAN オープンデータポータルに直接アクセスできます。自然言語を使って、データセットの検索、組織の調査、表形式データのクエリ、メタデータの閲覧ができます。
CKAN は、世界中のほとんどの公共オープンデータポータル(イタリアの dati.gov.it、米国の data.gov、カナダの open.canada.ca など)を支えるオープンソースプラットフォームです。こうしたポータルを利用するには、通常、その構造や API、検索構文を理解する必要があります。この MCP サーバーはその障壁を取り除きます。接続すれば、AI ツールがすべて代わりに行えます。
オープンスタンダードとオープンソースのおかげで、これが実現できます。 CKAN は、完全に文書化された公開 API を提供しています。メタデータには、データセットを記述するオープンな W3C 標準である DCAT が使われています。どちらも無料で利用・構築でき、オープンなコミュニティによって保守されています。このサーバーは、その基盤の上に成り立っています。
対象となるのは? すべての人です。記事の裏付けとなるデータを探すジャーナリスト。公開データセットを調査する研究者。行政機関がどのようなデータを公開しているかを確認する公務員。データパイプラインを構築する開発者。CKAN の知識は必要ありません。
AgID に採用 — このプロジェクトは、公共オープンデータを AI でより利用しやすく、すぐに参照できるようにする取り組みの一環として、イタリアのデジタル・イタリア庁である AgID に 再利用されました。
使い方は 2 通りあります。用途に合った方法を選んでください。
| オプション A:ローカルにインストール | オプション B:インストール不要 | |
|---|---|---|
| 方法 | npm install -g @aborruso/ckan-mcp-server | ツールからホストされた HTTP エンドポイントに接続します |
| おすすめの用途 | お使いのマシンで実行でき、あらゆるローカルツールで使えます | すぐに始められ、設定は不要です |
| リクエストの上限 | 共有上限なし | 1 日あたり 10 万件の共有上限 |
ホストされたエンドポイント:https://ckan-mcp-server.andy-pr.workers.dev/mcp
おすすめ:オプション B は、設定不要ですぐに始めて試せる方法です。サーバーでできることを把握したら、オプション A(ローカルインストール)に切り替えることで、共有上限なしで無制限に利用できます。
👉 コードベースを調べてみませんか?AI が生成した DeepWiki がおすすめの出発点です。
ライセンス:MIT — 詳細は LICENSE をご覧ください。サードパーティの通知:NOTICE.md。

⚖️ 制限
ローカルサーバーとホスト型サーバーでは、ツールと出力の上限は同じです。ホスト型エンドポイントには、上記の共有リクエストクォータも適用されます。
| 項目 | デフォルト | 最大値または設定 |
|---|---|---|
| ツール出力 | 50,000 文字 | サーバー全体で固定の上限 |
ckan_datastore_search の行数 | 100 | 32,000(0 の場合は列名のみを返します) |
ckan_package_search のページあたりの結果数 | 10 | 1,000 |
ckan_find_relevant_datasets の結果数 | 10 | 50 |
挿入された sparql_query の行数 | 25 | 挿入時は 1,000。クエリに独自の LIMIT が指定されている場合、上限は適用されません |
ckan_tag_list の結果数 | 100 | 1,000 |
ckan_find_portals の結果数 | 10 | 50 |
| HTTP レスポンス本文 | 32 MiB | ローカルの Node.js デプロイでは CKAN_MAX_RESPONSE_BYTES |
| 展開後のレスポンス本文 | 64 MiB | ローカルの Node.js デプロイでは CKAN_MAX_DECOMPRESSED_BYTES |
出力上限を超えたテキストと Markdown のレスポンスは切り詰められ、切り詰めたことを示す注記が含まれます。JSON レスポンスは解析可能な状態を保ちます。サーバーは既知の結果配列を縮小し、_truncated と _original_count を付けます。それでも収まらない場合は、_truncated と説明用の _error を含む小さなオブジェクトに置き換えます。両方のチャネルで同じ上限適用済みのペイロードが送信されるため、クライアントが structuredContent を読み取る場合も、切り詰めフラグを含め、テキストに表示される内容とまったく同じものを確認できます。完全な結果セットが必要な場合は、ページネーションを使うか、クエリの範囲を狭めてください。
🔌 お好みのツールで使用する
ChatGPT | Claude Desktop | Claude Code | Le Chat (Mistral) | Perplexity Pro | Gemini CLI | VS Code | Codex CLI
このサーバーは、MCP 対応のあらゆるクライアントで動作します。以下のセクションでは、よく使われているクライアントをいくつか紹介します。お使いのツールが一覧にない場合は、MCP の設定方法についてドキュメントを確認し、同じエンドポイント URL またはコマンドを使用してください。
以下の例は、ローカルインストールとホスト型エンドポイントの両方で動作します。両者で異なる場合は、両方の方法を記載しています。
ローカルにインストールして使用しますか? まずサーバーをインストールする必要があります。ローカルで実行するを参照してください。
ChatGPT
ChatGPT Plus、Team、または Enterprise プランが必要です。
- プロフィールメニューを開き、Settings → Apps → Advanced settings に移動します
- Developer mode を有効にします
- Create app(右上)をクリックします
- フォームに入力します:
- Name: CKAN MCP Server
- Description: CKAN オープンデータポータルのデータセットを検索
- MCP Server URL:
https://ckan-mcp-server.andy-pr.workers.dev/mcp - Authentication: No Auth
- 確認ボックスにチェックを入れてから、Create をクリックします
- 新しいチャットで + → More をクリックし、CKAN MCP Server を選択します
スクリーンショット付きの手順については、ChatGPT の完全ガイドを参照してください。
Claude Desktop
ホスト型エンドポイントを使用する(インストール不要)— コネクター UI を使用:
- Claude Desktop を開き、Settings → Integrations に移動します
- Add custom integration をクリックします
- 詳細を入力します:
- Name: CKAN MCP Server
- MCP Server URL:
https://ckan-mcp-server.andy-pr.workers.dev/mcp
- Add をクリックして保存します
- 新しいチャットを開き、+ をクリックして Integrations を選択し、CKAN MCP Server を有効にします
- Claude がツールの使用を確認してきたら、Allow(または Always allow)をクリックします
スクリーンショット付きの詳しい手順については、Claude の完全ガイドを参照してください。
ホスト型エンドポイントを使用する(インストール不要)— 設定ファイルを使用:
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"ckan": {
"url": "https://ckan-mcp-server.andy-pr.workers.dev/mcp"
}
}
}
ローカルインストールを使用:
{
"mcpServers": {
"ckan": {
"command": "npx",
"args": ["@aborruso/ckan-mcp-server@latest"]
}
}
}
Claude Code
ホストされたエンドポイントを使用する(インストール不要):
claude mcp add -s user -t http ckan https://ckan-mcp-server.andy-pr.workers.dev/mcp
ローカルインストールを使用する:
claude mcp add -s user ckan npx @aborruso/ckan-mcp-server@latest
--scope userを指定すると、現在のプロジェクトだけでなく、すべてのプロジェクトでサーバーをグローバルに利用できるようになります。
特定のプロジェクトでのみ利用するには、プロジェクトフォルダーから --scope user フラグを指定せずに実行します。
claude mcp add --transport http ckan https://ckan-mcp-server.andy-pr.workers.dev/mcp
Le Chat (Mistral)
- 左側のサイドバーで Intelligence をクリックし、Connectors を選択します
- + Add Connector をクリックします
- Custom MCP Connector タブを選択し、詳細を入力します。
- Name: CKAN
- Connector Server:
https://ckan-mcp-server.andy-pr.workers.dev/mcp
- Connect をクリックして保存します
- 新しいチャットを開き、+、Connectors の順にクリックして、CKAN を有効にします
スクリーンショット付きの手順については、Le Chat の完全ガイドをご覧ください。
Perplexity Pro
Perplexity Pro アカウントが必要です。
- メッセージ入力欄の「+」(添付)アイコンをクリックし、Connectors & sources を選択します
- Connect external app をクリックします
- 詳細を入力します。
- Name: CKAN MCP Server
- MCP Server URL:
https://ckan-mcp-server.andy-pr.workers.dev/mcp - Authorization Type: No Authentication
- Connection Type: HTTP Streamable
- 確認ボックスにチェックを入れ、Save をクリックします
- 新しいチャットで + → Connectors & sources をクリックし、ckan_mcp_server を有効にします
スクリーンショット付きの手順については、Perplexity の完全ガイドをご覧ください。
Gemini CLI
gemini mcp add -s user -t http ckan https://ckan-mcp-server.andy-pr.workers.dev/mcp
または、~/.gemini/settings.json に手動で追加します。
{
"mcpServers": {
"ckan": {
"httpUrl": "https://ckan-mcp-server.andy-pr.workers.dev/mcp"
}
}
}
VS Code
ユーザー設定または .vscode/settings.json に追加します。
ホストされたエンドポイントを使用する(インストール不要):
{
"mcpServers": {
"ckan": {
"url": "https://ckan-mcp-server.andy-pr.workers.dev/mcp",
"type": "http"
}
}
}
ローカルインストールを使用する:
{
"mcpServers": {
"ckan": {
"command": "npx",
"args": ["@aborruso/ckan-mcp-server@latest"]
}
}
}
Codex CLI
~/.codex/config.toml に追加します。
ホストされたエンドポイントを使用する(インストール不要):
[mcp_servers.ckan]
url = "https://ckan-mcp-server.andy-pr.workers.dev/mcp"
ローカルインストールを使用する:
[mcp_servers.ckan]
command = "npx"
args = ["-y", "@aborruso/ckan-mcp-server@latest"]
🖥️ ローカルで実行する
オプション 1 — npm でインストール
最も手軽な方法です。パッケージをグローバルにインストールすると、すぐにコマンドとして利用できます。
npm install -g @aborruso/ckan-mcp-server
サーバーは ckan-mcp-server として利用できます。また、インストールせずに次のコマンドで実行することもできます。
npx @aborruso/ckan-mcp-server@latest
オプション 2 — クローンしてビルド
開発時や、未リリースの最新コードを実行したい場合に適しています。
git clone https://github.com/ondata/ckan-mcp-server.git
cd ckan-mcp-server
npm install
npm run build
node dist/index.js
オプション 3 — Docker
@piersoft のおかげで、Docker を使ってサーバーを実行することもできます。
git clone https://github.com/ondata/ckan-mcp-server.git
cd ckan-mcp-server
docker compose up --build -d
MCP サーバーは http://localhost:3000/mcp で利用できます。Claude Desktop をコンテナに接続する方法など、詳しくは docker/README.md をご覧ください。
🛠️ 利用可能なツール
検索と発見
- ckan_package_search:Solr クエリでデータセットを検索します
- ckan_find_relevant_datasets:関連度スコアに基づいてデータセットをランク付けします
- ckan_package_show:データセットの詳細をすべて表示します
- ckan_tag_list:件数とともにタグを一覧表示します
組織
- ckan_organization_list:すべての組織を一覧表示します
- ckan_organization_show:組織の詳細を表示します
- ckan_organization_search:組織名で検索します
グループ
- ckan_group_list:グループを一覧表示します
- ckan_group_show:グループの詳細を表示します
- ckan_group_search:グループ名で検索します
DataStore
- ckan_datastore_search:表形式データをクエリします
- ckan_datastore_search_sql:DataStore に対して SQL クエリを実行します
品質指標
- ckan_get_mqa_quality:dati.gov.it のデータセットについて、MQA 品質スコア(方法論 v2、0~7.5 のスケールとバンド)と、スコアを最も向上させる不合格指標を取得します
- ckan_get_mqa_quality_details:dati.gov.it のデータセットについて、不合格となった MQA 指標をすべて FAIR の次元ごとに一覧表示します。DCAT-AP プロパティ、重み、向上幅も含まれます
ポータルの発見
- ckan_find_portals:国、言語、トピックで世界中の CKAN ポータルを検索します(datashades.info の約 950 件のポータルを収録したライブレジストリを使用)
カタログ分析
- ckan_analyze_datasets:データセットを検索し、クエリ可能なリソースの DataStore スキーマを調べます
- ckan_catalog_stats:ポータルの統計概要(合計数、カテゴリ別・形式別・組織別の内訳)
SPARQL
- sparql_query:任意の公開 SPARQL エンドポイントに対して SPARQL SELECT クエリを実行します
ユーティリティ
- ckan_status_show:サーバーの状態を確認します
📎 MCP リソーステンプレート
ckan:// URI スキームを使用してデータに直接アクセスできます。
ckan://{server}/dataset/{id}- データセットのメタデータckan://{server}/resource/{id}- リソースのメタデータとダウンロード URLckan://{server}/organization/{name}- 組織の詳細ckan://{server}/group/{name}/datasets- グループ(テーマ)別のデータセットckan://{server}/organization/{name}/datasets- 組織別のデータセットckan://{server}/tag/{name}/datasets- タグ別のデータセットckan://{server}/format/{format}/datasets- リソース形式(res_format + distribution_format)別のデータセット
例:
ckan://dati.gov.it/dataset/vaccini-covid
ckan://demo.ckan.org/resource/abc-123
ckan://data.gov/organization/sample-org
ckan://dati.gov.it/group/ambiente/datasets
ckan://dati.gov.it/organization/regione-toscana/datasets
ckan://dati.gov.it/tag/turismo/datasets
ckan://dati.gov.it/format/csv/datasets
💡 使用例
自然言語での会話
接続したら、自然な言葉で質問するだけです。クエリ構文は必要ありません。
「dati.gov.it でミラノの大気質に関するデータセットを検索し、それぞれに含まれる内容(対象期間、ライセンス、最適なダウンロード形式)を要約してください。」
サーバーは31件のデータセットを見つけ、構造のパターンごとに分類して、系列名、対象年、公開者、形式を含む分かりやすい要約を返します。CKAN の知識は必要ありません。
以下の例では、自然言語でのリクエストと、LLM が内部で生成して CKAN ポータルに送信する実際のツール呼び出しを示します。これらのクエリを自分で書く必要はありません。ここでは、質問が内部でどのように変換されるかを示すために掲載しています。
データセットを検索する(自然言語:「人口データセットを検索」)
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "popolazione",
rows: 20
})
長い OR クエリでテキストフィールドパーサーを強制する(自然言語:「ホテルまたは宿泊施設のデータセットを検索」)
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "hotel OR alberghi OR \"strutture ricettive\" OR ospitalità OR ricettività",
query_parser: "text",
rows: 0 // returns only the total count, no dataset records — useful to check how many results match before fetching them
})
注:query_parser: "text" を使用すると、クエリ内の Solr の特殊文字は自動的にエスケープされます。
関連度順にデータセットを並べる(自然言語:「都市モビリティに関する最も関連性の高いデータセットを検索」)
ckan_find_relevant_datasets({
server_url: "https://www.dati.gov.it/opendata",
query: "mobilità urbana",
limit: 5
})
組織で絞り込む(自然言語:「トスカーナ州の最近のデータセットを表示」)
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
fq: "organization:regione-toscana",
sort: "metadata_modified desc"
})
ファセットで統計を取得する(自然言語:「組織、タグ、形式別の統計を表示」)
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
facet_field: ["organization", "tags", "res_format"],
rows: 0 // skip dataset records, return only the facet counts
})
タグを一覧表示する(自然言語:「健康に関する上位のタグを表示」)
ckan_tag_list({
server_url: "https://www.dati.gov.it/opendata",
tag_query: "salute",
limit: 25
})
グループを検索する(自然言語:「環境に関するグループを検索」)
ckan_group_search({
server_url: "https://www.dati.gov.it/opendata",
pattern: "ambiente"
})
DataStore クエリ(自然言語:「地域と年で絞り込んだ表形式データをクエリ」)
DataStore とは? CKAN DataStore は、表形式のリソース(CSV、Excel)をクエリ可能なデータベースにインポートするオプションの拡張機能です。ファイルをダウンロードせずに、データを直接絞り込み、並べ替え、フィールドを選択できます。すべてのポータルで有効になっているわけではなく、ポータルが対応していても、すべてのデータセットが DataStore を使用しているわけではありません。利用可能かどうかは、リソースの
datastore_active: trueを確認してください。
// Ordinanze viabili del Comune di Messina — resource with datastore_active: true
ckan_datastore_search({
server_url: "https://dati.comune.messina.it",
resource_id: "17301b8b-2a5b-425f-80b0-5b75bb1793e9",
filters: { "tipo": "lavori" },
sort: "data_pubblicazione desc",
limit: 10
})
👏 Comune di Messina と、DataStore 拡張機能を有効にしているすべての行政機関に感謝します。これにより、AI ツールを通じて利用する場合も含め、データのクエリや探索が格段に簡単になります。
DataStore SQL クエリ(自然言語:「道路工事の届出を種類別に集計」)
// Count ordinanze viabili by tipo — Comune di Messina
ckan_datastore_search_sql({
server_url: "https://dati.comune.messina.it",
sql: "SELECT tipo, COUNT(*) AS total FROM \"17301b8b-2a5b-425f-80b0-5b75bb1793e9\" GROUP BY tipo ORDER BY total DESC LIMIT 5"
})
🧠 複数ステップのクエリをよりスマートに実行するAIスキル
MCP サーバーは基本的なツールを提供し、スキルはそれらを賢く使う方法をAI アシスタントに教えます。
AI アシスタントは、初期状態では各ツールの使い方を個別に把握しています。スキルを導入すると、より高度な推論が可能になります。特定の国ではどのポータルに問い合わせるべきか、ポータルに接続できないときはどうするか、European open data portalにフォールバックする方法、実際に結果が返ってくるクエリの作り方などを判断できます。
スキルで追加される機能:
- 国別ルーティング — その国で最も信頼できるCKANポータルを自動的に特定します(国 > 地域 > 地方)
- フォールバックチェーン — ポータルに接続できない場合や、結果が0件の場合は、代替ポータルを試します。ヨーロッパの国については、正しい国フィルターを指定して
data.europa.euにフォールバックします - クエリの作成 — バイリンガルクエリ、パーサーの選択、
fq構文、ワイルドカードの処理 - 正しいAPIパターン — European portal(
data.europa.eu)では、ドキュメントに記載がなく、間違えやすい特定のfacets+facetOperator+facetGroupOperatorパラメーターが必要です。スキルはこれを正しく設定します
このスキルでできることの例:
"Find road accident data in Portugal"
→ ckan_find_portals(country="Portugal") # finds 3 regional portals
→ ckan_package_search on each → 0 results
→ [tells user] "No results on Portuguese CKAN portals. Trying data.europa.eu..."
→ curl "https://data.europa.eu/api/hub/search/search?q=acidentes+rodoviarios
&facetOperator=AND&facetGroupOperator=AND&facets={"country":["pt"]}"
→ 157 datasets found — reported with source and filter details
"Find French open data about energy"
→ [knows data.gouv.fr is NOT CKAN — redirects to data.europa.eu]
→ curl "...?q=energie+energy&facets={"country":["fr"]}..."
→ Results filtered strictly to France
スキルのインストール
このリポジトリのskills/ckan-mcp/にスキルフォルダーがあり、skills.shにも掲載されています。Skills CLIを使ってインストールします。
# Install globally (available in all your projects)
npx skills add -g ondata/ckan-mcp-server --skill ckan-mcp
# Or for a single project (run from your project folder)
npx skills add ondata/ckan-mcp-server --skill ckan-mcp
🌍 対応しているCKANポータル
対応しているポータルの例:
- 🇮🇹 https://www.dati.gov.it/opendata - イタリア国立オープンデータポータル(CKAN 2.10.3)
- 🇨🇦 https://open.canada.ca/data - カナダ政府オープンデータ(CKAN 2.10.8)
- 🇦🇺 https://data.gov.au - オーストラリア政府オープンデータ(CKAN 2.11.4)
- 🇬🇧 https://data.gov.uk - 英国オープンデータ
- 世界中の他の多くのポータル
catalog.data.govは、現在CKANではありません。 Data.govは2025年にカタログを別のAPIに置き換えました(詳細)。現在このポータルに問い合わせると、単に404を返すのではなく、その旨を説明します。
世界中のCKANポータルを検索
Datashades.info/portalsは、世界中の約950のCKANポータルを登録した最新のレジストリを提供しています。バージョン、プラグイン、データセット数、地理座標のメタデータを確認できます。この情報を教えてくれたSara Pettiに感謝します。
**ckan_find_portals**ツールは、このレジストリに直接問い合わせます。国、言語、最小データセット数、DataStoreの有無で絞り込めます。
ckan_find_portals({ country: "Italy", has_datastore: true, limit: 5 })
ckan_find_portals({ language: "fr", min_datasets: 500 })
ckan_find_portals({ query: "transport" })
ポータルデータは公開JSON APIからも利用できます。認証は不要です。
| エンドポイント | 説明 |
|---|---|
GET https://datashades.info/api/portal/list | CKANのバージョン、プラグイン、データセット/リソース/組織の件数、国の座標を含むポータルの全一覧 |
GET https://datashades.info/api/portal/stats | 監視対象のすべてのポータルの集計統計 |
GET https://datashades.info/api/portal/historical/stats | 監視対象のポータルの過去の推移データ |
🔍 高度なSolrクエリ
CKANはデフォルトの検索エンジンとしてApache Solrを使用しています。Solr構文を理解すると、単純なキーワードから複雑なブール式、あいまい検索、近接検索、日付計算まで、データセット検索の能力を最大限に活用できます。
基本構文
# Basic search
q: "popolazione"
# Field search
q: "title:popolazione"
q: "notes:sanità"
# Boolean operators
q: "popolazione AND sicilia"
q: "popolazione OR abitanti"
q: "popolazione NOT censimento"
# Filters (fq) — single value
fq: "organization:comune-palermo"
fq: "tags:sanità"
fq: "res_format:CSV"
# Filters (fq) — OR on same field: use field:(val1 OR val2)
fq: "res_format:(CSV OR JSON)"
fq: "organization:(comune-palermo OR comune-roma)"
# ⚠️ Wrong OR syntax — silently ignored, returns entire catalog:
# fq: "res_format:CSV OR res_format:JSON" ← DO NOT USE
# Filters on CKAN extras fields — use extras_ prefix
fq: "extras_hvd_category:\"http://data.europa.eu/bna/c_ac64a52d\""
fq: "extras_hvd_category:(\"http://data.europa.eu/bna/c_ac64a52d\" OR \"http://data.europa.eu/bna/c_dd313021\")"
# Wildcard
q: "popolaz*"
# Date range
fq: "metadata_modified:[2023-01-01T00:00:00Z TO *]"
高度なクエリの例
以下の実例は、イタリアのオープンデータポータル(dati.gov.it)でテストした、強力なSolrクエリの組み合わせを示しています。
1. あいまい検索+日付計算+ブースト(自然言語:「過去6か月以内に更新された医療関連データセットを検索」)
スペルミスを許容しながら、過去6か月以内に更新された医療関連データセットを検索し、タイトルとの一致を優先します。
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "(title:sanità~2^3 OR title:salute~2^3 OR notes:sanità~1) AND metadata_modified:[NOW-6MONTHS TO *]",
sort: "score desc, metadata_modified desc",
rows: 30
})
使用されている手法:
sanità~2- 編集距離2のあいまい検索(「sanita」「sanitá」や軽微なタイプミスを検出)^3- 関連性スコアでタイトルとの一致を3倍優先NOW-6MONTHS- 移動期間のための日付計算- 複数のフィールド検索を組み合わせたブール論理
結果:病院の部門、医療機関、医療サービスを含む949件のデータセット
2. 近接検索+複雑なブール論理(自然言語:「水関連を除き、大気汚染のデータセットを検索」)
「inquinamento」と「aria」(大気汚染)が近接して出現し、水関連のデータセットを除外した環境データセットを検索します。
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "(notes:\"inquinamento aria\"~5 OR title:\"qualità aria\"~3) AND NOT (title:acqua OR title:mare)",
facet_field: ["organization", "res_format"],
rows: 25
})
使用されている手法:
"inquinamento aria"~5- 近接検索(5語以内)~3- タイトルとの一致には、より狭い近接範囲を適用NOT (title:acqua OR title:mare)- 水/海に関するデータセットを除外- 統計的な内訳を表示するファセット
結果:305件のデータセット
3. ワイルドカード+フィールドの存在確認+日付計算(自然言語:「先月の、いずれかの形式の地域データセット」)
少なくとも1つのリソース形式が宣言されている、先月公開された地域データセットを検索します。
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "organization:regione* AND metadata_created:[NOW-1MONTH TO *] AND res_format:*",
sort: "metadata_modified desc",
facet_field: ["organization"],
rows: 10
})
使用されている手法:
regione*- すべての地域組織に一致するワイルドカードres_format:*- フィールドの存在確認(少なくとも1つのリソース形式が宣言されている)NOW-1MONTH- 過去30日間の移動期間
結果:293件のデータセット
4. 明示的な日付範囲+ファセット(自然言語:「2025年に更新された労働省のデータセット」)
イタリア労働省の2025年中に更新されたデータセットを検索し、形式とタグでファセットを表示します。
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "organization:ministero-del-lavoro AND metadata_modified:[2025-01-01T00:00:00Z TO 2025-12-31T23:59:59Z]",
sort: "metadata_modified desc",
facet_field: ["res_format", "tags"],
rows: 10
})
使用されている手法:
[2025-01-01T00:00:00Z TO 2025-12-31T23:59:59Z]- 明示的な日付範囲(1年間)organization:ministero-del-lavoro- 特定の組織で絞り込み- 形式とトピックの内訳を示す複数のファセット
結果:83件のデータセット
Solr クエリ構文リファレンス
ブール演算子:AND、OR、NOT、+required、-excluded
ワイルドカード:*(複数文字)、?(1文字)— 左側の切り詰めには対応していません
あいまい検索:~N(編集距離)、例:health~2
近接検索:"phrase"~N(N語以内)
ブースト:^N(関連性の倍率)、例:title:water^2
範囲:
- 両端を含む:
[a TO b]、例:num_resources:[5 TO 10] - 両端を含まない:
{a TO b}、例:num_resources:{0 TO 100} - 上限または下限なし:
[2024-01-01T00:00:00Z TO *]
日付計算:NOW、NOW-1YEAR、NOW-6MONTHS、NOW-7DAYS、NOW/DAY
フィールドの存在確認:field:*(フィールドが存在)、NOT field:*(フィールドが存在しない)
📅 日付フィールドについて
CKAN ポータルには、組織がデータを直接公開する「ソース」カタログと、ほかの多数のポータルからデータを収集する「ハーベスティングアグリゲーター」があります。日付でフィルタリングする際は、この違いが重要です。
| フィールド | ソースポータルでの意味 | アグリゲーターでの意味 |
|---|---|---|
issued | 公開者がデータセットを公開した日時 | 公開者がデータセットを公開した日時 |
metadata_created | レコードが初めて作成された日時 | レコードが初めてハーベスティングされた日時 |
metadata_modified | レコードが最後に更新された日時 | レコードが最後に再ハーベスティングされた日時 |
dati.gov.it のようなアグリゲーターでは、データセットの内容が変更されていなくても、ポータルが再ハーベスティングするたびに metadata_modified が更新されます。そのため、「最近更新されたコンテンツ」を見つける用途には適していません。
例 — dati.gov.it(アグリゲーター)における同一データセットの3つの異なるタイムスタンプ:
{
"issued": "2024-12-10",
"metadata_created": "2024-12-16",
"metadata_modified": "2026-02-28"
}
metadata_modifiedが2026年2月になっているのは、その時点でポータルが再ハーベスティングしたためであり、データが変更されたためではありません。
dati.gov.it でフィルタリングできる日付フィールドはどれですか?
3つすべてのフィールドが Solr にインデックス化されており、クエリで使用できます。
| フィールド | Solr にインデックス化済み | クエリで取得される内容 |
|---|---|---|
issued | ✅ | 公開者の公開日別のデータセット — 最も意味のあるフィールドですが、約14%のデータセットにはありません |
metadata_created | ✅ | dati.gov.it での初回ハーベスティング日別のデータセット |
metadata_modified | ✅ | 最終再ハーベスティング日別のデータセット — ノイズが多いことがあります |
クエリの例(dati.gov.it):
# Datasets about road accidents published by the original source in 2025
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "incidenti stradali",
fq: "issued:[2025-01-01T00:00:00Z TO 2025-12-31T23:59:59Z]"
})
// → ~121 results (only datasets where publisher filled in `issued`)
# Datasets first appearing on dati.gov.it in 2025
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "incidenti stradali",
fq: "metadata_created:[2025-01-01T00:00:00Z TO 2025-12-31T23:59:59Z]"
})
// → ~164 results (includes older datasets harvested for the first time in 2025)
issuedのカバー率に関する注意:dati.gov.it の69,000件を超えるデータセットのうち、約59,700件にissuedが設定されています。issuedを使ったクエリは正確ですが、網羅的ではありません。このフィールドがないデータセットは、通知なく除外されます。コンテンツの日付をクエリする場合はissuedを優先し、「ポータルにいつ掲載されたか」を調べる場合に限り、代替としてmetadata_createdを使用してください。
推奨:公開日でデータセットを探すには issued を使用してください。最近ポータルに掲載されたデータセットを探すには metadata_created を使用してください。
👩💻 開発者向けリファレンス
プロジェクト構成
ckan-mcp-server/
├── src/
│ ├── index.ts # Entry point
│ ├── server.ts # MCP server setup
│ ├── worker.ts # Cloudflare Workers entry
│ ├── types.ts # Types & schemas
│ ├── utils/
│ │ ├── http.ts # CKAN API client
│ │ ├── formatting.ts # Output formatting
│ │ └── url-generator.ts
│ ├── tools/
│ │ ├── package.ts # Package search/show
│ │ ├── organization.ts # Organization tools
│ │ ├── datastore.ts # DataStore queries
│ │ ├── status.ts # Server status
│ │ ├── tag.ts # Tag tools
│ │ └── group.ts # Group tools
│ ├── resources/ # MCP Resource Templates
│ │ ├── index.ts
│ │ ├── uri.ts
│ │ ├── dataset.ts
│ │ ├── resource.ts
│ │ └── organization.ts
│ ├── prompts/ # MCP Guided Prompts
│ │ ├── index.ts
│ │ ├── theme.ts
│ │ ├── organization.ts
│ │ ├── format.ts
│ │ ├── recent.ts
│ │ └── dataset-analysis.ts
│ └── transport/
│ ├── stdio.ts
│ └── http.ts
├── tests/ # Test suite
├── dist/ # Compiled output (generated)
├── package.json
└── README.md
ビルドとテスト
# Build (esbuild, ~4ms)
npm run build
# Watch mode
npm run watch
# Run all tests
npm test
# Watch mode for tests
npm run test:watch
# Coverage report
npm run test:coverage
MCP Inspector で確認する
MCP Inspector を使用すると、ウェブ UI でツールを参照し、呼び出しを対話的にテストして、レスポンスをデバッグできます。
npm install -g @modelcontextprotocol/inspector
npm run build
npx @modelcontextprotocol/inspector node dist/index.js
http://localhost:5173 で開きます。
セキュリティ:HTTP トランスポートにはドメインの許可リストが必要です
HTTP トランスポート(TRANSPORT=http)は認証されていません。POST /mcp にアクセスできるクライアントは、誰でもこのトランスポート経由でリクエストを実行できます。v0.4.109 以降、デフォルトで 127.0.0.1
(ループバック)にバインドされ、DNS リバインディング保護が適用されるため、LAN 上には公開されず、クロスオリジンのブラウザーリクエストは拒否されます。SSRF の悪用(たとえば、呼び出し元が server_url に内部ホストやクラウドメタデータを指定すること)を防ぐため、ドメインの許可リストを設定しないと起動しません。
| 変数 | 効果 |
|---|---|
CKAN_ALLOWED_DOMAINS | サーバーがクエリできるホスト名のカンマ区切りの許可リスト(デフォルトではすべて拒否)。HTTP トランスポートの起動に必須です。ホスト名の完全一致のみが対象で、ワイルドカードやサブドメインは使えません。リダイレクト先にも適用されます。ポータルが別のホストにリダイレクトする場合は、そのホストもリストに追加してください。例:CKAN_ALLOWED_DOMAINS="www.dati.gov.it,dati.comune.messina.it" |
CKAN_HTTP_ALLOW_ALL=true | 明示的なオプトアウト:許可リストなしで HTTP トランスポートを起動します(セキュリティ警告がログに記録されます)。ネットワークに公開する場合は推奨されません。 |
CKAN_HTTP_HOST | バインドするインターフェース(デフォルトは 127.0.0.1)。公開するには 0.0.0.0 を設定します。できれば認証機能を備えたリバースプロキシの背後に配置してください。 |
CKAN_HTTP_ALLOWED_HOSTS | DNS リバインディングガードで許可する追加の Host ヘッダー値(カンマ区切り)。ループバック以外にバインドする場合は、公開ホスト名を追加してください。 |
CKAN_HTTP_ALLOWED_ORIGINS | ブラウザークライアントに許可する Origin ヘッダー値(カンマ区切り)。 |
デフォルトの stdio トランスポートには影響しません。ローカルからは引き続き、任意のポータルにクエリできます。許可リストの設定にかかわらず、すべてのリクエストはプライベート/内部 IP 範囲に対しても検証されます。これには、内部アドレスに名前解決されるホスト名も含まれます(DNS ベースの SSRF。v0.4.108 で修正)。公式の Cloudflare Worker はプラットフォームによってサンドボックス化されているため、この設定は不要です。
HTTP の手動テスト
# Start server (HTTP needs an allowlist — see "Security" above)
CKAN_ALLOWED_DOMAINS="www.dati.gov.it" TRANSPORT=http PORT=3001 node dist/index.js
# List available tools
curl -s -X POST http://localhost:3001/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
# Call a tool
curl -s -X POST http://localhost:3001/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc":"2.0","method":"tools/call",
"params":{"name":"ckan_package_search","arguments":{"server_url":"https://www.dati.gov.it/opendata","q":"ambiente","rows":3}},
"id":1
}' | jq -r '.result.content[0].text'
ポータルの表示 URL テンプレート
CKAN ポータルによっては、データセットや組織の表示に標準とは異なる Web URL を使用します。こうしたケースに対応するため、このプロジェクトには既知のポータル API URL(およびエイリアス)とカスタム表示 URL テンプレートを対応付ける src/portals.json が含まれています。
データセットまたは組織の表示リンクを生成する際、サーバーは次の処理を行います。
server_urlをsrc/portals.jsonのapi_urlおよびapi_url_aliasesと照合します- 利用可能な場合、ポータル固有の
dataset_view_url/organization_view_urlテンプレートを使用します - 該当するテンプレートがない場合は、汎用のデフォルト(
{server_url}/dataset/{name}および{server_url}/organization/{name})を使用します
トラブルシューティング
イタリアのポータルで URL が間違っている — https://www.dati.gov.it/opendata を使用してください(https://dati.gov.it ではありません)。
接続エラー
Error: Server not found: https://example.gov
URL にアクセスできることを確認し、ckan_status_show を使用してポータルが応答していることを確認してください。
結果がない — クエリの範囲を広げるか、ファセットを使って利用可能なデータを確認してください。
ckan_package_search({
server_url: "https://www.dati.gov.it/opendata",
q: "*:*",
facet_field: ["tags", "organization"],
rows: 0
})
結果が見つからない場合に LLM が外部データを使用する — ツールが結果を返さない場合、一部の LLM(例:ChatGPT)は警告なしに、学習データの情報で回答を補うことがあります。これは既知の LLM の動作であり、サーバーの問題ではありません。これを避けるには、MCP ツールが返したデータのみを使用し、外部ソースに頼らないよう、システムプロンプトでモデルに指示してください。
🆘 サポート
問題や質問がある場合は、GitHub で issue を作成してください。
プライバシーポリシー
このサーバーは個人データを収集しません。読み取り専用でステートレスです。クエリは指定した公開 CKAN API に直接転送され、データが保存またはログに記録されることはありません。
プライバシーポリシー全文をご覧ください。
関連ツール
- opensituas — コマンドラインから、イタリアのすべての地域単位のコードと履歴を確認できます。あらゆる ISTAT データセットを結合するためのキーです。
- opensdmx — Eurostat、ISTAT、OECD、その他の SDMX プロバイダーによる公式統計を取得できます。幻覚はなく、公開された数値のみを扱います。
- ISTAT MCP Server — MCP プロトコルを通じて、イタリアの統計データを AI アシスタントで直接利用できます。
🔗 便利なリンク
- CKAN — ほとんどの公共オープンデータポータルを支えるオープンソースプラットフォーム
- CKAN API Documentation — CKAN API v3 の完全なリファレンス
- DCAT Vocabulary (W3C) — CKAN ポータルがデータセットの説明に使用するメタデータ標準
- MCP Protocol — Model Context Protocol の仕様
オープンデータコミュニティのために、onData が ❤️ を込めて作成しました
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。