API reference

APIリファレンス

すべてのエンドポイントの説明・パラメータ・例と、本番の実際の応答(抜粋)です。ベースURLは https://michiyomi.dev、キーは要りません。

openapi.yaml(OpenAPI 3.1)から生成し、応答例は 2026-10-03 に本番から取りました(release 2026-09-13-r1)。英語の定義は English。

基本

ベースURL
https://michiyomi.dev
認証
ありません。登録・APIキーも要りません。
メソッド
読み取りだけです。GET のほかは、座標を本文で送る POST /amenities/search と POST /mcp だけ。/v1 への書き込み系のメソッドは 405 です。
形式
JSON(UTF-8)。観測の文章は日本語です(data_language: "ja")。
回数の上限
IP アドレスごとに REST は60秒あたり300回、MCP は120回。超えると 429 と retry-after: 60。
CORS
すべてのオリジンに開いています(access-control-allow-origin: *)。
ID
写真のID(Mapillary の image ID)は文字列のまま扱ってください。数値にすると桁が落ちることがあります。
0件
0件でも 200 で返り、多くは note に理由が入ります。「何もない」ではなく「収録がない」という意味です。
ページ送り
ありません。近くを引くのは1回50件までで、広い範囲は中心や半径を変えて引きます。

共通の項目

/v1 の成功した応答には、次の項目が共通して入ります。下の各エンドポイントの例では省いています。

フィールド型説明
api_version"v1"
data_languagestring観測の文章の言語。いまは常に "ja"(OpenAPI 定義には未記載)
snapshotstring | null公開(なければstaged)最新リリースの release_id
request_idstring(uuid)crypto.randomUUID()。全応答とログに載る。
data_as_ofstring | null
quality_policyobject
licenseobject応答の中身の層ごとの条件。製品(シーン系・通りと辺・町丁目・学校)で値が変わる。説明は https://michiyomi.dev/docs/license/
notestring正直性のための注記(experimental混入・0件・被覆不足・データ不整合など)。「0件だから変化が無かった」という断定は行わない。
warningsstring[]受理したが無視した旧パラメータなど
GET /v1/meta の応答の先頭そのまま開く ↗
{
  "api_version": "v1",
  "data_language": "ja",
  "snapshot": "2026-09-13-r1",
  "request_id": "b44f51c0-382e-445b-9013-a3f9e7ed500e",
  "data_as_of": "2026-09-13",
  "quality_policy": { "requested": "released", "generation": null, "experimental_included": false },
  "license": {
    "schema_version": 2,
    "id": "LicenseRef-michiyomi-layered",
    "url": "https://michiyomi.dev/docs/license/",
    "policy_version": "2026-10-03",
    "summary": "観測データ(本文・構造化JSON・機械層の値・経年変化)は CC BY 4.0 で使えます。AIの回答・分析・アプリの表示・個別の転記には、出典もロゴも要りません。データとして配り直すとき(ファイル・データベース・第三者向けの API など…",
    "summary_en": "Observation data (text, structured JSON, machine features, changes) is available under CC BY 4.0. No credit or logo is n…",
    "obligations": {
      "use_in_results": ["none"],
      "display_or_quote_records": ["none"],
      "redistribute_as_data": ["attribution", "upstream_not_licensed_if_bulk", "source_notice_if_bulk"]
    },
    "notices": [
      "mapillary_reference_not_licensed",
      "photos_not_included",
      … ほか 4 件
    ],
    "layers": {
      "observation": "CC-BY-4.0",
      "mapillary_reference": "NOASSERTION",
      "public_sector": "CC-BY-4.0"
    },
    "linked_only": { "photo": "CC-BY-SA-4.0" },
    "attribution": "出典: みちよみ(michiyomi.dev、Mapillary の街路写真より)、CC BY 4.0(https://creativecommons.org/licenses/by/4.0/)",
    "attribution_en": "Source: michiyomi (michiyomi.dev), from Mapillary street-level photos, CC BY 4.0 (https://creativecommons.org/licenses/b…",
    … ほか 8 項目
  }
}

エラー

4xx・5xx は共通の形の JSON を返します。パラメータが原因のときは field で対象が分かります。内部のパスや SQL は返しません。

codeHTTP意味
invalid_parameter400パラメータが不正(範囲外・未知の値・数でない文字列など)
not_found404対象が無い
method_not_allowed405読み取り専用のため、そのメソッドは使えない
payload_too_large413本文が大きすぎる(/mcp は64KB、/amenities/search は2048バイトまで)
rate_limited429回数の上限を超えた。retry-after 秒待つ
internal500サーバー側の問題。request_id を添えて問い合わせてください
実際のエラーの例: lat=135 を送ったとき · HTTP 400
{
  "error": {
    "code": "invalid_parameter",
    "message": "lat must be between -90 and 90",
    "request_id": "3c3760d3-c98e-4c66-bf6b-de444f8af988",
    "field": "lat"
  }
}

場所の様子(写真1枚ずつ)

写真1枚(シーン)ごとのAIの読み取りです。まず coverage で収録を確かめ、scenes/nearby で近くの写真を引き、scenes/{id} で全文を読みます。

GET/v1/coverage

地点の被覆申告(正直性ツール)

キャッシュ public, max-age=60

「この地点にどれだけ根拠があるか」を返す。0件は0件として返し、収録の欠如を現地の状態の否定にすり替えない。

scenes_by_year / scenes_by_generation / scenes_total は指定 quality で畳んだ結果。 released_count / experimental_count は品質ポリシーに関わらず「この半径に実在する言語化」の実数。n_changes は status='supported' のみ。すべて quarantine 除外。 year_from / year_to はシーンの撮影年だけを絞る。n_changes は全年の件数であり、変化の期間を絞るには /v1/changes/nearby の年パラメータを使う。

OpenAPI 定義との違い(2026-10-03 に本番で確認)
openapi.yaml では year_from・year_to の下限が2000ですが、本番は1970から受け付けます。

パラメータ

名前場所型説明
lat必須クエリnumber緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90
lon必須クエリnumber経度(WGS84)範囲 -180〜180
radius_mクエリinteger既定 300 ・ 範囲 1〜1000
qualityクエリstring言語化世代の品質ポリシー。
  • released(既定): status='released' の世代のみ。地点ごとに version 最大
  • include_experimental: released(version降順) → experimental(version降順) の優先で地点ごとに1つ
  • experimental_only: experimental のみ
既定 "released" ・ 値 released include_experimental experimental_only
generationクエリstring世代IDを明示指定(quality より優先。存在しないIDは400)。最大 64字
year_fromクエリinteger範囲 1970〜2100
year_toクエリintegeryear_from <= year_to でなければ400範囲 1970〜2100

互換のため受け付ける旧パラメータ(非推奨): radius(旧パラメータ。radius_m の alias(両方あれば radius_m が優先))

例

curl "https://michiyomi.dev/v1/coverage?lat=35.6717&lon=139.7647"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "query": {
    "lat": 35.6717,
    "lon": 139.7647,
    "radius_m": 300,
    "year_from": null,
    "year_to": null
  },
  "scenes_total": 2312,
  "scenes_by_year": {
    "2010": 2,
    "2013": 4,
    "2015": 25,
    "2016": 324,
    "2017": 321,
    "2018": 581,
    "2019": 324,
    "2020": 51,
    "2022": 125,
    "2023": 206,
    "2024": 89,
    "2025": 67,
    "2026": 193
  },
  "scenes_by_generation": { "gen2-qwen-local": 1429, "gen1-codex": 883 },
  "released_count": 2312,
  "experimental_count": 0,
  "latest_year": 2026,
  "n_changes": 5,
  "candidate_truncated": false,
  "counting_notes": {
    "released_count": "この半径に released世代の言語化を持つシーン数(品質ポリシーに関わらず実数)",
    "experimental_count": "この半径に experimental世代の言語化を持つシーン数(同上)",
    "n_changes": "status='supported' の経年変化を全年で数えた件数(year_from/year_toはシーンの撮影年にのみ適用)",
    "quarantine": "この地点クエリは capture_time_quality異常(quarantined=1)のシーンを全ての集計から除外している(/v1/meta のリ…"
  }
}
応答のフィールド
フィールド型説明
queryobject
scenes_totalinteger
scenes_by_yearobject<integer>キーは撮影年、または撮影年不明を表す "unknown"
scenes_by_generationobject<integer>
released_countinteger
experimental_countinteger
latest_yearinteger | null
n_changesinteger
candidate_truncatedboolean
counting_notesobject<string>
ステータスコード
  • 200 OK
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。

GET/v1/scenes/nearby

近傍シーン検索

別名 /v1/nearbyキャッシュ public, max-age=60

cell の y帯を検索中心の緯度に近い順に1帯ずつ取得し、Haversineで正確な円形フィルタをかける。順序は 丸め前のHaversine実距離 ASC → 実距離同値時 capture_year DESC → id ASC。 distance_m はレスポンス表示用にのみ整数化する。

候補が上限(帯内8000/累積8000)に達した場合は candidate_truncated=true。打ち切られるのは常に検索中心から遠い帯なので、密集地でも真の最近傍は失われない。 quarantined=1 のシーンは返らない。

OpenAPI 定義との違い(2026-10-03 に本番で確認)
openapi.yaml では year_from・year_to の下限が2000ですが、本番は1970から受け付けます。

パラメータ

名前場所型説明
lat必須クエリnumber緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90
lon必須クエリnumber経度(WGS84)範囲 -180〜180
radius_mクエリinteger検索半径(m)。整数のみ。既定 150 ・ 範囲 1〜1000
limitクエリinteger返す件数。scenes既定10 / changes既定20。範囲 1〜50
qualityクエリstring言語化世代の品質ポリシー。
  • released(既定): status='released' の世代のみ。地点ごとに version 最大
  • include_experimental: released(version降順) → experimental(version降順) の優先で地点ごとに1つ
  • experimental_only: experimental のみ
既定 "released" ・ 値 released include_experimental experimental_only
generationクエリstring世代IDを明示指定(quality より優先。存在しないIDは400)。最大 64字
year_fromクエリinteger範囲 1970〜2100
year_toクエリintegeryear_from <= year_to でなければ400範囲 1970〜2100

互換のため受け付ける旧パラメータ(非推奨): radius(旧パラメータ。radius_m の alias(両方あれば radius_m が優先)) ・ gen(旧パラメータ。generation の alias) ・ era(旧パラメータ。受理するが結果には影響しない。) ・ min_score(旧パラメータ。era と同様、受理するが結果には影響しない)

例

curl "https://michiyomi.dev/v1/scenes/nearby?lat=35.6717&lon=139.7647&radius_m=150&limit=2"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "query": {
    "lat": 35.6717,
    "lon": 139.7647,
    "radius_m": 150,
    "limit": 2,
    "year_from": null,
    "year_to": null
  },
  "count": 2,
  "results": [
    {
      "id": "964535250779795",
      "distance_m": 3,
      "capture_year": 2019,
      "ward": "中央区",
      "view_class": "全方位(パノラマ)",
      "generation": { "id": "gen1-codex", "status": "released", "version": 1 },
      "model": "gpt-5.6-sol",
      "summary": "施設: 一般道路 / 歩道: 左=あり(分離歩道,5m), 右=あり(分離歩道,4m), 有効幅約4m, 点字ブロックあり, 車道幅約12m / 舗装:…",
      "image_page": "https://www.mapillary.com/app/?pKey=964535250779795",
      … ほか 8 項目
    },
    {
      "id": "328331618839370",
      "distance_m": 4,
      "capture_year": 2018,
      "ward": "中央区",
      "view_class": "前方視",
      "generation": { "id": "gen1-codex", "status": "released", "version": 1 },
      "model": "gpt-5.6-terra",
      "summary": "施設: 一般道路 / 歩道: 左=あり(分離歩道,3m), 右=あり(分離歩道,4m), 有効幅約2.5m, 車道幅約10.5m / 舗装: アスファル…",
      "image_page": "https://www.mapillary.com/app/?pKey=328331618839370",
      … ほか 8 項目
    }
  ],
  "candidate_truncated": false
}
応答のフィールド
フィールド型説明
queryobject
query.latnumber
query.lonnumber
query.radius_minteger
query.limitinteger
query.year_frominteger | null
query.year_tointeger | null
countinteger
resultsobject[]
results[].idstringMapillary image ID。number に変換しないこと。
results[].distance_minteger
results[].latnumber
results[].lonnumber
results[].position_sourcestring代表座標の出所。computed は Mapillary の推定補正位置、raw は GPS生値。値 mapillary_computed mapillary_raw
results[].capture_yearinteger | null
results[].yearinteger | nullcapture_year の別名(MCP/旧クライアント互換)
results[].wardstring | null
results[].view_classstring | null
results[].travel_bearingnumber | null
results[].is_panoboolean | null
results[].generationobject
results[].modelstring | null
results[].prompt_versionstring | null
results[].summarystring
results[].analysis_statusstring値 ok invalid
results[].image_pagestring(uri)
candidate_truncatedboolean
ステータスコード
  • 200 OK(0件でも200)
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

GET/v1/scenes/{id}

シーン詳細

別名 /v1/node/{id}キャッシュ public, max-age=86400

include 省略時は analysis(旧 /v1/node/{id} 互換)。

  • 指定 quality に該当する言語化が無い場合も 200 を返し、verbalization: null + note + available_generations で状況を開示する(自動フォールバックはしない)。
  • analysis が壊れている場合は 500 にせず analysis: null / analysis_status: "invalid"。
  • quarantined なシーンもIDの直接参照なら 200 で返る(capture_time_quality と note 付き)。

パラメータ

名前場所型説明
id必須パスstringMapillary image ID(string)
includeクエリstring追加取得する層のカンマ区切り。未知値・空文字は400。既定 "analysis" ・ 例 analysis metadata,machine,analysis
qualityクエリstring言語化世代の品質ポリシー。
  • released(既定): status='released' の世代のみ。地点ごとに version 最大
  • include_experimental: released(version降順) → experimental(version降順) の優先で地点ごとに1つ
  • experimental_only: experimental のみ
既定 "released" ・ 値 released include_experimental experimental_only
generationクエリstring世代IDを明示指定(quality より優先。存在しないIDは400)。最大 64字

互換のため受け付ける旧パラメータ(非推奨): gen(旧パラメータ。generation の alias)

例

curl "https://michiyomi.dev/v1/scenes/1499911054492109?include=metadata,machine,analysis"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "scene": {
    "id": "1499911054492109",
    "lat": 35.688942434653,
    "lon": 139.72195407201,
    "position_source": "mapillary_computed",
    "capture_year": 2025,
    "capture_time_quality": "ok",
    "ward": "新宿区",
    "quarantined": false
  },
  "image_page": "https://www.mapillary.com/app/?pKey=1499911054492109",
  "available_generations": [
    { "id": "gen2-qwen-local", "status": "released", "version": 2 }
  ],
  "include": ["analysis", "machine", "metadata"],
  "verbalization": {
    "generation": { "id": "gen2-qwen-local", "status": "released", "version": 2 },
    "model": "sakamakismile/Qwen3.8-27B-MTP-NVFP4",
    "prompt_version": "v3.5a-tf-nothink",
    "generated_at": "2026-08-15T19:53:11Z",
    "summary": "施設: 一般道路 / 歩道: 左=あり(路側帯,1.5m), 右=画角外不明, 有効幅約1.5m, 車道幅約4m / 舗装: アスファルト・標示摩耗車線…",
    "analysis_status": "ok",
    "content_sha256": "d4b3fc750fc0542d5df071c7cfa54a65e9aa9801af02dfacd11846e06c6db2cb",
    "analysis": {
      "image_file": "image.png",
      "capture_meta": {…},
      "road_context": "両側に木造の店舗・住居が立ち並ぶ狭い市街地の路地。路面はアスファルトで、中央に白い破線(車線境界線)が描かれている。",
      "road_structure": { "type": "平面", "facility_type": "一般道路", "grade_separated_crossing": "なし" },
      "geometry": {…},
      "pavement": {…},
      "markings_wear": […],
      "infrastructure": {…},
      "mobility": {…},
      "accessibility": {…},
      … ほか 9 項目
    }
  },
  "metadata": {
    "raw_lat": 35.6889384,
    "raw_lon": 139.7219968,
    "computed_lat": 35.688942434653,
    "computed_lon": 139.72195407201,
    "position_source": "mapillary_computed",
    "position_offset_m": 3.9,
    "raw_compass": 264.84407438728863,
    "computed_compass": 262.94484333912,
    "travel_bearing": 224.9,
    "view_class": "前方視",
    … ほか 11 項目
  },
  "machine": {
    "node_id": "1499911054492109",
    "feature_version": "ml-2026-09-13",
    "month": 10,
    "weekday": "火",
    "hour": 15,
    "season": "秋",
    "time_bucket": "昼",
    "heading": 262.94484333912,
    "heading8": "西",
    "left_side8": "南東",
    … ほか 7 項目
  },
  "machine_note": "機械層(画像処理由来の客観指標)。VLMによる言語化とは別namespaceであり、混ぜて解釈しないこと。"
}
応答のフィールド
フィールド型説明
sceneobject
scene.idstring
scene.latnumber
scene.lonnumber
scene.position_sourcestring値 mapillary_computed mapillary_raw
scene.capture_yearinteger | null
scene.capture_time_qualitystring値 ok epoch_anomaly unknown
scene.wardstring | null
scene.quarantinedboolean
image_pagestring(uri)
available_generationsobject[]
available_generations[].idstring
available_generations[].statusstring値 experimental released deprecated
available_generations[].versioninteger
includestring[]値 metadata machine analysis
verbalizationnull | object
verbalization.generationobject
verbalization.modelstring | null
verbalization.prompt_versionstring | null
verbalization.generated_atstring | null
verbalization.summarystring
verbalization.analysis_statusstring値 ok invalid
verbalization.content_sha256string
verbalization.analysisobject | null言語化全文(構造化JSON)。include に analysis がある場合のみ存在。 analysis_status = "invalid" のときは null(500にはしない)。
metadataobjectinclude=metadata のときのみ
metadata.raw_latnumber | null
metadata.raw_lonnumber | null
metadata.computed_latnumber | null
metadata.computed_lonnumber | null
metadata.position_sourcestring
metadata.position_offset_mnumber | nullraw座標とcomputed座標の距離(m)。どちらか欠損なら null。
metadata.raw_compassnumber | null
metadata.computed_compassnumber | null
metadata.travel_bearingnumber | null
metadata.view_classstring | null
metadata.sequence_idstring | null
metadata.is_panoboolean | null
metadata.quality_scorenumber | null
metadata.camera_typestring | null
metadata.widthinteger | null
metadata.heightinteger | null
metadata.captured_at_msinteger | null
metadata.captured_at_jststring | null
metadata.capture_time_qualitystring
metadata.cell_250minteger
metadata.position_notestring
machinenull | objectinclude=machine のときのみ。機械層(画像処理由来の客観指標)。収録が無ければ null。VLM言語化とは別namespace であり混ぜて解釈しない。
machine.node_idstring
machine.feature_versionstring
machine.monthinteger | null
machine.weekdaystring | null
machine.hourinteger | null
machine.seasonstring | null
machine.time_bucketstring | null
machine.headingnumber | null
machine.heading8string | null
machine.left_side8string | null
machine.right_side8string | null
machine.abs_objects
machine.colorfulnessnumber | null
machine.green_rationumber | null
machine.warm_rationumber | null
machine.dominant_colors
machine.color_statusstring | null
machine_notestring
ステータスコード
  • 200 OK
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 404 対象が存在しない
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

通り(線)

名前のある通りの「通りのカルテ」と、名前の無い道の区間の数値です。読み方はデータの読み方へ。

GET/v1/streets/nearby

最寄りの通り(線)と名前の無い辺

キャッシュ public, max-age=60

座標から半径内の辺(OSM道路網を交差点で切った区間、シーン15枚以上)を探し、通り(同名の辺を区市町村内で束ねた単位)ごとに最短距離で返す。名前の無い道は unnamed_edges として辺単位で返す。通りの文章(カルテ)は /v1/streets/{street_id}。

パラメータ

名前場所型説明
lat必須クエリnumber緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90
lon必須クエリnumber経度(WGS84)範囲 -180〜180
radius_mクエリinteger既定 60 ・ 範囲 1〜500
limitクエリinteger既定 5 ・ 範囲 1〜20

例

curl "https://michiyomi.dev/v1/streets/nearby?lat=35.6717&lon=139.7647"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "la_release": "2026-10-03-la2",
  "la_counts": {
    "streets": 6248,
    "areas": 5256,
    "edges": 30362,
    "karte_streets": 3563,
    "karte_areas": 4734
  },
  "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 60, "limit": 5 },
  "streets": [
    {
      "street_id": 799,
      "name": "晴海通り",
      "ward": "中央区",
      "highway_class": "幹線",
      "length_m": 4480,
      "coverage_grade": "A",
      "n_scenes": 1739,
      "n_sequences": 121,
      "year_span": [2013, 2026],
      "bbox": [35.6575946, 139.7622352, 35.6730203, 139.7794593],
      "has_karte": true,
      "nearest_edge": { "edge_id": "884274229_3", "dist_m": 29 }
    },
    {
      "street_id": 720,
      "name": "中央通り",
      "ward": "中央区",
      "highway_class": "幹線",
      "length_m": 5337,
      "coverage_grade": "A",
      "n_scenes": 2244,
      "n_sequences": 222,
      "year_span": [2010, 2026],
      "bbox": [35.6674922, 139.7611031, 35.6899098, 139.7746484],
      "has_karte": true,
      "nearest_edge": { "edge_id": "1026056857_1", "dist_m": 54.1 }
    }
  ],
  "unnamed_edges": [
    {
      "edge_id": "522859644_1",
      "highway_class": "歩道・歩行者路",
      "length_m": 71,
      "n_scenes": 16,
      "dist_m": 50.5,
      "town_key": "13102003004",
      "ward": "中央区"
    }
  ],
  "n_edges_considered": 3,
  "notes": {
    "grade": "coverage_grade は被覆等級。A〜C のみカルテ(文章)があり、D は数値のみ。等級の規則は profile.coverage.rule を…",
    "rates": "率(sidewalk.rate など)は判定できた件数(judged)が分母。judged_rate が低い項目は根拠が薄い。",
    "years": "統計は複数年の集計。year_span を必ず添え、一時物(objects_temporary_latest)は最新年の記録のみ。",
    "sides": "通りの sides は軸に対する絶対方位の側(例: 北東側)。前方視・後方視の写真だけから合成しているため件数が少ないことがある。",
    "versions": "karte は主版(karte_provenance.model)。karte_versions に他のモデルの版がある場合、include=versi…",
    "license": "通り・町丁目の骨格は © OpenStreetMap contributors(ODbL 1.0)、町丁目の境界・人口は e-Stat 国勢調査2020…"
  }
}
応答のフィールド
フィールド型説明
queryobject
streetsobject[]
streets[].street_idinteger
streets[].namestring
streets[].wardstring | null
streets[].highway_classstring | null幹線・補助幹線・生活道路 など
streets[].length_minteger | null
streets[].coverage_gradestring値 A B C D
streets[].n_scenesinteger
streets[].n_sequencesinteger | null
streets[].year_spaninteger | null[]
streets[].bboxnumber | null[]min_lat, min_lon, max_lat, max_lon の順
streets[].has_karteboolean
streets[].nearest_edgeobject
unnamed_edgesobject[]
n_edges_consideredinteger
notesobject
ステータスコード
  • 200 OK
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 404 対象が存在しない
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

GET/v1/streets/{street_id}

通りのカルテ(道カルテ)と素材束

キャッシュ public, max-age=86400

通り単位の言語化。karte は素材束(profile=シーン言語化の集計。率は判定できた件数が分母、年幅つき)だけからローカルLLMが書き、数値・年・固有名が素材束に存在することを機械検証した文章。被覆等級(coverage_grade) D は karte を生成しない。include=profile,axis,edges で素材束・軸ポリライン・辺一覧を付ける。

パラメータ

名前場所型説明
street_id必須パスinteger1以上
includeクエリstringprofile,axis,edges,versions のカンマ区切り(versions=他モデル版のカルテ本文)

例

curl "https://michiyomi.dev/v1/streets/799"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "la_release": "2026-10-03-la2",
  "street_id": 799,
  "name": "晴海通り",
  "ward": "中央区",
  "highway_class": "幹線",
  "length_m": 4480,
  "coverage_grade": "A",
  "n_scenes": 1739,
  "year_span": [2013, 2026],
  "has_karte": true,
  "karte": {
    "street_id": "799",
    "name": "晴海通り(中央区)",
    "character": "区全体より幅の広い複数車線の車道が北西へ延び、両側に高層のオフィスビルやマンションが並ぶ通り。",
    "tsuranari": "2013〜2026年の記録では、始点側に20階以上の高層ビルが目立ち、Denny'sやスポーツクラブNASの看板が見える。始点寄りの一区間で車道が約7.…",
    "sides": "南西側・北東側とも歩道がほぼ途切れずに続き、幅はどちらも約2.5mで、左右の差はほとんどない。",
    "streetscape": "高層ビルの多くは築年の新しい外観で、築地場外市場に連なる小規模な店舗と中層の建物が並ぶ一角もある。緑視率は約2.9%で区とほぼ同じで、都全体より低い。",
    "walking": "判定できた1,906側のうち約98%に車道と分離された歩道があり、ひび割れはまれで、歩道通行可の標示や自転車の専用通行帯が写っている。無電柱化の率は約2…",
    "notable": "観測文には「複数車線」が都全体の約6.4倍、「バス」が約3.9倍の頻度で出る。銀座四丁目交差点の角で歩道が大きく広がる所や、白色の大きな側桁と支柱が続く…",
    "changes_summary": "裁定済みの変化は記録にない。",
    "coverage_note": "被覆はA(2013〜2026年、写真1,739枚・走行121本、延長の100%)。",
    "evidence_ids": [
      "1516117756754071",
      … ほか 4 件
    ]
  },
  "karte_provenance": {
    "model": "opus55-v12-xhigh",
    "prompt": "prompt_street_v1_2.md",
    "generated_at": "2026-09-24 20:04:34",
    "note": "素材束(profile)だけから生成し、数値・年・固有名が素材束に存在することを機械検証した文章。等級Dは生成しない。"
  },
  "karte_versions": [
    {
      "tag": "fable-low",
      "model": "fable-low",
      "prompt": "prompt_street_v1_1.md",
      "generated_at": "2026-09-22 13:35:28"
    },
    … ほか 2 件
  ],
  … ほか 4 項目
}
応答のフィールド
フィールド型説明
street_idinteger
namestring
wardstring | null
highway_classstring | null幹線・補助幹線・生活道路 など
length_minteger | null
coverage_gradestring値 A B C D
n_scenesinteger
n_sequencesinteger | null
year_spaninteger | null[]
bboxnumber | null[]min_lat, min_lon, max_lat, max_lon の順
has_karteboolean
karteobject | null道カルテ(name/character/tsuranari/sides/streetscape/walking/notable/changes_summary/coverage_note/evidence_ids)。等級Dは null。
karte_provenanceobject | null
karte_versionsobject[]カルテの版一覧(tag/model/prompt/generated_at。include=versions で karte 本文つき)
profileobject素材束(include=profile)。率は judged が分母、judged_rate が判定率。
axisnumber[][]軸ポリライン。各要素は lat, lon の順(include=axis)
edgesobject[]
ステータスコード
  • 200 OK
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 404 対象が存在しない
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

GET/v1/edges/{edge_id}

名前の無い道(辺)の数値

キャッシュ public, max-age=86400

OSM way を交差点で切った区間(シーン15枚以上)の集計。文章のカルテは通り・町丁目の単位で提供する。

パラメータ

名前場所型説明
edge_id必須パスstring^[0-9]+_[0-9]+$

例

curl "https://michiyomi.dev/v1/edges/522859644_1"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "la_release": "2026-10-03-la2",
  "la_counts": {…},
  "edge_id": "522859644_1",
  "street_id": null,
  "town_key": "13102003004",
  "name": null,
  "ward": "中央区",
  "highway_class": "歩道・歩行者路",
  "length_m": 71,
  "n_scenes": 16,
  "geom": [
    [35.6720502, 139.7657558],
    [35.6715701, 139.7652352]
  ],
  "profile": {
    "edge_id": "522859644_1",
    "street_id": null,
    "name": null,
    "ward": "中央区",
    "town_key": "13102003004",
    "highway": "footway",
    "highway_class": "歩道・歩行者路",
    "length_m": 71,
    "stats": {…},
    "evidence": […]
  },
  … ほか 1 項目
}
ステータスコード
  • 200 OK
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 404 対象が存在しない
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

町丁目(面)

国勢調査2020の小地域ごとの「町丁目のカルテ」です。

GET/v1/areas/at

地点を含む町丁目(面)

キャッシュ public, max-age=60

国勢調査2020小地域(町丁・字等)のうち座標を含むものを返す。地区のカルテは /v1/areas/{town_key}。

パラメータ

名前場所型説明
lat必須クエリnumber緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90
lon必須クエリnumber経度(WGS84)範囲 -180〜180

例

curl "https://michiyomi.dev/v1/areas/at?lat=35.6717&lon=139.7647"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "la_release": "2026-10-03-la2",
  "la_counts": {…},
  "query": { "lat": 35.6717, "lon": 139.7647 },
  "area": {
    "town_key": "13102003004",
    "name": "銀座四丁目",
    "ward": "中央区",
    "coverage_grade": "A",
    "n_scenes": 1001,
    "n_sequences": 115,
    "year_span": [2010, 2026],
    "center": { "lat": 35.671029, "lon": 139.766331 },
    "bbox": [35.66845943310958, 139.7626621643848, 35.67364263757046, 139.7695740383911],
    "has_karte": true
  },
  "notes": {…}
}
応答のフィールド
フィールド型説明
queryobject
areaobject | null
area.town_keystring国勢調査2020 小地域キー
area.namestring
area.wardstring
area.coverage_gradestring値 A B C D
area.n_scenesinteger
area.n_sequencesinteger | null
area.year_spaninteger | null[]
area.centerobject
area.bboxnumber | null[]
area.has_karteboolean
ステータスコード
  • 200 OK(該当なしは area=null)
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

GET/v1/areas/nearby

中心が近い町丁目

キャッシュ public, max-age=60

パラメータ

名前場所型説明
lat必須クエリnumber緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90
lon必須クエリnumber経度(WGS84)範囲 -180〜180
radius_mクエリinteger既定 800 ・ 範囲 1〜3000
limitクエリinteger既定 5 ・ 範囲 1〜20

例

curl "https://michiyomi.dev/v1/areas/nearby?lat=35.6717&lon=139.7647&limit=2"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "la_release": "2026-10-03-la2",
  "la_counts": {…},
  "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 800, "limit": 2 },
  "count": 2,
  "results": [
    {
      "town_key": "13102003004",
      "name": "銀座四丁目",
      "ward": "中央区",
      "coverage_grade": "A",
      "n_scenes": 1001,
      "n_sequences": 115,
      "year_span": [2010, 2026],
      "center": { "lat": 35.671029, "lon": 139.766331 },
      "bbox": [35.66845943310958, 139.7626621643848, 35.67364263757046, 139.7695740383911],
      "has_karte": true,
      "center_dist_m": 165
    },
    {
      "town_key": "13102003005",
      "name": "銀座五丁目",
      "ward": "中央区",
      "coverage_grade": "A",
      "n_scenes": 991,
      "n_sequences": 131,
      "year_span": [2010, 2026],
      "center": { "lat": 35.670158, "lon": 139.765335 },
      "bbox": [35.667463339979385, 139.76039842376687, 35.67296422354896, 139.7683763995818],
      "has_karte": true,
      "center_dist_m": 181
    }
  ],
  "notes": {…}
}
応答のフィールド
フィールド型説明
queryobject
countinteger
resultsobject[]
results[].town_keystring国勢調査2020 小地域キー
results[].namestring
results[].wardstring
results[].coverage_gradestring値 A B C D
results[].n_scenesinteger
results[].n_sequencesinteger | null
results[].year_spaninteger | null[]
results[].centerobject
results[].bboxnumber | null[]
results[].has_karteboolean
ステータスコード
  • 200 OK
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

GET/v1/areas/{town_key}

町丁目のカルテ(地区カルテ)と素材束

キャッシュ public, max-age=86400

町丁目単位の言語化。karte の生成方法・等級の扱いは /v1/streets/{street_id} と同じ。include=profile,geometry で素材束・境界(GeoJSON geometry、簡略化)を付ける。

パラメータ

名前場所型説明
town_key必須パスstring^[0-9]{9,12}$
includeクエリstring

例

curl "https://michiyomi.dev/v1/areas/13102003004"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "la_release": "2026-10-03-la2",
  "town_key": "13102003004",
  "name": "銀座四丁目",
  "ward": "中央区",
  "coverage_grade": "A",
  "n_scenes": 1001,
  "year_span": [2010, 2026],
  "has_karte": true,
  "karte": {
    "town_key": "13102003004",
    "name": "銀座四丁目(中央区)",
    "character": "ガラス張りの高層オフィスビルと商業ビルが広い幹線沿いに連なり、ブランドの看板と幅の広い歩道が続く町。",
    "skeleton": "晴海通り・中央通り・昭和通りの幹線が骨格をなし、車道では幹線が約2,240mと生活道路の約1,453mより長い。延長は歩道・歩行者路が最も長く、写真には…",
    "streetscape": "2010〜2026年の記録では、10階以上のガラス張りのオフィスビルや商業ビルが並び、2000年代以降の外観の建物が大半を占める。TASAKI・NISS…",
    "walking": "判定できた1,224側のうち約99%に歩道があり、多くは車道と分かれた歩道で、幅の中央値は約3.0m。舗装はアスファルトが中心でブロック舗装も混じり、自…",
    "notable": "観測文には「高層商業」が都全体の約97.9倍、「ブランド」が約88.0倍の頻度で現れる。銀座四丁目交差点の角には地下鉄出入口を伴う広い歩道空間が広がり、…",
    "changes_summary": "裁定済みの変化は記録にない。",
    "compared_to": "車道幅の中央値は約12.0mで中央区・都全体のいずれより広く、無電柱化率も約44%で区・都全体を上回る。建物は10階以上が最も多い点で区と同じだが、都全…",
    "coverage_note": "等級A、写真約1,001枚・走行約115本、2010〜2026年の記録で、車道延長の約91%に写真がある。",
    "evidence_ids": [
      "1244325431140140",
      … ほか 4 件
    ]
  },
  "karte_provenance": {
    "model": "opus55-v12-xhigh",
    "prompt": "prompt_area_v1_2.md",
    "generated_at": "2026-09-25 10:43:56",
    "note": "素材束(profile)だけから生成し、数値・年・固有名が素材束に存在することを機械検証した文章。等級Dは生成しない。"
  },
  "karte_versions": [
    {
      "tag": "fable-low",
      "model": "fable-low",
      "prompt": "prompt_area_v1_1.md",
      "generated_at": "2026-09-22 19:32:08"
    },
    … ほか 2 件
  ],
  … ほか 5 項目
}
応答のフィールド
フィールド型説明
town_keystring国勢調査2020 小地域キー
namestring
wardstring
coverage_gradestring値 A B C D
n_scenesinteger
n_sequencesinteger | null
year_spaninteger | null[]
centerobject
center.latnumber
center.lonnumber
bboxnumber | null[]
has_karteboolean
karteobject | null地区カルテ(name/character/skeleton/streetscape/walking/notable/changes_summary/compared_to/coverage_note/evidence_ids)。等級Dは null。
karte_provenanceobject | null
profileobject
geometryobjectGeoJSON geometry(簡略化、include=geometry)
ステータスコード
  • 200 OK
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 404 対象が存在しない
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

経年変化

同じ場所を別の年に撮った写真を比べ、反証を試みても崩れなかった変化だけを返します。

GET/v1/changes/nearby

近傍の裁定済み経年変化

キャッシュ public, max-age=60

既定は status=supported(反証優先の再検証を通過したもの)。 evidence は200字で打ち切り、evidence_truncated を立てる(全文は詳細エンドポイント)。座標は変化地点そのものではなく道路グループ(group_id)の中心。順序は distance_m ASC → year_b DESC → change_id ASC。

quality / generation は他の入口と同じ厳格さで検証する(未知値は400)が、経年変化は言語化世代とは別レイヤなので結果の絞り込みには使わない (quality_policy と field_notes.quality に反映するのみ)。

OpenAPI 定義との違い(2026-10-03 に本番で確認)
openapi.yaml では year_from・year_to の下限が2000ですが、本番は1970から受け付けます。

パラメータ

名前場所型説明
lat必須クエリnumber緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90
lon必須クエリnumber経度(WGS84)範囲 -180〜180
radius_mクエリinteger既定 500 ・ 範囲 1〜3000
limitクエリinteger返す件数。scenes既定10 / changes既定20。範囲 1〜50
categoryクエリstring値 設備 建物 区画線・標示 舗装 沿道用途 植栽 その他
statusクエリstring既定 "supported" ・ 値 supported refuted unverifiable withdrawn
year_fromクエリinteger範囲 1970〜2100
year_toクエリintegeryear_from <= year_to でなければ400範囲 1970〜2100
qualityクエリstring言語化世代の品質ポリシー。
  • released(既定): status='released' の世代のみ。地点ごとに version 最大
  • include_experimental: released(version降順) → experimental(version降順) の優先で地点ごとに1つ
  • experimental_only: experimental のみ
既定 "released" ・ 値 released include_experimental experimental_only
generationクエリstring世代IDを明示指定(quality より優先。存在しないIDは400)。最大 64字

互換のため受け付ける旧パラメータ(非推奨): radius(旧パラメータ。radius_m の alias(両方あれば radius_m が優先))

例

curl "https://michiyomi.dev/v1/changes/nearby?lat=35.6717&lon=139.7647&radius_m=500&limit=2"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "query": {
    "lat": 35.6717,
    "lon": 139.7647,
    "radius_m": 500,
    "limit": 2,
    "category": null,
    "status": "supported",
    "year_from": null,
    "year_to": null
  },
  "count": 2,
  "results": [
    {
      "change_id": "chg_4424424a5b4f",
      "group_id": 1670,
      "distance_m": 233,
      "lat": 35.669806875,
      "lon": 139.763595175,
      "year_a": 2017,
      "year_b": 2026,
      "category": "設備",
      "subject": "GINZA SIX前のタクシー関連標識",
      "evidence": "右側のGINZA SIX緑色外壁前にあり、上部に機器を備えた同位置の支柱を、2017年フレーム1〜3と2026年フレーム6で対応づけられる。2017年は…",
      "evidence_truncated": false,
      "segment_priority_score": 10,
      "status": "supported"
    },
    {
      "change_id": "chg_e9d920b5c524",
      "group_id": 1670,
      "distance_m": 233,
      "lat": 35.669806875,
      "lon": 139.763595175,
      "year_a": 2017,
      "year_b": 2026,
      "category": "植栽",
      "subject": "GINZA SIX前を含む両側歩道の街路樹",
      "evidence": "2017年のフレーム1〜4と2026年のフレーム5〜8は、右側のGINZA SIX外壁、左側のDIANA・ユニクロ等を対応づけられる。2017年はGIN…",
      "evidence_truncated": false,
      "segment_priority_score": 10,
      "status": "supported"
    }
  ],
  "candidate_truncated": false,
  "field_notes": {
    "segment_priority_score": "道路区間の点検優先度ヒューリスティック(変化自体の危険度ではない)。多くの行でNULL。",
    "change_position": "lat/lon は変化地点そのものではなく、道路グループ(group_id)の中心座標。",
    "verification": "同一モデル系列の文脈分離した別セッションによる反証優先の再検証を通過した(verdict=supported)所見のみを収録。",
    "quality": "経年変化は言語化世代(generation)とは別レイヤ。quality/generation は検証するが結果の絞り込みには使われない。"
  }
}
応答のフィールド
フィールド型説明
queryobject
countinteger
resultsobject[]
results[].change_idstring
results[].group_idinteger道路グループID(旧gid)
results[].distance_minteger
results[].latnumber道路グループ中心座標(変化地点そのものではない)
results[].lonnumber
results[].year_ainteger
results[].year_binteger
results[].categorystring値 設備 建物 区画線・標示 舗装 沿道用途 植栽 その他
results[].subjectstring変化の主題(旧what)
results[].evidencestring | null200字で打ち切り
results[].evidence_truncatedboolean
results[].segment_priority_scoreinteger | null道路区間の点検優先度ヒューリスティック(旧max_risk)。 変化そのものの危険度ではない。 多くの行で null。
results[].statusstring値 supported refuted unverifiable withdrawn
candidate_truncatedboolean
field_notesobject<string>
ステータスコード
  • 200 OK
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。

GET/v1/changes/{change_id}

経年変化の詳細

キャッシュ public, max-age=86400

evidence 全文と verification(反証優先の再検証メタ)を返す。 scene_ids_a / scene_ids_b は元データに存在しないため本リリースでは全行 null (捏造しない。note で明示する)。

パラメータ

名前場所型説明
change_id必須パスstring^chg_[0-9a-f]{12}$

例

curl "https://michiyomi.dev/v1/changes/chg_4424424a5b4f"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "change": {
    "change_id": "chg_4424424a5b4f",
    "group_id": 1670,
    "lat": 35.669806875,
    "lon": 139.763595175,
    "cell_1km": 174101796,
    "year_a": 2017,
    "year_b": 2026,
    "category": "設備",
    "subject": "GINZA SIX前のタクシー関連標識",
    "evidence": "右側のGINZA SIX緑色外壁前にあり、上部に機器を備えた同位置の支柱を、2017年フレーム1〜3と2026年フレーム6で対応づけられる。2017年は…",
    "scene_ids_a": null,
    "scene_ids_b": null,
    "segment_priority_score": 10,
    "status": "supported",
    "verification": {
      "method": "same-model independent-context adversarial review",
      "method_ja": "同一モデル系列の文脈分離した別セッションによる反証優先の再検証",
      "detector_model": "gpt-5.6-sol",
      "reviewer_model": "gpt-5.6-sol",
      "same_model_family": true,
      "verdict": "supported",
      "limitations": ["shared systematic errors may remain", "supported率は反証パスの生存率であり精度の下限保証ではない"]
    }
  },
  "field_notes": {
    "segment_priority_score": "道路区間の点検優先度ヒューリスティック(変化自体の危険度ではない)。多くの行でNULL。",
    "change_position": "lat/lon は変化地点そのものではなく、道路グループ(group_id)の中心座標。",
    "verification": "同一モデル系列の文脈分離した別セッションによる反証優先の再検証を通過した(verdict=supported)所見のみを収録。"
  }
}
応答のフィールド
フィールド型説明
changeobject
change.change_idstring
change.group_idinteger道路グループID(旧gid)
change.distance_minteger
change.latnumber道路グループ中心座標(変化地点そのものではない)
change.lonnumber
change.year_ainteger
change.year_binteger
change.categorystring値 設備 建物 区画線・標示 舗装 沿道用途 植栽 その他
change.subjectstring変化の主題(旧what)
change.evidencestring | null全文
change.evidence_truncatedboolean
change.segment_priority_scoreinteger | null道路区間の点検優先度ヒューリスティック(旧max_risk)。 変化そのものの危険度ではない。 多くの行で null。
change.statusstring値 supported refuted unverifiable withdrawn
change.cell_1kminteger
change.scene_ids_astring[] | null元データに存在しないため本リリースでは常に null(捏造しない)
change.scene_ids_bstring[] | null
change.verificationobject | null裁定メタ。method_ja は「同一モデル系列の文脈分離した別セッションによる反証優先の再検証」。
field_notesobject<string>
ステータスコード
  • 200 OK
  • 404 対象が存在しない
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。

設備

自販機・トイレ・ベンチが写った撮影地点です。画面では地図の「設備」の表示(/map/?view=facilities)で見られます。

GET/v1/amenities/nearby

近くの設備(自販機・トイレ・ベンチ)が写った撮影地点

キャッシュ no-store

設備(kind)が写った撮影地点を、直線距離の近い順に返します。座標と距離は撮影した位置のもので、設置された位置・いまあるか・使えるかは確かめていません。year_from を省くと全年。利用者の現在地を送るときは、座標が URL に残らない POST /amenities/search を使ってください。

OpenAPI 定義との違い(2026-10-03 に本番で確認)
openapi.yaml の kind は vending_machine だけですが、本番は toilet・bench も受け付けます。

パラメータ

名前場所型説明
lat必須クエリnumber緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90
lon必須クエリnumber経度(WGS84)範囲 -180〜180
kindクエリstring設備の種類。vending_machine(自販機)・toilet(トイレ)・bench(ベンチ)既定 "vending_machine" ・ 値 vending_machine toilet bench
radius_mクエリinteger既定 1000 ・ 範囲 100〜3000
limitクエリinteger既定 3 ・ 範囲 1〜10
year_fromクエリinteger範囲 2000〜2100

例

curl "https://michiyomi.dev/v1/amenities/nearby?lat=35.6717&lon=139.7647&kind=bench&limit=2"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "count": 2,
  "results": [
    {
      "id": "bn_1470fb07087f1e7c",
      "lat": 35.67205272116,
      "lon": 139.76419890994,
      "position_basis": "capture_location",
      "scene_id": "529346588414766",
      "capture_year": 2019,
      "evidence": "ベンチ:良好",
      "object_position": "右",
      "object_distance_m_est": 10,
      "confidence": "high",
      "image_page": "https://www.mapillary.com/app/?pKey=529346588414766",
      "generation_id": "gen2-qwen-local",
      "ward": "中央区",
      "evidence_count": 1,
      "distance_m": 60
    },
    {
      "id": "bn_235844e9fd8e40d2",
      "lat": 35.672235417637,
      "lon": 139.76394183294,
      "position_basis": "capture_location",
      "scene_id": "2910127179305154",
      "capture_year": 2019,
      "evidence": "ベンチ:良好",
      "object_position": "中央",
      "object_distance_m_est": 5,
      "confidence": "high",
      "image_page": "https://www.mapillary.com/app/?pKey=2910127179305154",
      "generation_id": "gen2-qwen-local",
      "ward": "中央区",
      "evidence_count": 1,
      "distance_m": 91
    }
  ],
  "dataset": {
    "kind": "bench",
    "source_snapshot": "2026-09-13-r1",
    "built_at": "2026-09-17T17:43:39.549691Z",
    "total_candidates": 16849,
    "min_year": 2006,
    "max_year": 2026
  },
  "query": {
    "lat": 35.6717,
    "lon": 139.7647,
    "radius_m": 1000,
    "limit": 2,
    "year_from": null,
    "kind": "bench"
  }
}
応答のフィールド
フィールド型説明
countinteger
queryobject
datasetobject
dataset.source_snapshotstring
dataset.built_atstring
dataset.total_candidatesinteger
dataset.min_yearinteger | null
dataset.max_yearinteger | null
resultsobject[]
results[].idstring
results[].scene_idstring
results[].latnumber
results[].lonnumber
results[].position_basis"capture_location"
results[].distance_minteger
results[].capture_yearinteger
results[].evidencestring
results[].object_positionstring | null
results[].object_distance_m_estnumber | null
results[].confidencestring値 high medium
results[].image_pagestring(uri)
results[].generation_idstring
results[].wardstring | null
results[].evidence_countinteger
ステータスコード
  • 200 OK (Cache-Control is no-store)
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

POST/amenities/search

本文で座標を送る設備の検索

別名 /vending/searchキャッシュ no-store

GET /v1/amenities/nearby と同じ結果を返します。座標を JSON の本文(2048バイトまで)で送るので、URL に残りません。データは書き込みません。
OpenAPI 定義との違い(2026-10-03 に本番で確認)
openapi.yaml にはこの入口が別名の /vending/search で載っています。どちらも同じ結果を返します。kind は toilet・bench も使えます。

本文(JSON)

名前場所型説明
lat必須本文number範囲 -90〜90
lon必須本文number範囲 -180〜180
radius_m本文integer既定 1000 ・ 範囲 100〜3000
limit本文integer既定 3 ・ 範囲 1〜10
kind本文string既定 "vending_machine" ・ 値 vending_machine toilet bench
year_from本文integer | null範囲 2000〜2100

例

curl -X POST "https://michiyomi.dev/amenities/search" -H "content-type: application/json" \ -d '{"lat":35.6717,"lon":139.7647,"kind":"bench","limit":2}'
応答(抜粋) · HTTP 200
// 共通の項目(snapshot・license など)は省略
{
  "count": 2,
  "results": [
    {
      "id": "bn_1470fb07087f1e7c",
      "lat": 35.67205272116,
      "lon": 139.76419890994,
      "position_basis": "capture_location",
      "scene_id": "529346588414766",
      "capture_year": 2019,
      "evidence": "ベンチ:良好",
      "object_position": "右",
      "object_distance_m_est": 10,
      "confidence": "high",
      "image_page": "https://www.mapillary.com/app/?pKey=529346588414766",
      "generation_id": "gen2-qwen-local",
      "ward": "中央区",
      "evidence_count": 1,
      "distance_m": 60
    },
    … ほか 1 件
  ],
  "dataset": {
    "kind": "bench",
    "source_snapshot": "2026-09-13-r1",
    "built_at": "2026-09-17T17:43:39.549691Z",
    "total_candidates": 16849,
    "min_year": 2006,
    "max_year": 2026
  },
  "query": {
    "lat": 35.6717,
    "lon": 139.7647,
    "radius_m": 1000,
    "limit": 2,
    "year_from": null,
    "kind": "bench"
  }
}
応答のフィールド
フィールド型説明
countinteger
queryobject
datasetobject
dataset.source_snapshotstring
dataset.built_atstring
dataset.total_candidatesinteger
dataset.min_yearinteger | null
dataset.max_yearinteger | null
resultsobject[]
results[].idstring
results[].scene_idstring
results[].latnumber
results[].lonnumber
results[].position_basis"capture_location"
results[].distance_minteger
results[].capture_yearinteger
results[].evidencestring
results[].object_positionstring | null
results[].object_distance_m_estnumber | null
results[].confidencestring値 high medium
results[].image_pagestring(uri)
results[].generation_idstring
results[].wardstring | null
results[].evidence_countinteger
ステータスコード
  • 200 OK (Cache-Control is no-store)
  • 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。
  • 413 Request body exceeds 2048 bytes
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
  • 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は request_id 付きでサーバログ(console.error)にのみ記録される。

学校

東京都の小学校の位置(国土数値情報P29)。名前から座標を引く起点に使います。

版・世代・来歴

公開中の版・件数・世代・来歴など、データそのものについての情報です。

GET/v1/meta

リリース件数と世代カタログ

キャッシュ public, max-age=300

公開中の版・件数・世代のカタログを返します。件数はリリース時に確定した release_stats から返し、問い合わせのたびに全件を数え直しません。processed_total と machine_feature_rows は隔離したシーンを含む処理済みの総数で、ほかの件数と year_min・year_max は隔離したシーンを除きます(counting_notes)。

OpenAPI 定義との違い(2026-10-03 に本番で確認)
openapi.yaml の説明(件数はすべて隔離を除く)と違い、processed_total と machine_feature_rows は隔離したシーンを含みます(応答の counting_notes)。

例

curl "https://michiyomi.dev/v1/meta"
応答(抜粋) · HTTP 200そのまま開く ↗
{
  "api_version": "v1",
  "data_language": "ja",
  "snapshot": "2026-09-13-r1",
  "request_id": "b44f51c0-382e-445b-9013-a3f9e7ed500e",
  "data_as_of": "2026-09-13",
  "quality_policy": { "requested": "released", "generation": null, "experimental_included": false },
  "license": {
    "schema_version": 2,
    "id": "LicenseRef-michiyomi-layered",
    "url": "https://michiyomi.dev/docs/license/",
    "policy_version": "2026-10-03",
    "summary": "観測データ(本文・構造化JSON・機械層の値・経年変化)は CC BY 4.0 で使えます。AIの回答・分析・アプリの表示・個別の転記には、出典もロゴも…",
    "summary_en": "Observation data (text, structured JSON, machine features, changes) is avail…",
    "obligations": {
      "use_in_results": ["none"],
      "display_or_quote_records": ["none"],
      "redistribute_as_data": ["attribution", "upstream_not_licensed_if_bulk", "source_notice_if_bulk"]
    },
    "notices": [
      "mapillary_reference_not_licensed",
      … ほか 5 件
    ],
    "layers": {
      "observation": "CC-BY-4.0",
      "mapillary_reference": "NOASSERTION",
      "public_sector": "CC-BY-4.0"
    },
    "linked_only": { "photo": "CC-BY-SA-4.0" },
    "attribution": "出典: みちよみ(michiyomi.dev、Mapillary の街路写真より)、CC BY 4.0(https://creativecommons.…",
    "attribution_en": "Source: michiyomi (michiyomi.dev), from Mapillary street-level photos, CC BY…",
    "public_sector_sources": ["「国土数値情報(行政区域データ)」(国土交通省)を加工して作成"],
    "mapillary": "https://www.mapillary.com",
    "ui_requirements": "テキストや数値を表示するだけなら、ロゴも出典も要りません。Mapillary の写真を表示する場合だけ、撮影者(画像ページへのリンクで可)と CC BY…",
    "ui_requirements_en": "No logo or credit is needed to display text or values. Only when you show a …",
    … ほか 4 項目
  },
  "release": {
    "release_id": "2026-09-13-r1",
    "status": "published",
    "created_at": "2026-09-12T20:42:08.414276Z",
    "published_at": "2026-09-12T22:00:00Z",
    "data_as_of": "2026-09-13"
  },
  "counts": {
    "processed_total": 1914490,
    "served_total": 1914451,
    "released_total": 1914451,
    "experimental_total": 0,
    "changes_total": 2522,
    "schools_total": 1323,
    "quarantined_total": 39,
    "machine_feature_rows": 1914490,
    "position_source": { "mapillary_computed": 1899940, "mapillary_raw": 14511 }
  },
  "machine_feature_coverage": {
    "rows": { "count": 1914490, "denominator": 1914490, "ratio": 1 },
    "served_columns": {
      "travel_bearing": { "count": 1907664, "denominator": 1914451, "ratio": 0.996455 },
      "abs_objects": { "count": 1650371, "denominator": 1914451, "ratio": 0.86206 },
      "color_status_ok": { "count": 1914412, "denominator": 1914451, "ratio": 0.99998 },
      "green_ratio": { "count": 1914412, "denominator": 1914451, "ratio": 0.99998 }
    }
  },
  "years": { "min": 1986, "max": 2026 },
  "sharding": {
    "active": true,
    "shard_count": 4,
    "shards": ["s002", "s003", "s004", "s005"],
    "routing": "longitude bands on cell_250m edges"
  },
  "generations": [
    {
      "id": "gen2-qwen-local",
      "status": "released",
      "version": 2,
      "gen_id": "gen2-qwen-local",
      "model_family": "qwen-local",
      "model": "sakamakismile/Qwen3.8-27B-MTP-NVFP4 / nvidia/Qwen3.6-27B-NVFP4 / qwen-vlm",
      "prompt_version": null,
      "output_contract": "v2: 純粋視覚・カメラ基準左右・image_file付きJSON",
      "released_at": "2026-08-22",
      "notes": "ローカルVLMによる言語化。releasedは配信採用状態を示し、モデル・推論設定間の判定基準が同一であることを保証しません。",
      "evidence": null,
      "stats": {…}
    },
    … ほか 1 件
  ],
  "metrics": {
    "processed_total": 1914490,
    "served_total": 1914451,
    "released_total": 1914451,
    "experimental_total": 0,
    "changes_total": 2522,
    "schools_total": 1323,
    "position_source_computed": 1899940,
    "position_source_raw": 14511,
    "computed_discarded_outside_service": 183,
    "machine_feature_rows": 1914490,
    "machine_travel_bearing_nonnull": 1907664,
    "machine_abs_objects_nonnull": 1650371,
    "machine_color_status_ok": 1914412,
    "machine_green_ratio_nonnull": 1914412,
    "year_min": 1986,
    "year_max": 2026,
    … ほか 3 項目
  },
  "counting_notes": {
    "source": "件数は release_stats(リリース時に確定した正本)から返す。リクエスト時の全表集計はしない。",
    "quarantine": "processed_total / machine_feature_rows は隔離を含む処理済み総数。served_total / released_…",
    "search_vs_release": "近傍検索・coverage は隔離シーンを常に除外するため、それらの合計は本エンドポイントの件数と一致しない。"
  }
}
応答のフィールド
フィールド型説明
releaseobject | null
release.release_idstring
release.statusstring値 building staged published withdrawn
release.created_atstring
release.published_atstring | null
release.data_as_ofstring
countsobject
counts.processed_totalinteger | null
counts.served_totalinteger | null
counts.released_totalinteger | null
counts.experimental_totalinteger | null
counts.changes_totalinteger | null
counts.schools_totalinteger | null
counts.quarantined_totalinteger | null
counts.machine_feature_rowsinteger | null
counts.position_sourceobject
machine_feature_coverageobject行収録率と、配信対象における主要機械特徴列の充足率
yearsobject
years.mininteger | null
years.maxinteger | null
generationsobject[]
generations[].idstring
generations[].statusstring値 experimental released deprecated
generations[].versioninteger
generations[].gen_idstring
generations[].model_familystring | null
generations[].modelstring | null
generations[].prompt_versionstring | null
generations[].output_contractstring
generations[].released_atstring | null
generations[].notesstring | null
generations[].evidenceobject | null
generations[].statsobject
metricsobject<integer>release_stats の生の metric→value マップ
counting_notesobject<string>
ステータスコード
  • 200 OK
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。

GET/v1/generations

言語化世代のカタログとガバナンス

キャッシュ public, max-age=300

例

curl "https://michiyomi.dev/v1/generations"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "default_generation": "gen2-qwen-local",
  "governance": "3層管理: ①行来歴(model/prompt_version/generated_at=不変の事実) ②世代(出力契約の単位。スキーマ・左右規約・純粋…",
  "generations": [
    {
      "id": "gen2-qwen-local",
      "status": "released",
      "version": 2,
      "gen_id": "gen2-qwen-local",
      "model_family": "qwen-local",
      "model": "sakamakismile/Qwen3.8-27B-MTP-NVFP4 / nvidia/Qwen3.6-27B-NVFP4 / qwen-vlm",
      "prompt_version": null,
      "output_contract": "v2: 純粋視覚・カメラ基準左右・image_file付きJSON",
      "released_at": "2026-08-22",
      "notes": "ローカルVLMによる言語化。releasedは配信採用状態を示し、モデル・推論設定間の判定基準が同一であることを保証しません。",
      "evidence": null,
      "stats": {…}
    },
    … ほか 1 件
  ]
}
応答のフィールド
フィールド型説明
default_generationstring | null
governancestring
generationsobject[]
generations[].idstring
generations[].statusstring値 experimental released deprecated
generations[].versioninteger
generations[].gen_idstring
generations[].model_familystring | null
generations[].modelstring | null
generations[].prompt_versionstring | null
generations[].output_contractstring
generations[].released_atstring | null
generations[].notesstring | null
generations[].evidenceobject | null
generations[].statsobject
ステータスコード
  • 200 OK
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。

GET/v1/provenance

リリースmanifestと来歴

別名 /v1/provキャッシュ public, max-age=300

provenance は Rootline ノード連鎖。released世代 gen1-codex に限った記録であり、 gen2-qwen-local には適用されない(provenance_scope で明示)。

例

curl "https://michiyomi.dev/v1/provenance"
応答(抜粋) · HTTP 200そのまま開く ↗
// 共通の項目(snapshot・license など)は省略
{
  "release": {
    "release_id": "2026-09-13-r1",
    "status": "published",
    "data_as_of": "2026-09-13",
    "published_at": "2026-09-12T22:00:00Z",
    "manifest": {…}
  },
  "provenance": {
    "dataset_node": "dc263171b410",
    "repository": "rootline (追記型来歴リポジトリ、全ノードverify=ビット同一再現を確認)",
    "nodes": […]
  },
  "provenance_scope": "src/prov.json の来歴連鎖(Rootlineノード)は released世代 gen1-codex に限った記録であり、gen2-qwen-…",
  "verification_method": "経年変化(changes)の裁定は、同一モデル系列の文脈分離した別セッションによる反証優先の再検証。モデル系列そのものに由来する系統誤差は残りうるため、…"
}
応答のフィールド
フィールド型説明
releaseobject | null
provenanceobject
provenance_scopestring
verification_methodstring
ステータスコード
  • 200 OK
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。

GET/v1

API自己記述JSON

キャッシュ public, max-age=300

エンドポイント一覧・alias・配信ポリシー・ライセンスを機械可読JSONで返す。

例

curl "https://michiyomi.dev/v1"
応答(抜粋) · HTTP 200そのまま開く ↗
{
  "api_version": "v1",
  "name": "michiyomi API",
  "description": "Read-only API for structured VLM descriptions of Mapillary street-level imag…",
  "description_ja": "Mapillary街路画像をVLMで構造化テキスト化した『座標×言語化』の配信API。同一地点に複数の言語化世代が共存し、既定ではreleased世代の…",
  "data_language": "ja",
  "endpoints": {
    "GET /v1/meta": "Authoritative release counts and verbalization-generation catalog",
    "GET /v1/scenes/nearby": "Nearby scenes. Requires lat/lon; supports radius_m, limit, quality, generati…",
    "GET /v1/amenities/nearby": "Nearby amenity observations (kind=vending_machine|toilet|bench), with captur…",
    "POST /amenities/search": "Same amenity search with coordinates in a JSON body (keeps visitor locations…",
    "GET /v1/scenes/{id}": "Scene detail. Select metadata, deterministic machine features, and/or Japane…",
    "GET /v1/coverage": "Honest coverage report around a coordinate; zero means no recorded data, not…",
    "GET /v1/changes/nearby": "Nearby adjudicated longitudinal change observations with category/status fil…",
    "GET /v1/changes/{change_id}": "Full change evidence and verification metadata",
    "GET /v1/schools/search": "Partial-name search for elementary schools (NFKC normalized; up to 10 result…",
    "GET /v1/generations": "Verbalization-generation catalog and governance metadata",
    "GET /v1/provenance": "Release manifest and gen1 provenance chain",
    "POST /mcp": "Stateless MCP Streamable HTTP endpoint (2025-06-18 compatible; no SSE)"
  },
  "aliases": {
    "GET /v1/nearby": "GET /v1/scenes/nearby",
    "GET /v1/node/{id}": "GET /v1/scenes/{id}",
    "GET /v1/prov": "GET /v1/provenance"
  },
  "policies": [
    "The default is quality=released. Experimental generations are returned only …",
    "Scenes with anomalous capture timestamps (quarantined=1) are excluded from n…",
    … ほか 2 件
  ],
  "policies_ja": [
    "既定は quality=released。experimental世代は quality=include_experimental / experime…",
    "撮影時刻が異常なシーン(quarantined=1)は近傍検索・統計から除外され、IDの直接参照でのみ取得できる。",
    … ほか 2 件
  ],
  "request_id": "71eea11c-97ba-4f03-bc98-0dc10136ac00",
  "license": {
    "schema_version": 2,
    "id": "LicenseRef-michiyomi-layered",
    "url": "https://michiyomi.dev/docs/license/",
    "policy_version": "2026-10-03",
    "summary": "観測データ(本文・構造化JSON・機械層の値・経年変化)は CC BY 4.0 で使えます。AIの回答・分析・アプリの表示・個別の転記には、出典もロゴも…",
    "summary_en": "Observation data (text, structured JSON, machine features, changes) is avail…",
    "obligations": {
      "use_in_results": ["none"],
      "display_or_quote_records": ["none"],
      "redistribute_as_data": ["attribution", "upstream_not_licensed_if_bulk", "source_notice_if_bulk"]
    },
    "notices": [
      "mapillary_reference_not_licensed",
      "photos_not_included",
      … ほか 4 件
    ],
    "layers": {
      "observation": "CC-BY-4.0",
      "mapillary_reference": "NOASSERTION",
      "public_sector": "CC-BY-4.0"
    },
    "linked_only": { "photo": "CC-BY-SA-4.0" },
    "attribution": "出典: みちよみ(michiyomi.dev、Mapillary の街路写真より)、CC BY 4.0(https://creativecommons.…",
    "attribution_en": "Source: michiyomi (michiyomi.dev), from Mapillary street-level photos, CC BY…",
    "public_sector_sources": ["「国土数値情報(行政区域データ)」(国土交通省)を加工して作成"],
    "mapillary": "https://www.mapillary.com",
    … ほか 6 項目
  }
}
応答のフィールド
フィールド型説明
namestring
descriptionstring
endpointsobject<string>
aliasesobject<string>
policiesstring[]
ステータスコード
  • 200 OK

MCP

AIエージェント向けの、場所で引く MCP サーバーです。つなぎ方・ツールの使い方はAIから使うへ。言葉の印象で風景を探す MCP(/explore/mcp)は別のサーバーで、この定義には含まれません。

POST/mcp

MCP (Model Context Protocol) Streamable HTTP

キャッシュ no-store

stateless Streamable HTTP。SSEもセッションIDも使わず、JSON単発応答のみを返す。プロトコルは 2025-06-18 互換。

ツール(11個): get_metadata、find_school、coverage、describe_location、get_scene、changes_near、find_amenities、describe_street、describe_area、find_street、find_area。使い方は AIから使うへ。

initialize は このサーバが実際に話せるバージョン (2025-06-18 / 2025-03-26 / 2024-11-05)を要求されたときだけそれをエコーし、それ以外は 2025-06-18 を返す(未確認の将来仕様への対応は宣言しない)。

制限:

条件応答
body > 64KBHTTP 413 payload_too_large
malformed JSONHTTP 400 / JSON-RPC -32700
空batchHTTP 400 / JSON-RPC -32600
batch > 20HTTP 400 / JSON-RPC -32600
batch内の tools/call N件MCP の回数の上限を N 回分使う(1つでも超過なら HTTP 429)
id メンバー無し(通知)HTTP 202(本文なし)・ツールは実行されない
unknown methodJSON-RPC -32601
unknown toolresult.isError = true(データベースには問い合わせない)

エラーに stack / SQL / 内部path は含めない。

OpenAPI 定義との違い(2026-10-03 に本番で確認)
openapi.yaml の説明にはツールが5つだけ載っていますが、本番は11個です(上の一覧は本番の tools/list から)。

本文(JSON)

名前場所型説明
jsonrpc必須本文"2.0"
id本文string | integer | null"id" メンバーが無いものが通知(JSON-RPC 2.0 §4.1)。サーバは一切応答せず、 tools/call であってもツールは実行されない(HTTP 202・本文なし)。 "id": null は「idメンバーがある」= リクエストであり、null がエコーされる。
method必須本文string例 initialize ping tools/list tools/call notifications/initialized
params本文object

例

curl -X POST "https://michiyomi.dev/mcp" -H "content-type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
応答(抜粋) · HTTP 200
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      {
        "name": "get_metadata",
        "description": "Read the current published snapshot, authoritative counts, recorded capture-…",
        "inputSchema": {…},
        "annotations": { "readOnlyHint": true, "destructiveHint": false, "openWorldHint": true },
        "outputSchema": {…}
      },
      {
        "name": "find_school",
        "description": "Search the recorded Tokyo elementary-school name catalog, including 23 wards…",
        "inputSchema": {…},
        "annotations": { "readOnlyHint": true, "destructiveHint": false, "openWorldHint": true },
        "outputSchema": {…}
      },
      … ほか 9 件
    ]
  }
}
ステータスコード
  • 200 JSON-RPC応答(単発またはbatch)
  • 202 通知のみのため本文なし
  • 400 parse error / invalid request(JSON-RPCエラー形)
  • 405 read専用API。/v1 への POST/PUT/DELETE/PATCH と GET /mcp は常に405。 admin/write エンドポイントは存在しない。
  • 413 リクエストボディが64KBを超えた
  • 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。

互換の別名

古いクライアントのために、次の別名も受け付けます。新しく書くときは右の名前を使ってください。

別名同じもの
GET /v1/nearbyGET /v1/scenes/nearby
GET /v1/node/{id}GET /v1/scenes/{id}
GET /v1/provGET /v1/provenance

このページは tools/gen_api_reference.py が api/openapi.yaml と本番の応答から作りました。