APIリファレンス
概要
このページでは、Nibomo が現在外部 AI エージェント向けに公開している API 仕様を説明します。
クライアントが MCP に対応している場合は、MCP コネクタ を使うのが最も簡単な接続方法で、この同じデータサーフェスをラップしています。このページでは、CLI エージェントが使う HTTP ディスカバリー、SQL、ガイド、復習の仕様を説明します。
最初に参照する正規のディスカバリー用エントリポイントは次のとおりです。
GET https://api.flashcards-open-source-app.com/v1/
同じ内容のディスカバリーレスポンスは GET /v1/agent からも取得できますが、主要な公開エントリポイントは /v1/ です。
このレスポンスには、エージェントが次の手順を進めるための情報が含まれます。
- メール OTP ログインを開始する
- OTP を長期間利用できる API キーに交換する
- アカウント情報を取得する
- ワークスペースを作成または選択する
- 公開されている SQL インターフェースの利用に進む
- リファレンスガイドを取得し、カードを 1 枚ずつ復習する
ランタイムディスカバリとソース
OpenAPI は利用できません。次の 4 つの旧仕様 URL は、スキーマではなく "openapiAvailable": false を含む同じ JSON ディスカバリ通知を返すようになりました。
https://api.flashcards-open-source-app.com/v1/agent/openapi.jsonhttps://api.flashcards-open-source-app.com/v1/agent/swagger.jsonhttps://api.flashcards-open-source-app.com/v1/openapi.jsonhttps://api.flashcards-open-source-app.com/v1/swagger.json
現在のランタイムディスカバリには GET https://api.flashcards-open-source-app.com/v1/ を使用してください。返された docs.discoveryUrl でランタイムルートを確認し、docs.source.agentRoutesUrl で実装の詳細を確認してください。
認証の開始手順
OTP を使った認証開始フローは auth サービスで実行します。
POST https://auth.flashcards-open-source-app.com/api/agent/send-codePOST https://auth.flashcards-open-source-app.com/api/agent/verify-code
手順は次のとおりです。
GET /v1/を呼び出す- ユーザーのメールアドレスを
send-codeに送信する - レスポンスから
otpSessionTokenを取得する - ユーザーに最新の 8 桁のメールコードを入力してもらう
code、otpSessionToken、labelを指定してverify-codeを呼び出す- 返却された API キーを、チャットメモリとは別の場所に保存する
推奨する環境変数:
export FLASHCARDS_OPEN_SOURCE_API_KEY="fca_ABCDEFGH_0123456789ABCDEFGHJKMNPQRS"
認証済みリクエストでは、次のヘッダーを使用します。
Authorization: ApiKey <key>
認証開始フローの例:
curl https://api.flashcards-open-source-app.com/v1/
curl -X POST https://auth.flashcards-open-source-app.com/api/agent/send-code \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com"}'
curl -X POST https://auth.flashcards-open-source-app.com/api/agent/verify-code \
-H "Content-Type: application/json" \
-d '{
"code":"12345678",
"otpSessionToken":"...",
"label":"Codex on MacBook"
}'
ログイン後に利用できるエージェント向け API
認証後に利用できる現在のエージェント向け API は次のとおりです。
GET /v1/agent/meGET /v1/agent/workspacesPOST /v1/agent/workspacesPOST /v1/agent/workspaces/{workspaceId}/selectPOST /v1/agent/sql/query(読み取り専用)POST /v1/agent/sql/execute(書き込み)GET /v1/agent/guide/{topic}(読み取り専用)POST /v1/agent/reviews/next(読み取り専用)POST /v1/agent/reviews/reveal(読み取り専用)POST /v1/agent/reviews/submit(書き込み)
一般的な初期設定の流れは次のとおりです。
GET /v1/agent/meGET /v1/agent/workspaces?limit=100- 必要であれば
POST /v1/agent/workspacesに{"name":"Personal"}を送る - 必要であれば
POST /v1/agent/workspaces/{workspaceId}/selectを呼ぶ - 読み取りには
POST /v1/agent/sql/queryを、書き込みにはPOST /v1/agent/sql/executeを使う
ワークスペースの選択は、API キーごとの接続単位で明示的に行います。次の手順を推測するのではなく、各レスポンスに含まれる instructions とランタイムルート用の docs.discoveryUrl、実装の詳細用の docs.source.agentRoutesUrl に従ってください。
SQL ルートと復習ルートは、JSON ボディ内のオプションの workspaceId も受け付けます。これを指定すると、選択を変更せずに 1 回の呼び出しだけそのワークスペースを対象にします。省略すると選択中のワークスペースを使います。選択も workspaceId もない場合、これらのルートは 409 WORKSPACE_SELECTION_REQUIRED を返します。
SQL インターフェース
POST /v1/agent/sql/query は厳密な読み取り専用インターフェース(SHOW TABLES、DESCRIBE、SHOW COLUMNS、SELECT)で、POST /v1/agent/sql/execute は書き込み用インターフェース(INSERT、UPDATE、DELETE)です。1 回の呼び出しはすべて読み取り、またはすべて書き込みのいずれかでなければなりません。
これは意図的に制限されたものであり、完全な PostgreSQL ではありません。このドキュメントはサポートされる方言だけを扱い、PostgreSQL 互換性リファレンスではありません。
読み取り経路がデータを修復したり、スケジュールを再計算したり、カード状態を変更したりすることはありません。カードとデッキの書き込みにはすべて POST /v1/agent/sql/execute を使います。SQL では review_events や FSRS のスケジューリング状態を書き込めません。復習は POST /v1/agent/reviews/submit で記録します。
現在利用できる文の種類:
SHOW TABLESDESCRIBE <resource>SHOW COLUMNS FROM <resource>SELECTINSERTUPDATEDELETE
現在公開されている論理リソース:
workspacecardsdecksreview_events
注意事項:
LIMITのデフォルト値は100で、上限も100- 安定したページネーションが必要な場合は
ORDER BYを使う - スキーマを確認するには
SHOW TABLESまたはDESCRIBE cardsを使う - すべての SQL 呼び出しは 1 つのワークスペース(ボディ内の
workspaceId、または選択中のワークスペース)に限定される
リクエスト例:
curl -X POST https://api.flashcards-open-source-app.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{"sql":"SHOW TABLES"}'
カード取得の例:
curl -X POST https://api.flashcards-open-source-app.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"sql":"SELECT card_id, front_text, back_text, tags FROM cards ORDER BY updated_at DESC LIMIT 20 OFFSET 0"
}'
更新の例:
curl -X POST https://api.flashcards-open-source-app.com/v1/agent/sql/execute \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"sql":"UPDATE cards SET back_text = '\''Updated answer'\'' WHERE card_id = '\''50b5b928-7f04-4cc8-878d-6cd0e8b98474'\''"
}'
リモート MCP サーバーも https://mcp.nibomo.com/mcp で利用でき、OAuth 2.1(Dynamic Client Registration + PKCE)を使用します。同じ SQL の分割を sql_query(厳密な読み取り専用)と sql_execute(書き込み)として公開し、さらに list_workspaces、get_guide、復習ツールの next_review_card、reveal_answer、submit_review も提供します。詳しくは MCP コネクタ を参照してください。
安全性と範囲
SQL サーフェスは生の PostgreSQL ではなく、パーサーで強制される制限付きの方言です。ガードレールは次のとおりです。
- クローズドな文の許可リスト: 読み取りは
SHOW TABLES、DESCRIBE、SHOW COLUMNS、SELECTのみ、書き込みはINSERT、UPDATE、DELETEのみです。それ以外はすべて解析時に拒否されます。 - 限定されたリソース: 文が触れられるのは
workspace、cards、decks、review_eventsの各リソースだけです。 - ワークスペース単位の範囲: すべての文は、アクセスできる 1 つのワークスペース(リクエストボディ内の
workspaceId、または選択中のワークスペース)に限定され、テナント間アクセスはできません。 - 厳格なリクエストボディ: SQL ルートと復習ルートは未知のボディフィールドを拒否します。そのため、
workspaceIdのスペルを誤ると、選択中のワークスペースに対して実行されるのではなく失敗します。 - 上限: 1 文あたり最大
100行、1 バッチあたり最大50文、結果の上限はおよそ12kトークンです。変更バッチはアトミックに適用されます。 - 読み取り/書き込みの分離:
sql_queryとlist_workspacesは厳密な読み取り専用(readOnlyHint)であり、データを修復したり、スケジュールを再計算したり、カード状態を変更したりすることはありません。sql_executeは唯一の SQL 書き込みツールで、書き込みを行います(destructiveHint)。1 回の呼び出しはすべて読み取りかすべて書き込みのどちらかでなければなりません。SQL ではreview_eventsや FSRS のスケジューリング状態を書き込めません。復習を記録できるのはPOST /v1/agent/reviews/submit(MCP ではsubmit_review)だけです。
ガイド
GET /v1/agent/guide/{topic} は 1 つのリファレンスガイドを data.guide で返します。これは MCP の get_guide ツールが返すものと同じ本文です。トピック:
sql_dialect: SQL の完全な文法、制限、例card_authoring: カードの契約、タグ、重複チェック、書式bulk_authoring: 大規模な書き込み作業の分割と検証review_flow: 復習と評価のループ
未知のトピックを指定すると、サポートされているトピックの一覧とともに 400 が返されます。カードを作成する前、一括で書き込む前、または復習を実行する前には対応するガイドを取得し、文が拒否された後は sql_dialect を読み直してください。
curl https://api.flashcards-open-source-app.com/v1/agent/guide/sql_dialect \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY"
復習
復習ルートを使うと、エージェントは学習者にカードを 1 枚ずつ出題し、各評価をカードの FSRS スケジュールに保存できます。これらのルートは MCP の復習ツールと同じ JSON 引数を受け取ります。
POST /v1/agent/reviews/nextはcardIdとfrontTextを含むcardを返し、期日を迎えたカードがない場合はcard: nullを返します。オプションのtags(いずれかに一致)またはdeckIdでキューを絞り込めますが、両方を同時には指定できません。ボディのないリクエストも有効です。POST /v1/agent/reviews/revealはcardIdを必須とし、そのカードのbackTextを返します。POST /v1/agent/reviews/submitはcardId、クライアントで生成したreviewIdUUID、Again、Hard、Good、Easyのいずれかのrating、学習者の IANAreviewedTimeZoneを必須とします。サーバーが復習時刻を記録し、dueAt、state、reps、lapsesを含むカードの新しいスケジュールを返します。
3 つのルートはすべてオプションの workspaceId を受け付けます。送信前に reviewId を保存しておき、送信結果が不確かな場合はまったく同じリクエストで再試行してください。復習が二重に記録されることはありません。復習ルートは次のレスポンスを返すこともあります。
409 REVIEW_EVENT_CONFLICT: その復習はすでに記録されており、error.details.reviewScheduleにカードの現在のスケジュールが含まれます。409 REVIEW_ID_CARD_MISMATCH: そのreviewIdはすでに別のカードの復習を識別しているため、何も保存されていません。新しいreviewIdで再度送信してください。409 REVIEW_STALE: カードに保存されている復習時刻が現在のサーバー時刻と同じか、それより後です。別のカードを復習してください。400 REVIEW_INPUT_INVALID: 引数が欠けている、無効である、またはサポートされていません。tagsとdeckIdの併用や、ワークスペースで使われていないタグの指定もこれに含まれます。
送信の例:
curl -X POST https://api.flashcards-open-source-app.com/v1/agent/reviews/submit \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"cardId":"693c4863-28a2-45e8-8f55-9fa31fc95ff2",
"reviewId":"429bb7cc-40fb-49f3-bb50-48a5db2826d1",
"rating":"Good",
"reviewedTimeZone":"Europe/Sofia"
}'
Web クライアント向け API と同期 API
Nibomo には、人が利用するクライアント向けの別 API とオフラインファースト同期用 API もありますが、これらは外部エージェント向けの主要な契約ではありません。
- ブラウザ向けフローでは、共有ドメインの Cookie と CSRF 保護を使用します
- オフラインファーストのクライアントは
/v1/workspaces/{workspaceId}/sync/pushと/v1/workspaces/{workspaceId}/sync/pullを使用します - これらの同期ルートは、外部エージェント向けインターフェースとは別です