1) 入口(ベース URL とバージョン確認)
- 典型例:
https://{host}/mt/mt-data-api.cgi/v6/...(設置パスは環境により異なる) - 稼働&APIバージョン確認は /version(ここだけはバージョン接尾辞なしでOK):
例)GET /mt-data-api.cgi/version(Data API の apiVersion / endpointVersion が返る) (Movable Type)
2) 認証(v6)
最短手順:アクセストークンを取得 → 以後ヘッダー送信
-
セッション&アクセストークン発行(ログイン相当)
POST /mt-data-api.cgi/v6/authentication Content-Type: application/x-www-form-urlencoded username=<サインイン名>&password=<Webサービス用PW>&clientId=<任意の文字列>成功すると
accessToken / sessionId / expiresInが返る。以降のAPIは
X-MT-Authorization: MTAuth accessToken=<TOKEN>を付与。(Movable Type) -
ブラウザでログイン画面経由(リダイレクト型)
GET /mt-data-api.cgi/v6/authorization?clientId=...&redirectUrl=https://...サインイン成功で
redirectUrl#_loginに遷移。(Movable Type) -
トークンの追加発行 / 失効
- 追加発行:
POST /v6/token(X-MT-Authorization: MTAuth sessionId=...でも可) - 無効化:
DELETE /v6/token(トークン失効)やDELETE /v6/authentication(ログアウト相当) (Movable Type)
- 追加発行:
注:Webサービス用パスワードを使う運用・用語は Data API 共通の前提(v系で共通)。(MovableType.org)
3) 主要リソース(よく使うもの)
-
サイト:
GET /v6/sites、/v6/sites/{site_id}ほか -
コンテンツタイプ:
GET /v6/sites/{site_id}/contentTypes -
コンテンツデータ:
一覧GET /v6/sites/{site_id}/contentTypes/{ct_id}/data?limit=&offset=&sortBy=&sortOrder=
取得GET /v6/sites/{site_id}/contentTypes/{ct_id}/data/{cd_id}
作成POST、更新PUT、削除DELETEも対応(権限要)。(Movable Type)
一覧系でよく使う共通クエリ:
limit/offset/sortBy/sortOrder/fields/includeIds/excludeIdsなど(v系で共通仕様)。(Movable Type)
4) 検索(v6)
4-1. Data API の /search(記事/ページ+条件)
GET /mt-data-api.cgi/v6/search
?search=foo AND bar
&blog_id={site_id}
&limit=20&offset=0
&SearchSortBy=created_on
&SearchResultDisplay=descend
search はブール検索。category:"看護師"、author:xxx などのフィルタ構文あり。(Movable Type)
4-2. コンテンツデータを Data API で検索
GET /mt-data-api.cgi/v6/search
?search=看護師 AND 奈良
&blog_id={site_id}
&cdSearch=1
&limit=20&offset=0
cdSearch=1 を付けると検索対象がコンテンツデータになる(重複ヒットの既知問題は 7.9.9 で修正済み)。(MovableType.org)
4-3. mt-cdsearch.cgi との使い分け
-
mt-cdsearch.cgi … 公開サイト向け“コンテンツデータ専用”検索 CGI。
SearchContentTypes(対象CT指定)、content_field(検索対象フィールド限定)などが使えてフォーム実装が簡単。(Movable Type) - Data API /v6/search … JS/外部サービス連携で使いやすいREST。複合条件+APIレスポンスを扱いたいときに。(MovableType.org)
5) CORS(フロント直叩き時の必須設定)
フロント(ドメインA)→ MT(ドメインB)で fetch/axios するなら、サーバ側で DataAPICORSAllowOrigin を設定(mt-config.cgi)。例:
DataAPICORSAllowOrigin http://localhost:5173, https://www.example.com
許可オリジン以外からはブラウザが弾く。(MovableType.org)
6) 403/404 の“あるある”(v6でも同様)
-
403 Forbidden:アクセストークン未付与/失効、権限不足。
X-MT-Authorizationを再確認。(Movable Type) -
404 Not Found:パスやバージョン違い(例:実装が v6 なのに
/v7/...を叩いた等)、IDの取り違え。まず/versionで実装確認。(Movable Type)
7) そのまま動くサンプル
7-1. curl(トークン取得→一覧)
# (A) ログイン(トークン取得)
curl -s -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=USER&password=WEBAPI_PASS&clientId=myapp" \
https://{host}/mt/mt-data-api.cgi/v6/authentication
# => {"accessToken":"...","sessionId":"...","expiresIn":...}
# (B) コンテンツデータ一覧(公開分のみ/未公開含むには権限+トークン)
curl -s \
-H "X-MT-Authorization: MTAuth accessToken=YOUR_TOKEN" \
"https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}/data?limit=20&offset=0"
(エンドポイントとパラメータ仕様は v6 リファレンスに準拠) (Movable Type)
7-2. fetch(v6 + CORS 済みサーバ前提)
const token = '...'; // /v6/authentication の accessToken
const url = '/mt/mt-data-api.cgi/v6/search'
+ '?cdSearch=1&blog_id=2&limit=20'
+ '&search=' + encodeURIComponent('看護師 AND 奈良');
fetch(url, { headers: { 'X-MT-Authorization': 'MTAuth accessToken=' + token } })
.then(r => r.json())
.then(data => console.log(data.items, data.totalResults));
(CORS は DataAPICORSAllowOrigin で許可する) (MovableType.org)
8) 実例メモ
- /version → /v6/ の順で確認し、環境の実装バージョンに合わせて叩く。(Movable Type)
-
検索の安定化:
limit/offsetの他、SearchSortBy(例created_on)やSearchResultDisplay(ascend/descend)を使う。(Movable Type) - 検索の重複ヒットを踏んだら MT 本体のバージョン確認(7.9.9 で修正)。(MovableType.org)
**ブラウザからそのまま開ける “GET系” エンドポイントURL(v6)**を用途別にまとめました。
(※トークンなしで開くと「公開データのみ」や「エラー」になる点に注意。認証が要る操作は curl/JS などでヘッダー付与が必要です)
0) 前提(置き換え用)
-
{host}:例www.example.com -
{site_id}:サイトID(ブログID) -
{ct_id}:コンテンツタイプID -
{cd_id}:コンテンツデータID
すべて以下のように置き換えてください:
https://{host}/mt/mt-data-api.cgi/v6/...
1) 稼働確認
APIバージョン確認(認証不要)
https://{host}/mt/mt-data-api.cgi/version
→ apiVersion / endpointVersion が JSON で返ります。
2) 認証(ブラウザ経由のリダイレクト方式)
ログイン画面→戻り先にリダイレクト(認証フローの開始)
https://{host}/mt/mt-data-api.cgi/v6/authorization
?clientId=myapp
&redirectUrl=https%3A%2F%2F{host}%2Fafter-login.html
- 認証成功後に
redirectUrlへ遷移します(#_loginが付く挙動の環境もあり)。 - 以降のAPI呼び出しは通常、JSからトークンヘッダーを付けて行います(ブラウザのURL直叩きではヘッダーを付けられません)。
3) サイト・コンテンツタイプの取得(一覧系)
サイト一覧(公開情報の範囲で)
https://{host}/mt/mt-data-api.cgi/v6/sites?limit=50&offset=0
コンテンツタイプ一覧(サイト配下)
https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes?limit=50&offset=0
特定コンテンツタイプの詳細
https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}
(フィールド定義などの確認に便利)
4) コンテンツデータ(CD)の取得(閲覧系)
一覧(CD)
https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}/data
?limit=20&offset=0
&sortBy=modified_on&sortOrder=descend
1件取得(CD)
https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}/data/{cd_id}
注:未公開のCDやドラフトを見たい場合は、通常は認証+権限が必要(ブラウザURL直叩きだけでは不可)。
5) 検索(Data API /search)
5-1. 記事/ページなど(全文検索)
https://{host}/mt/mt-data-api.cgi/v6/search
?blog_id={site_id}
&search=%E7%9C%8B%E8%AD%B7%E5%B8%AB%20AND%20%E5%A5%88%E8%89%AF
&limit=20&offset=0
&SearchSortBy=created_on
&SearchResultDisplay=descend
-
search=はURLエンコード必須(上例は「看護師 AND 奈良」)。 - category/author などのフィルタ構文も使用可。
5-2. コンテンツデータを検索(cdSearch=1)
https://{host}/mt/mt-data-api.cgi/v6/search
?blog_id={site_id}
&cdSearch=1
&search=%E7%9C%8B%E8%AD%B7%E5%B8%AB%20AND%20%E5%A5%88%E8%89%AF
&limit=20&offset=0
- CDを対象に全文検索します。
- 項目単位で厳密に絞りたい場合は、後述の mt-cdsearch.cgi の方がフォーム実装しやすいことが多いです。
6)(参考)mt-cdsearch.cgi(コンテンツデータ専用CGI)
特定のコンテンツタイプを対象に検索
https://{host}/mt/mt-cdsearch.cgi
?site_id={site_id}
&SearchContentTypes={ct_id}
&q=%E7%9C%8B%E8%AD%B7%E5%B8%AB%20AND%20%E5%A5%88%E8%89%AF
&limit=20&offset=0
検索対象フィールド(ID)を限定
https://{host}/mt/mt-cdsearch.cgi
?site_id={site_id}
&SearchContentTypes={ct_id}
&content_field=16,33,34
&q=%E7%9C%8B%E8%AD%B7%E5%B8%AB
&limit=20
-
content_fieldは フィールドID のカンマ区切り。 - 厳密に「どのフィールドを検索するか」指定したいときに有用です。
- 公開サイトの検索フォームから直で叩きやすいのが利点。
7) URLエンコードのヒント
-
半角スペース →
%20 -
全角文字(日本語)もエンコード必須。
-
AND,OR,()などを入れる場合も、全体をencodeURIComponent(...)で包むのが安全。-
例:
search=の値は JS ならconst q = encodeURIComponent('看護師 AND 奈良');
-
8) 403/404で詰まったら
- 403(Forbidden):未認証、または権限不足。公開範囲外はトークン必須。
-
404(Not Found):パス/ID/バージョン違い。まず
.../versionで実装を確認。 -
CORS:フロントJSから別ドメインの Data API を叩くときは
mt-config.cgiの
DataAPICORSAllowOriginにオリジン(例:https://www.example.com)を登録。
**Movable Type Data API v6 の「認証」**だけを、そのまま使える形で整理します。
(前提:MTの管理側で「Webサービス用パスワード」を発行済・必要な権限ロールが付与済み)
1) 認証の全体像(v6)
-
認証は大きく 2パターン
-
API直叩き(パスワード型):
/v6/authenticationにユーザー名+Webサービス用PWを投げて accessToken を取得 -
ブラウザ認証(リダイレクト型):
/v6/authorization?redirectUrl=...でMTのログイン画面→同意→戻り先へ。戻ってから API を呼ぶ
-
API直叩き(パスワード型):
-
以後の API 呼び出しは、HTTPヘッダに
X-MT-Authorization: MTAuth accessToken=<アクセストークン>を付与 -
トークンは一定時間で失効。必要に応じて
/v6/token(再発行)や/v6/authenticationの呼び直しで更新 -
フロントから直接叩くならCORS(mt-config.cgi の DataAPICORSAllowOrigin)設定が必要
2) 最短レシピ(API直叩き)
2-1. アクセストークン取得(ログイン)
POST /mt/mt-data-api.cgi/v6/authentication
Content-Type: application/x-www-form-urlencoded
username=<サインイン名>&password=<Webサービス用PW>&clientId=<任意の文字列>
レスポンス例
{
"accessToken": "xxxxxxxx",
"sessionId": "yyyyyyyy",
"expiresIn": 3600,
"user": { "id": 1, "displayName": "Admin" }
}
-
accessToken… API呼び出し時に使う -
sessionId… 追加トークンの発行など一部操作で使う場合がある -
expiresIn… 秒数。切れたら再取得
2-2. 認証付きでAPIを叩く
GET /mt/mt-data-api.cgi/v6/sites/1/contentTypes/3/data?limit=20
X-MT-Authorization: MTAuth accessToken=xxxxxxxx
2-3. トークンの再発行・失効
-
追加発行(ローテーション運用向け)
POST /mt/mt-data-api.cgi/v6/token X-MT-Authorization: MTAuth sessionId=yyyyyyyy -
トークンを明示的に失効
DELETE /mt/mt-data-api.cgi/v6/token X-MT-Authorization: MTAuth accessToken=xxxxxxxx -
サインアウト(サーバ側セッション終了)
DELETE /mt/mt-data-api.cgi/v6/authentication
3) ブラウザ認証フロー(リダイレクト型)
用途:SPA/フロントアプリで、ユーザーにMTログイン画面で認証してもらう
- 認証開始(ユーザーをMTへリダイレクト)
GET /mt/mt-data-api.cgi/v6/authorization
?clientId=myapp
&redirectUrl=https%3A%2F%2Fwww.example.com%2Fafter-login.html
-
認証成功 →
redirectUrlへ戻る(実装により#_loginフラグが付く場合あり) -
戻り先で、必要なら
/v6/authenticationを呼んでaccessTokenを取得
(※リダイレクトだけではトークンが自動で手に入らない構成も多い。画面戻り後に「ログイン済み/セッションあり」状態を使ってトークンを取り直す、という実装にしておくと安全)
4) フロントJSの基本形(fetch)
// ① 起動時:まだトークンがなければ /v6/authorization へ誘導するUIを出す or
// サーバ側で /v6/authentication を代理実行してトークンを返すエンドポイントを用意する
async function loginAndGetToken(username, webServicePassword) {
const params = new URLSearchParams({
username,
password: webServicePassword,
clientId: 'myapp'
});
const res = await fetch('/mt/mt-data-api.cgi/v6/authentication', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params
});
const json = await res.json();
return json.accessToken; // これをメモリに保持(localStorageは避けるのが無難)
}
async function getContentData(token, siteId, ctId) {
const url = `/mt/mt-data-api.cgi/v6/sites/${siteId}/contentTypes/${ctId}/data?limit=20&offset=0`;
const res = await fetch(url, {
headers: { 'X-MT-Authorization': 'MTAuth accessToken=' + token }
});
if (res.status === 401 || res.status === 403) {
// 期限切れや権限不足。トークン更新 or 再ログイン
}
return await res.json();
}
セキュリティ観点では、トークンをブラウザの永続ストレージ(localStorage等)に保存しない方が安全です(XSS対策)。可能なら自前バックエンドを挟み、サーバ側でトークンを保持→フロントからは自サーバへ叩く“BFFパターン”が堅いです。
5) CORS(クロスオリジン)
-
別ドメイン/ポートのフロントから Data API を直接叩く場合は、mt-config.cgi に
DataAPICORSAllowOrigin https://www.example.com, http://localhost:5173のように許可オリジンを設定
-
これがないと、正しいトークンでもブラウザが事前検証(Preflight)でブロックします
6) よくあるエラーと対処
-
401/403:
-
X-MT-Authorizationヘッダがない/不正、トークン期限切れ、権限不足 - Webサービス用パスワードの誤り(通常パスワードと別物)
- 対象データが未公開で、閲覧権限がない
-
-
404:
-
/v6/...のバージョン違いやパス/IDの間違い - まず
.../versionで稼働バージョンを確認
-
-
CORSエラー:
-
DataAPICORSAllowOrigin未設定/一致していない - 開発中は
http://localhost:<port>を必ず許可に入れる
-
7) 運用のコツ(安全&安定)
- 最小権限:運用ユーザーに必要最小限のロールを割り当てる
-
トークン寿命に備える:
expiresInを見て自動更新の仕組みを用意する - BFF構成:可能なら自前バックエンドでトークン隠蔽。フロントは自サーバだけを叩く
- ログと監視:401/403/404の頻度、CORS失敗をサーバアクセスログで把握
- HTTPS必須:トークンは平文なのでTLSで保護(本番は常時HTTPS)
8) cURL ひな型
# 1) ログイン(トークン取得)
curl -s -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=USER&password=WEBAPI_PASS&clientId=myapp" \
https://{host}/mt/mt-data-api.cgi/v6/authentication
# => {"accessToken":"...","sessionId":"...","expiresIn":...}
# 2) 認証付きGET
curl -s \
-H "X-MT-Authorization: MTAuth accessToken=YOUR_TOKEN" \
"https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}/data?limit=20"
# 3) トークン失効
curl -s -X DELETE \
-H "X-MT-Authorization: MTAuth accessToken=YOUR_TOKEN" \
https://{host}/mt/mt-data-api.cgi/v6/token