Obsidian / AIプラグインのデータ経路

公式資料・固定ソースで確認

Obsidian×AIプラグインの現在地
できること・危ういこと【2026】

ノートのどの部分が、どの機能から、どこへ渡るのか。Copilot・Smart Connections・Text Generatorの固定版を読み、資料で分かることと実通信の未確認部分を比べます。

選ぶ前に見るのは、モデル・文脈・索引・追加機能

「ローカル対応」という一語だけでは、プラグイン全体の送信先は決まりません。モデルへ渡すノートの抜粋、索引を作る場所、Web検索や文書変換のサービス、診断・更新確認を分けて確認します。

  1. モデルprovider・endpoint・agent
  2. 参照する文脈選択文・抜粋・template
  3. 索引・検索ローカルか別のserverか
  4. 追加機能Web・文書変換・診断・更新

この図は公式資料を読むための整理です。実際の通信記録ではありません。比較は固定した資料とソースの確認で、設定画面の操作や実リクエスト・提供元の運用監査は含みません。

まず下の表で、使う機能の経路を確かめてください。表中の「ソース」はコードから読めた定数や分岐、「提供元の説明」はREADMEやガイドの記載を表します。

3つの固定版を、送信先と設定で比較する

2026年9月30日に取得した公式資料。実通信の結果表ではありません。
固定版資料に示される経路文脈・索引キー・設定の確認残る未確認
Copilot
4.0.12
提供元の説明:hostedはBrevilabsとenterprise provider。Cloud BYOKは指定provider/endpoint、Local BYOKはlocal endpoint。opencode・Claude・Codexにも各経路があります。 Q03選んだノートの抜粋はモデル文脈へ。Miyoの索引・検索先は別設定でlocal/remote。Web検索・文書変換・project contextは追加経路を確認。 Q03 / Q05ソース:SecretStorageの有無を確認するgetter。enableMiyo=false、activeBackend=opencodeなどの初期定数。実保存や現行GUIは未確認。 Q07 / Q08 / Q09実payload、索引対象、端末のキー保存・暗号化、backendの保持・非学習方針の遵守。自己選択の診断ZIP uploadは通常requestと区別。
Smart Connections
4.7.2
提供元の説明:組み込みlocal embedding modelを案内。API key不要の索引作成を説明しています。 Q10 / Q11READMEはenable後にVaultの索引を作ると説明。設定・modelの一部は外部依存です。全構成のデータ経路は読み切れていません。ソース:GitHub latest-releaseへのGETと、初回案内に渡されるURLがあります。local embeddingという説明から、全通信なしとは判断できません。 Q12 / Q13実索引・モデル取得、依存全体、実通信やpayload、代替model、key storage、telemetry/保持の全体。
Text Generator
0.8.7
ソース初期値:OpenAI Chat (Langchain)、https://api.openai.com/v1、keyは空。Ollama providerは設定したbasePathを受け取ります。 Q15 / Q23 / Q24includeClipboard=trueで値を取得できる分岐。初期templateはtitle・starredBlocks・tg_selection。実際のpromptに入る値は別途確認が必要。 Q15 / Q17ソース初期値:encrypt_keys=false。暗号化不可/無効なら固定prefix+入力keyを返す分岐。plain key欄が空でも暗号化済みとは判断できません。 Q15 / Q19 / Q20 / Q21 / Q22実payload、現行GUI、端末の暗号化結果、全機能の通信、課金・回答品質、telemetry/保持の全体。

BYOKは自分のキーやendpointを使う方式です。「自分のキーを使うこと」と「処理が端末内だけに留まること」は別の条件です。

Copilot:モデルを選んでも、追加機能の経路は別に残る

固定版のガイドは、hosted・Cloud BYOK・Local BYOK・opencode・Claude・Codexの処理先を分けています。たとえばLocal BYOKのモデルはlocal endpointという説明でも、使うSkillやproject contextによって別のサービスが関わる場合があります。 Q03

ノートの参照とMiyoの索引を分ける

資料には、agentがノートを読み、必要な部分を選択モデルのpromptに入れる説明があります。「Agent Chatを開いただけでVault全体をuploadする」挙動とは説明されていません。Miyoはlocal接続とremote server接続があり、索引・検索先を別に選びます。検索で見つけた抜粋はモデルの文脈にも入ります。localの索引を使うことだけで、抜粋がモデルproviderへ渡らないとは言えません。 Q03 / Q05

文書処理も一律ではありません。資料上、Agent ChatのMiyo処理はlocal CLI、Quick Chatは接続先Miyo serviceを使用し、remoteならそのserverで処理します。Web・YouTube・binary fileを使うsaved project contextはhosted project serviceを使う場合があり、Miyoの選択とは別の経路です。 Q03

Self-Host Modeを通信遮断の保証にしない

ガイドはSelf-Host Modeでもcloudが無効になるわけではないと明記しています。選んだClaude・Codex・cloud modelや検索providerなどへ送る経路は残ります。使いたい機能と許容する処理先が一致するかを、機能ごとに確認するための設定です。 Q04

キーのgetter、初期定数、診断の方針は、それぞれの根拠で読む

確認したKeychainServiceの範囲は、app.secretStorageの有無を確かめ、なければエラーを出すgetterです。実際にキーを保存した結果や、OSの暗号化を検証した記録ではありません。enableMiyo=false、enableMiyoSearchSkill=false、activeBackend=opencode、debugFullFrames=trueはソース内の初期値であり、移行済み設定や読者のGUIの値を示しません。 Q07 / Q08 / Q09

READMEはhosted requestのランダムUUIDと、読者が選んでuploadする診断ZIPを説明しています。ZIPの60日後削除、hosted requestの一時処理・非保持・非学習は提供元が説明する方針です。ここでbackendの運用を監査したわけではありません。debugFullFrames=trueだけから診断ZIPが自動で送信されると判断することもできません。 Q02

Smart Connections:local embeddingの説明と、全通信の有無を分ける

READMEは、組み込みlocal modelがVaultをindexし、API keyを必要としないと説明しています。関連するノートを見つける仕組みの案内として読めますが、この比較ではモデルを起動して実索引や通信を観測していません。READMEの「private」「offline」やmobileに関する説明も、提供元の主張として扱います。 Q10 / Q11

一方、自前のsrc/main.jsには、initialize後の更新確認からGitHub latest-releaseへのGETを予約するコードがあります。初回ユーザーのStoryModalにはsmartconnections.appのURLが渡されます。これは通信に関わるコード経路の確認です。StoryModalの実装は依存側にあり、実際にURLが読み込まれたか、どんなpayloadが渡るかは未確認です。 Q12 / Q13

model・settings・HTTPなどの一部はSmart Environment/jsbrains関連の外部packageを参照しています。この範囲だけで「すべての機能が端末内」「telemetryがない」「ノートが必ず送られる」と断定できません。ローカル索引の説明、更新確認のコード、未確認の依存・実通信を分けると、追加で調べる対象が分かります。 Q14

Text Generator:文脈の候補と、キー保存の分岐を確認する

クリップボードを取得できる設定と、実promptは別

固定版の初期設定にはincludeClipboard=trueがあり、context builderはその値がtrueならclipboardを取得できる分岐を持ちます。一方、引用した初期templateにあるのはtitle、starredBlocks、tg_selectionで、clipboard placeholderではありません。 Q15 / Q17

template、frontmatter、context options、選択範囲によって、解決される値は変わります。利用可能な値の一覧と、実リクエストに入った値を同じものとして扱わないでください。このコード確認は「clipboardが必ず送られる」「Vault全部が常に送られる」という結果ではありません。 Q17 / Q18

plain key欄の空文字は、暗号化の証拠にならない

初期値はencrypt_keys=falseです。保存時にplain key欄を空にする処理と、別のsecret関連フィールドを用意する処理があります。getEncryptedKeyは暗号化が利用不可、またはencrypt_keysが無効のとき、固定prefixと入力keyをつないだ値を返します。フィールド名にencrypted/hashedが含まれていても、それだけで暗号化されたbytesとは判断できません。 Q15 / Q19 / Q20 / Q21 / Q22

キーは入力していないため、実保存の内容やこの端末のsafeStorage動作は未確認です。キーを含む設定ファイルや診断記録を共有する前は、plain欄だけでなく、保存される他の値にも目を向ける必要があります。

初期providerとlocal対応を分けて選ぶ

ソースの初期providerはOpenAI Chat (Langchain)、endpointはhttps://api.openai.com/v1です。Ollama providerは設定したbasePathを受け取る実装があります。local対応providerがあるという事実だけで、他の機能の処理先や全通信なしまで証明されるわけではありません。 Q15 / Q23 / Q24

添付request、automatic suggestions、slash suggestions、JavaScript実行は引用した初期値ではOFFです。これらも現行GUIの実測値ではありません。使うtemplateと保存済み設定を、自分の環境で確認してください。 Q15 / Q16

自分の使い方に合わせて、確認する設定を決める

したいこと確認する対象この比較だけでは分からないこと
ノートをクラウドモデルで扱うmodel/provider/endpoint、選択文・抜粋・template、使うagent/Skill実payload、providerの運用、請求、回答品質
索引をlocalで作りたいembedding/indexの処理先、remote server設定、後段のモデル、モデル取得と追加機能全機能の通信停止、依存の全経路、端末での実索引
キーを保存・共有する範囲を知りたい保存するフィールド、暗号化が使えない分岐、ログ/診断/設定の共有先その端末の実保存bytes、backend保持・削除の遵守

設定を変えた後の状態は、この表で実測した結果ではありません。自分のノートを使う前に、どの機能を使い、どのデータを許容する先へ渡すかを決めるための読み方として使ってください。

よくある質問

ローカルモデルを選べば、プラグインは一切通信しませんか?
モデルの処理先と、索引・Web検索・文書変換・更新確認は別の経路です。Copilotの資料は追加機能の経路を区別し、Smart Connectionsの自前コードにはGitHub更新確認GETがあります。今回の資料確認で、全機能が通信しないことや実際の送信内容は確認していません。
Smart Connectionsはノートを外部へ送りますか?
固定版READMEは、組み込みのローカルモデルでembeddingと索引を作ると説明しています。これは提供元の説明です。自前ソースに更新確認と初回案内のURLがあり、モデル・設定などは一部が外部依存です。実際のノート送信や全通信の有無は、この比較では測定していません。
Text GeneratorのincludeClipboard=trueは、クリップボードを必ず送る意味ですか?
ソースでは、その設定がtrueのときcontext builderがクリップボードを取得できる分岐があります。一方、掲載した初期テンプレートはtitle、starredBlocks、tg_selectionを使い、clipboardの指定はありません。利用可能な値と、実際に組み立てられたリクエストの内容は別です。実payloadは未測定です。
保存データのapi_keyが空なら、キーは暗号化済みですか?
空のキー欄だけでは判断できません。Text Generator 0.8.7ではplain key欄を空にする保存処理と別の保存フィールドがあり、暗号化が利用できない場合またはencrypt_keysが無効の場合は、固定prefixと入力キーを返す分岐があります。実際のキー保存やプラットフォームの暗号化動作は試していません。
この記事は、AIの回答品質や料金、iPhone動作を比較していますか?
比較対象は、固定した3版の公式資料とコードに示されるデータ経路と設定です。プラグインのインストール、設定画面の実操作、モデル生成、課金、実通信、iPhoneを含む端末の動作、提供元の保存・非学習方針の遵守は確認していません。

確認した版と、根拠の原文

以下は2026年9月30日14:25 UTCに記録した公式releaseと固定commitです。「その時点で確認した版」であり、将来の最新版を保証しません。minimum Obsidianはmanifestの値です。mobile対応flagから実端末の動作を推測していません。

公式registryもcommit 2db5da29e67e7600176c8c9450fd1c36c3a6831bへ固定しました。24引用・14ファイル・579行について、原ファイルのbytes/SHA256・行範囲・引用文との一致を確認しています。固定版資料の再現性を確認するための照合で、runtime privacy認証ではありません。

24件の固定引用と確認範囲をJSONで読む

主要な説明とコードの引用

英語の原文とコードは固定commitの該当範囲です。表のQ番号からGitHub原文にも進めます。

Copilot · docs/copilot-plus-and-self-host.md · Q03

固定commitの原文を開く

75: 
76: | Model source                | How access works                                               | Who processes the prompt                                        |
77: | --------------------------- | -------------------------------------------------------------- | --------------------------------------------------------------- |
78: | **Copilot-hosted**          | Lite, Plus, or included Supporter access                       | Brevilabs and the enterprise model provider used for that model |
79: | **Cloud BYOK**              | Your API key under BYOK                                        | The provider and endpoint you configured                        |
80: | **Local BYOK**              | Ollama, LM Studio, or another local OpenAI-compatible endpoint | Your local endpoint                                             |
81: | **opencode-reported model** | Authentication managed by opencode                             | The provider behind that opencode model                         |
82: | **Claude**                  | Claude Code login or environment                               | Anthropic under your Claude account                             |
83: | **Codex**                   | Codex CLI login through `codex-acp`                            | OpenAI under your Codex or ChatGPT account                      |
84: 
85: A Claude or ChatGPT subscription is not an API key. Use the Claude or Codex Agent Chat setup for those subscriptions. Use BYOK only when you have API access or an OpenAI-compatible endpoint.
86: 
87: ## Understand service data routes
88: 
89: The selected model is only one possible route. A feature may call another service for the part of the task you asked it to perform:
90: 
91: - A **Copilot-hosted Skill** sends the search query, URL, or document needed by that Skill to Brevilabs.
92: - **Plus document processing** sends the supported document to Copilot's hosted processor.
93: - In **Agent Chat**, **Miyo document processing** runs through the local Miyo CLI, so PDF and EPUB parsing stays on this computer even when search uses a remote Miyo server.
94: - In **Quick Chat**, **Miyo document processing** uses the connected Miyo service. A configured remote Miyo server processes the document there rather than on this computer.
95: - Saved **project context** that needs web, YouTube, or binary-file conversion can use Copilot's hosted project service. The Miyo Document Processor choice does not change that project route.
96: - An agent can read a local note and include relevant text in the prompt sent to the selected model. Opening Agent Chat alone does not upload the whole vault.
97: 
98: For a workflow that does not send task content to Brevilabs, use direct Markdown context, local tools or local Miyo, and a local model. Disable Copilot's cloud-backed Skills for every agent you use. Do not add web pages, YouTube links, or binary files as saved project context when their hosted conversion is outside your intended boundary.
99: 
100: The [privacy policy](https://www.obsidiancopilot.com/en/privacy) describes how Copilot's hosted requests are processed. Your model provider and Miyo server have their own boundaries and terms.
Copilot · docs/copilot-plus-and-self-host.md · Q04

固定commitの原文を開く

103: 
104: Supporter and eligible legacy licenses can open **Settings → Copilot → Self-Host** and enable **Self-Host Mode**.
105: 
106: When it is on, Copilot:
107: 
108: - Lets you supply Firecrawl, Perplexity, Parallel, or Exa credentials for web search.
109: - With OpenCode selected, routes Agent Chat web searches through that selected provider while keeping its API key inside Obsidian. This does not require Obsidian's command line interface.
110: - Disables OpenCode's native web-search and web-fetch tools so they cannot bypass the selected route. Full-page fetching through OpenCode is unavailable until the self-host providers share a supported fetch interface.
111: - Lets you supply a Supadata key for YouTube transcripts.
112: - Directs you to BYOK for local or self-hosted model endpoints.
113: - Flags and sorts cloud agents and models below local or self-hosted choices.
114: 
115: It does not disable the cloud. Claude, Codex, Copilot-hosted models, cloud BYOK providers, Firecrawl, Perplexity, Parallel, Exa, and Supadata can still send data to their services when you select them. The warnings make those routes visible so you can decide.
116: 
117: You do not need Self-Host Mode to use a local BYOK model or local Miyo. Those are available independently.
Copilot · src/services/keychainService.ts · Q09

固定commitの原文を開く

239:   /** Whether the OS keychain is available in this Obsidian version. */
240:   // DESIGN NOTE — intentionally only checks for the `secretStorage` object,
241:   // not individual methods (`getSecret`/`setSecret`/`listSecrets`). Obsidian
242:   // ships SecretStorage as a single API surface (1.11.4); there is no
243:   // released version where the object exists but methods are missing.
244:   // Capability-probing each method would add branching for a partial-API
245:   // world that does not exist. If a future review flags this again, point
246:   // them at this note.
247:   isAvailable(): boolean {
248:     return !!this.app.secretStorage;
249:   }
250: 
251:   /** Get the current vault namespace ID. */
252:   getVaultId(): string {
253:     return this.vaultId;
254:   }
255: 
256:   /**
257:    * Set the vault namespace ID from persisted settings.
258:    * Reason: called during load to replace the path-derived fallback with the
259:    * stable persisted ID, so vault renames don't orphan keychain entries.
260:    */
261:   setVaultId(id: string): void {
262:     this.vaultId = id;
263:   }
264: 
265:   /**
266:    * Access SecretStorage with a runtime guard.
267:    * Reason: replaces scattered non-null assertions with a single guard
268:    * that produces a clear error when keychain is unavailable.
269:    */
270:   private get storage(): SecretStorage {
271:     if (!this.app.secretStorage) {
272:       throw new Error("OS keychain (SecretStorage) is not available.");
273:     }
274:     return this.app.secretStorage;
Smart Connections · src/main.js · Q13

固定commitの原文を開く

144:   async check_for_updates() {
145:     if (await this.is_new_plugin_version(this.manifest.version)) {
146:       // console.log("opening release notes modal");
147:       try {
148:         this.ReleaseNotesView.open(this.app.workspace, this.manifest.version);
149:       } catch (error) {
150:         console.error('Failed to open ReleaseNotesView', error);
151:       }
152:       await this.set_last_known_version(this.manifest.version);
153:     }
154:     window.setTimeout(this.check_for_update.bind(this), 3000);
155:   }
156: 
157:   async check_for_update() {
158:     try {
159:       const { json: response } = await requestUrl({
160:         url: "https://api.github.com/repos/brianpetro/obsidian-smart-connections/releases/latest",
161:         method: "GET",
162:         headers: {
163:           "Content-Type": "application/json",
164:         },
165:         contentType: "application/json",
166:       });
167:       const latest_release = response.tag_name;
168:       if (latest_release !== this.manifest.version) {
169:         if (!this.update_available || this.latest_release_version !== latest_release) {
Text Generator · src/default-settings.ts · Q15

固定commitの原文を開く

4: const DEFAULT_SETTINGS: TextGeneratorSettings = {
5:   version: pkg.version as any,
6:   endpoint: "https://api.openai.com/v1",
7:   models: [],
8:   api_key: "",
9:   encrypt_keys: false,
10:   selectedProvider: "OpenAI Chat (Langchain)",
11:   max_tokens: 5000,
12:   temperature: 0.7,
13:   frequency_penalty: 0.5,
14:   showStatusBar: true,
15:   outputToBlockQuote: false,
16:   freeCursorOnStreaming: false,
17:   allowJavascriptRun: false,
18:   experiment: false,
19:   promptsPath: "textgenerator/templates",
20:   textGenPath: "textgenerator/",
21:   prefix: "\n\n",
22:   tgSelectionLimiter: "^\\*\\*\\*",
23:   stream: true,
24:   context: {
25:     customInstructEnabled: true,
26:     includeClipboard: true,
27:     customInstruct: `Title: {{title}}
28:   
29: Starred Blocks: {{starredBlocks}}
30: 	  
31: {{tg_selection}}`,
32: 
33:     contextTemplate: `Title: {{title}}
34: 	
35: Starred Blocks: {{starredBlocks}}
36: 	  
37: {{tg_selection}}`,
38:   },
39:   requestTimeout: 300000,
40:   options: {
Text Generator · src/scope/context-manager.ts · Q17

固定commitの原文を開く

355:       {},
356:       this.getFrontmatter(this.getMetaData(templatePath)),
357:       contextObj.frontmatter
358:     );
359: 
360:     if (contextOptions.includeClipboard)
361:       try {
362:         blocks["clipboard"] = await this.getClipboard();
363:       } catch {
364:         // empty
365:       }
366: 
367:     const options = {
368:       selection,
369:       selections,
370:       ...blocks["frontmatter"],
371:       ...blocks["headings"],
372:       content: ctnt,
373:       context,
374:       ...blocks,
Text Generator · src/main.ts · Q20

固定commitの原文を開く

664:   encryptAllKeys() {
665:     // check if user have LLMProviderOptionsKeysHashed object (upgrading from older version)
666:     this.settings.LLMProviderOptionsKeysHashed ??= {};
667: 
668:     const keyList: string[] = [];
669: 
670:     this.settings.api_key_encrypted = this.getEncryptedKey(
671:       this.settings.api_key
672:     );
673: 
674:     // get all secret keys
675:     Object.entries(this.settings?.LLMProviderOptions).forEach(([key1, l1]) => {
676:       if (typeof l1 != "object") return;
677:       Object.entries(l1).forEach(([key2, l2]) => {
678:         if (key2.toLowerCase().includes("key") && typeof l2 == "string") {
679:           keyList.push(`${key1}.${key2}`);
680:         }
681:       });
682:     });
683: 
684:     keyList.forEach((pth) => {
685:       const keyval =
686:         (get(this.settings?.LLMProviderOptions, pth) as never as string) || "";
687: 
688:       const encrypted = this.getEncryptedKey(keyval);
689:       this.settings.LLMProviderOptionsKeysHashed[pth] = encrypted;
690:     });
691:   }
692: 
693:   removeApikeys(settings: typeof this.settings): typeof this.settings {
694:     const LLMProviderOptions = JSON.parse(
695:       JSON.stringify(settings?.LLMProviderOptions)
696:     ) as typeof this.settings.LLMProviderOptions;
697: 
698:     // get all secret keys
699:     Object.entries(LLMProviderOptions).forEach(([key1, l1]) => {
700:       if (typeof l1 != "object") return;
701:       Object.entries(l1).forEach(([key2, l2]) => {
702:         if (key2.toLowerCase().includes("key") && typeof l2 == "string") {
703:           set(LLMProviderOptions, `${key1}.${key2}`, "");
704:         }
705:       });
706:     });
707: 
708:     return {
709:       ...settings,
710:       api_key: "",
711:       LLMProviderOptions,
712:     };
Text Generator · src/main.ts · Q21

固定commitの原文を開く

742:   getEncryptedKey(apiKey: string) {
743:     if (!safeStorage?.isEncryptionAvailable() || !this.settings.encrypt_keys) {
744:       return `${DecryptKeyPrefix}${apiKey}`;
745:     }
746: 
747:     return safeStorage.encryptString(apiKey) as Buffer;
748:   }
749: 
Text Generator · src/constants.ts · Q22

固定commitの原文を開く

35:   custom_header: true,
36: };
37: 
38: export const DecryptKeyPrefix = "__@#key_prefix#@__";
39: 

この比較で確認していないこと

プラグインのインストール、有効化、設定GUI、生成、モデル/APIへの呼び出し、実キー、送信packet、依存全体のnetwork audit、provider backendの保持・学習・削除方針の遵守は確認していません。SimpleMemoの入力・配送・AIタグ、同期、端末別の挙動、速度・生産性、流入・AI引用の効果も対象外です。

執筆はシンプルメモ開発者。株式会社ユリカが運営する本サイトの資料比較で、Obsidian公式の認定や各プラグインのprivacy認証ではありません。