3行でいうと
- 公式が用意していて手順を読めたのは、(1) ユーザースクリプト(文章生成の画面をTypeScriptで拡張)、(2) 画像のメタデータと、Vibeなどの書き出し・読み込み、(3) 物語のZIP書き出し、です。
- スクリプトは、隔離された環境(Web Worker)で動き、任意の通信と、ほとんどのアカウント情報には触れません。使える権限は、スクリプトがユーザーに許可を求める形です。
- スクリプトから呼べるAIの生成は、公式ページでは文章生成(GLM 4.6)で、出力と入力にトークンの制限があります。画像生成のAPIは、読んだ範囲のスクリプトのAPI一覧に見つかりません。
- 「Get Persistent API Token」は、アカウント設定のボタンです。新しく作ると古いものは無効になり、表示は1回だけです。トークンの使い道を書いた公式ページは、読めませんでした。
- 外部のAI(ChatGPT、Claudeなど)とMCPなどでつなぐ公式の手順は、見つかりませんでした。「ない」と断定はしません。
この記事は、公式の資料を2026年10月25日に読んでまとめたものです。この記事は、実際に使って確かめた記録ではありません。
先に結論
- 別のAIとつなぐ公式の手順は、読んだ範囲では見つかりませんでした。 公式ドキュメントの目次(docs.novelai.net/en)に、MCP、外部アシスタント向けのプラグイン、取り込み機能の項目はありません。FAQにも、APIキーやトークンの使い方、第三者のツールの記述はありません。
- 画像生成のAPIの仕様書は、読めませんでした。
api.novelai.net/docsを開いて取得できたのは「Swagger UI」という題名だけで、エンドポイントの一覧や認証の方式は読めていません。そのため、画像生成のAPIの呼び方(URL、送るデータ、返ってくるデータ)は、この記事では書きません。 - 手順を書けるのは、NovelAIの画面の内側にある入口です。 ユーザースクリプトは、画面の中で動く拡張の仕組みで、中から別のAIモデル(GLM 4.6)の文章生成を呼べる、と公式ドキュメントが書いています。AI同士の組み合わせとして読めるのは、ここだけです。
- 「どこへ何が渡るか」は、ページごとに書かれている範囲が違います。 書かれていないものは、「記載が見つからない」と書きます。
前提:用語をそろえる
- ユーザースクリプト:利用者が書いて、NovelAIの画面の中で動かす小さなプログラムです。TypeScript(JavaScriptの上位版)で書きます。
- Web Worker:ブラウザの中で、画面とは別に動くプログラムの実行場所です。公式は、スクリプトがここで隔離されて動く、と書いています。
- フック(hook):生成の前後などの決まったタイミングで、スクリプトの関数を呼ぶ仕組みです。
- API トークン:プログラムからサービスを呼ぶときの、パスワードのような文字列です。
- MCP:AIエージェントを外部の道具につなぐ規格です。NovelAIの公式資料で、読んだ範囲に記載はありません。
- メタデータ:画像ファイルに一緒に入る、生成の設定の情報です。
- Vibe:Vibe Transferで使う、参照画像から取り出した情報です(06を参照)。
連携の一覧(公式の記述の有無)
| 入口 | 公式の記述 | この記事で手順を書けるか |
|---|---|---|
| ユーザースクリプト | Scriptingのページ群にある(導入、API Reference、Hooks、Permissions など) | 書ける(下の「連携1」) |
| スクリプトからの文章生成(GLM 4.6) | Generating Text のページにある | 書ける(「連携2」) |
| スクリプトからの画像生成 | API一覧に見つからない。API Referenceの読んだ範囲に、画像生成の関数は見つからなかった(後半は未読) | 書けない |
| Persistent API Token | Accountのページに、ボタンと警告の記述がある | ボタンの場所と性質まで(「連携3」) |
| NovelAIのAPI仕様書 | api.novelai.net/docs は、題名のみ取得 |
書けない |
| 画像のメタデータ・保存・読み戻し | FAQ、チュートリアル、Historyに記述がある | 書ける(「連携4」) |
| Vibeの書き出し・読み込み | Vibe Transferのページに記述がある | 書ける(「連携4」) |
| 物語の書き出し | Accountのページ、FAQに記述がある | 書ける(「連携5」) |
| MCP、外部AI向けのプラグイン | 目次、FAQに記載が見つからない | 書けない |
連携1:ユーザースクリプトを開く・入れる・止める
手順:スクリプトの画面を開く
公式のScripting導入ページが書いている入口は、3通りです。
- 画面左のサイドバーの ガチョウのメニュー(goose menu) を開く。
- 物語を選んでいるときは、右サイドバーの advanced タブから開く。
- Alt+X を押す。
開くと User Scripts のモーダル(重なって出る画面)が出ます。公式は、ここでスクリプトの取り込み、作成、変更をする、と書いています。ボタンの表記は、読んだページには書かれていません。「公式で確認できていない」です。
2種類のスクリプト
| 種類(公式の表記) | 保存先 | 読み込まれるとき |
|---|---|---|
| Account scripts | アカウント | どの物語を選んでいても |
| Story scripts | その物語のファイル | その物語を開いているときだけ |
- スクリプトを実行する順番は、User Scriptsのモーダルに並ぶ順です。アカウントのスクリプトが先、物語のスクリプトが後、と公式のHooksページが書いています。
- 共有の仕組み(公開の場など)は、導入ページに書かれていません。公式の例のファイルは、ダウンロードして取り込む形と読めます(取り込みのボタンの表記は書かれていません)。
手順:公式の例のスクリプトを手に入れる
- 公式ドキュメントが案内する GitHub の
NovelAI/novelai-script-examplesを開く。 - 中身は、
scenarios/とscripts/のフォルダー、LICENSE(MIT)、README。READMEが挙げる例は、次のとおりです。 - Scripting Demo(Crystal Dragon Encounter、
.scenario):多くの機能を見せるシナリオ - Bookmarks:物語の履歴の位置を保存して戻る
- Editor Probabilities Everywhere:右クリックで、次のトークンの確率を見る
- Find & Replace:検索と置換
- Joke Generator:APIで文章を生成する基本の例
- Notes:エディターの下にメモのパネルを足す
- Smart Summarizer:選んだ文章の要約を、右クリックで出す
- Thought Generator:登場人物の考えを、物語の文脈から生成する
- Retry Harder:特別なプロンプトを使うもう1つのリトライボタン
- TTS with Character Voices:登場人物ごとの声で読み上げる
- ファイルは
.naiscriptと.scenarioの形式です。導入ページは、リンク先のファイルが新しいタブで開いたら、保存するか、ページを保存するよう書いています。 - 取り込みの手順(User Scriptsのモーダルのどのボタンか)は、READMEにも導入ページにも書かれていません。「公式で確認できていない」です。
注意:このリポジトリのページは、自分から「公式」とは書いていません。NovelAIのGitHub組織の下にあり、公式のスクリプトのドキュメントが案内しているリポジトリです。
手順:スクリプトで画面がおかしくなったとき
公式の導入ページが書いている手順です。
- URLの末尾に
?noscript=trueを付ける。 - ページを読み込み直す。スクリプトが読み込まれなくなる。
- User Scriptsのモーダルを開き、問題のスクリプトを無効にするか、取り除く。
スクリプトにできないこと(公式の制限)
- 任意のネットワーク通信はできない。
- ほとんどのアカウント情報には触れない。
- DOM(画面の部品)を直接いじれない。スクリプト用に決められた場所以外は変えられない。
- いつでも読み込みが解除される(無効にしたとき、物語を切り替えたとき、モーダルを閉じたとき)。大事なデータは、メモリではなくStorage APIに置く。
- 約束(Promise)のエラーは、画面にもコンソールにも出ない。
.catchかtry/catchで拾う。 - 開発の補助として、型の定義ファイル
http://novelai.net/scripting/types/script-types.d.tsが案内されています。
権限(Permissions):スクリプトがユーザーに許可を求める
公式のPermissionsのページが書いていることです。
| 操作 | 内容 |
|---|---|
| 持っているか調べる | api.v1.permissions.has('権限名') |
| 許可を求める | api.v1.permissions.request('権限名')。ユーザーに説明のダイアログが出て、許可か拒否を選ぶ。許可なら true、拒否なら false。すでに許可ずみなら、すぐ true |
| 許可ずみの一覧 | api.v1.permissions.list() |
公式の例(短いもの):
let granted = await api.v1.permissions.request('storyEdit');
- 読んだページに権限名として出ていたのは、
storyEdit、documentEdit、clipboardWrite、editorDecorationsです。API Referenceが、storyEditは作者のメモを設定するan.set()、documentEditは文書を書き換える各メソッド、clipboardWriteはクリップボードへの書き込み、editorDecorationsは印やウィジェットの作成に必要、と書いています。 - 権限の全一覧、各権限が許す範囲、ユーザーが後から取り消す画面は、読んだページに書かれていません。 「記載が見つからない」です。
スクリプトの「外し方」
- スクリプトを外す:User Scriptsのモーダルで、無効にするか、取り除く(導入ページの
?noscript=trueの説明が、この2つに触れています)。 - 許可した権限の取り消し:記載が見つからない。
- 物語のスクリプトは、その物語のファイルに保存されます。物語を書き出すと一緒に出ていく可能性がありますが、書き出しにスクリプトが含まれるかは、読んだページに書かれていません。
連携2:スクリプトから、別のAIモデル(GLM 4.6)に文章を生成させる
公式が書いていること
| こと | 公式の書き方(要約) |
|---|---|
| 呼び方 | api.v1.generate(メッセージの配列, 設定, 途中経過のコールバック, 動作) |
| メッセージ | 各要素に role(user、assistant、system)と content(文字列) |
| 設定 | model(必須。例は glm-4-6)、temperature、max_tokens、top_p、top_k、frequency_penalty、presence_penalty、stop |
| 対象のモデル | OpenAI風のcompletionsのエンドポイントを使うモデルだけ。API Referenceは、「いまは会話形式だけで、GLM 4.6を使う」と読める書き方 |
| ストリーミング | 既定で流れる。第3引数のコールバックが (choices, final) を受け取る |
| ブロック | 既定では、エディターの操作とユーザーの生成を止める。第4引数に 'background' を渡すと、生成中も操作できる |
| 出力の制限 | スクリプトごとに、4分あたり2048トークン。4分たつか、ユーザーがスクリプトのUIを操作/エディターで手動生成すると戻る |
| 入力の制限 | ユーザーのプランのモデルの最大コンテキストの2倍を、6分あたり。新しい(キャッシュされていない)入力トークンだけ数える。キャッシュは64トークン単位 |
| エディターへの生成 | api.v1.editor.generate は、Sendボタンと同じように文書に追加する。ユーザーの操作なしでは、3回まで |
- 残りの量を調べる関数:
api.v1.script.getAllowedOutput、getAllowedInput、getTimeUntilAllowedOutput、getTimeUntilAllowedInput、waitForAllowedOutput、waitForAllowedInput、countUncachedInputTokens。 - 入力が上限に近づいたときの工夫として、
api.v1.createRolloverHelperが用意されている(古いメッセージを落として、前の部分のキャッシュを保つ)。 - Anlasなどの費用と、生成に必要な権限は、読んだGenerating Textのページに書かれていません。 「記載が見つからない」です。
この記事の例(動作は確かめていません)
公式のページが書いている呼び方に合わせて、この記事で組んだ最小の形です。公式の例の写しではありません。
const response = await api.v1.generate(
[{ role: "user", content: "Write one sentence about a lighthouse." }],
{ model: "glm-4-6", max_tokens: 100 }
);
api.v1.log(response.choices[0].text);
- 公式の基本の例が、
api.v1.generate(で始まり、response.choices[0].textをログに出して終わる、という点は、ページの要約から読めました。引数の細部は、公式の原文で確かめてください。
フック(hooks):生成のタイミングに割り込む
api.v1.hooks.register(フック名, 関数) で登録します。1つのスクリプトは、1つのフックにつき、1つの関数だけ持てます(再登録すると置き換わる)。
| フック | 発火のタイミング(公式の書き方の要約) |
|---|---|
| onGenerationRequested | ユーザーが文章を生成するとき、最初。生成を止めることもできる |
| onBeforeContextBuild | 文脈を組み立てる直前。dryRun で、生成のためかどうかを見分ける |
| onContextBuilt | 文脈ができたとき。メッセージの配列を書き換えて返せる |
| onResponse | 応答のデータが届くたび。文章やトークンIDを書き換えられる。最後の呼び出しは final が true |
| onGenerationEnd | 生成の完了または中止のあと |
| onScriptsLoaded | すべてのスクリプトが読み込まれた後に1回 |
| onLorebookEntrySelected | ロアブックの項目やカテゴリーを選んだとき |
| onTextAdventureInput | テキストアドベンチャーの入力欄に送信したとき |
| onHistoryNavigated | 取り消し、やり直し、リトライ、履歴の移動をしたとき |
| onDocumentConvertedToText | 文書がテキストに変換されたとき(文脈づくりなど) |
stopFurtherScriptsは、後のスクリプトにそのフックを渡さない。stopGenerationは、生成を止めて、以後のフックも止める。
画面の部品を足す(UI拡張)
- 種類:
contextMenuButton、toolbarButton、toolboxOption、scriptPanel、sidebarPanel、lorebookPanel。 api.v1.ui.registerに、typeを持つ部品の配列を渡して登録し、api.v1.ui.updateでIDを使って更新します。- この記事の例(公式の例を要約から組み直したもので、動作は確かめていません):
api.v1.ui.register([{ type: 'toolbarButton', text: 'Example Button', callback: () => api.v1.log('Clicked') }])
- 値の保存先:
api.v1.storage(アカウント)、storyStorage(物語)、tempStorage、historyStorageが、API Referenceの一覧にあります。それぞれの保存の範囲や寿命は、この記事では読んでいません。
スクリプトとAIの間で渡るデータ
- スクリプトが
api.v1.generateに渡したメッセージが、モデルの生成に使われる、という流れは、ページから読めます。送り先の運営、保存、記録の扱いは、Generating Textのページには書かれていません。プライバシーポリシーでの扱い(文章生成の要求は、保存・記録されずHTTPSで送られる、など)は、03で整理しました。 - 公式の制限として、スクリプトは「任意のネットワーク通信」はできないと書かれています(特定の通信が許されるかは、記載が見つからない)。
連携3:Persistent API Token(ボタンの場所と性質まで)
手順
- User Settingsの Account を開く。(経路は、FAQが「User Settings>Account」、Subscriptionページが「user settings メニューの Account」と書いています。手元の画面と照らしてください。)
- Get Persistent API Token を押す。
- 出たポップアップのトークンを、閉じる前に控える。閉じると、二度と見られません。
- 新しく作り直すと、前のトークンは無効になります。
公式の記述の範囲
| こと | 記述 |
|---|---|
| 何のトークンか | 「NovelAI API」のトークン(Accountのページ) |
| 使える先、権限の範囲、期限 | 読んだページに記載が見つからない |
| 取り消し専用のボタン | 記載が見つからない。作り直すと古いものが無効になる、とだけ書かれている |
| APIの呼び方 | 仕様書(api.novelai.net/docs)は、題名しか取得できなかった |
- このため、「トークンを使ってNovelAIの画像を自動でつくる」手順は、この記事では書けません。
- 僕らの見立て(公式の手順ではありません):トークンは、パスワードと同じ扱いで、他人に見せない、公開の場所に書かない、という前提で扱う案が考えられます。使う予定がなければ、作らずにおく案もあります。
- 03で触れたとおり、利用規約には、自動化の仕組みやアカウントの共有・貸し出しに関する条文があります。使う前に、原文を確かめてください(この記事では規約を読み直していません)。
連携4:画像の設定・参照画像を持ち出す
メタデータつきで保存し、戻す(FAQ、チュートリアル)
- 画像の下の 保存アイコン で保存する。右クリックの保存やクリップボードでは、プロンプト・seed・設定が入りません。
- 戻すとき:保存した画像を、NovelAIのサイトにドラッグ&ドロップする。または novelai.net/inspect の検査ツールを使う。
- seedも読み込まれるのが既定です。違う絵がほしいときは、seedの値を押して消します。
別の道具の側から設定を読む方法は、公式の資料の範囲では確認できていません。
Vibeの書き出し・読み込み(Vibe Transferのページ、V4以上)
- 画像をvibeとして入れ、エンコードする。
.naiv4vibe:エンコードのあとにダウンロードする。元画像、サムネイル、使った値のエンコードが入る。読み込みは、ふつうのVibe Transferの画像と同じように、ドラッグして戻す。- Export Bundle:現在のvibeを1つの
.naiv4vibeBundleにまとめる。 - Export as Encodings:サムネイルや調整の選択肢のない形で書き出す。
- PNGをDownloadで保存すると、vibeが画像に埋め込まれる。貼り付けでは入りません。読み込むとき、今のvibeを置き換えるか、Append(追加)を選ぶ。
- 埋め込まれたvibeは、エンコード済みなので、エンコードの費用はかからない。ただし Information Extracted の値は変えられない。
Canvasのファイル(Canvasのページ)
- Download File で書き出し、あとで Upload Image で読み込める。
連携5:物語を持ち出す
| 何を | 方法(公式の表記) | 書かれている場所 |
|---|---|---|
| すべての物語 | Accountの Download All Stories(.zip) | Account、FAQ |
| 物語を保存する先の既定 | Default Storage Location(公式は「Keep this set to Server.」と書く) | Account |
| 保存先が食い違うときの確認 | Ignore Remote Story Conflicts(オンにすると、ポップアップが出なくなる) | Account |
| シナリオとして書き出す | 書き出した物語に Pen Name が付く | Account |
- 1つずつの書き出しの画面の手順と、取り込み先の別サービスは、読んだページに書かれていません。
- 解約後の書き出しの期限は、04を参照してください。
うまくいかないときの確認点
| 症状 | 確認すること |
|---|---|
| スクリプトを入れたら画面が動かない | URLの末尾に ?noscript=true を付けて読み込み直し、User Scriptsのモーダルで無効化/削除(公式の導入ページ) |
| スクリプトが急に止まった | 無効化、物語の切り替え、モーダルを閉じたことで、読み込みが解除される。データはStorage APIに置く(公式) |
| エラーが画面にもコンソールにも出ない | Promiseの拒否は表示されない。.catch か try/catch を使う(公式) |
| 生成を呼んでも進まない/待たされる | 出力は4分あたり2048トークン、入力は6分あたりの上限がある。getTimeUntilAllowedOutput などで待ち時間を調べる(公式のGenerating Text) |
api.v1.generate が使えない |
対象は、OpenAI風のcompletionsのエンドポイントを使うモデルだけ(公式)。model が必須 |
| 文書を書き換える関数が動かない | documentEdit などの権限が必要(API Reference)。api.v1.permissions.request で許可を求める |
| 画像から設定が戻らない | 保存アイコンで保存したか。右クリック保存や貼り付けでは、メタデータが入らない(FAQ) |
| 画像生成のAPIを呼びたい | 仕様書の中身を読めていません。公式の資料では確認できていません |
気をつけること
- この記事は、実際に使って確かめた記録ではありません。公式ドキュメントの要約を読んだ範囲です。
- 読めなかったページ:
api.novelai.net/docs(題名「Swagger UI」のみ)、novelai.net/trial(題名とメタ情報のみ)。API Referenceのページは、後半(約1万字)を読んでいません。 - 「外部のAIとつなぐ公式の入口がない」とは断定しません。読んだページに見つからなかった、という意味です。
- 「画像生成のAPIがない」とも断定しません。スクリプトのAPI一覧にない、API仕様書を読めていない、という意味です。
- スクリプトの権限は、読んだページに全体が書かれていません。取り込む前に、中身(TypeScript)を読める人は読むよう案内している公式の記述は、見つかりませんでした。他人が書いたスクリプトを入れる前の確認は、利用者の判断になります。
- GitHubの
novelai-script-examplesは、自分では「公式」と書いていません。MITライセンスで、NovelAIの組織の下にあります。 - NovelAIの外の第三者のツールに、パスワードやトークンを渡す場合の安全性は、公式の資料では確認できていません。
- 規約は変わります。この記事は法律の助言ではありません。
出典
- NovelAI Documentation(トップ・目次、NovelAI、確認日 2026-10-25)
- User Scripting: Introduction(NovelAI Documentation、確認日 2026-10-25)
- Scripting: API Reference(NovelAI Documentation、確認日 2026-10-25。後半は未読)
- Scripting: Generating Text(NovelAI Documentation、確認日 2026-10-25)
- Scripting: Hooks(NovelAI Documentation、確認日 2026-10-25)
- Scripting: Permissions(NovelAI Documentation、確認日 2026-10-25)
- Scripting: UI Extensions(NovelAI Documentation、確認日 2026-10-25)
- novelai-script-examples(GitHub、NovelAI組織、確認日 2026-10-25)
- Account(NovelAI Documentation、確認日 2026-10-25)
- FAQ(NovelAI Documentation、確認日 2026-10-25)
- Vibe Transfer(NovelAI Documentation、確認日 2026-10-25)
- Canvas(NovelAI Documentation、確認日 2026-10-25)
- Tutorial: Intro to Image Generation(NovelAI Documentation、確認日 2026-10-25)