obsidian_append_to_note
Add Markdown to a note by appending or prepending content, with the option to create the note if missing.
Instructions
Append or prepend Markdown to a note, optionally creating it.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| vault | No | Optional configured vault name. Defaults to the server default vault. | |
| path | Yes | Vault-relative path. Absolute paths and traversal are rejected. | |
| content | Yes | ||
| create | No | ||
| prepend | No |
Implementation Reference
- src/tools.ts:488-500 (registration)Registration of the obsidian_append_to_note tool with schema and handler delegating to vaults.appendText
tool( "obsidian_append_to_note", "Append or prepend Markdown to a note, optionally creating it.", { vault: vaultArg, path: pathArg, content: z.string(), create: z.boolean().optional().default(false), prepend: z.boolean().optional().default(false), }, async (args) => vaults.appendText(vaults.notePath(args.path), args.content, args.vault, args), { destructiveHint: false }, ); - src/tools.ts:491-497 (schema)Zod schema for obsidian_append_to_note: vault (optional), path (required), content (string), create (boolean, default false), prepend (boolean, default false)
{ vault: vaultArg, path: pathArg, content: z.string(), create: z.boolean().optional().default(false), prepend: z.boolean().optional().default(false), }, - src/tools.ts:498-498 (handler)Handler: calls vaults.appendText(vaults.notePath(args.path), args.content, args.vault, args) passing create and prepend options through
async (args) => vaults.appendText(vaults.notePath(args.path), args.content, args.vault, args), - src/vault.ts:128-148 (helper)VaultManager.appendText implementation: reads existing content (or creates if option.create), prepends or appends text with separator, writes atomically
async appendText( notePath: string, text: string, vaultName?: string | null, options: { create?: boolean; prepend?: boolean } = {}, ): Promise<{ path: string; bytes: number }> { this.assertWritable(); const resolved = this.resolvePath(notePath, vaultName); let current = ""; if (fssync.existsSync(resolved.absolute)) { current = await fs.readFile(resolved.absolute, "utf8"); } else if (!options.create) { throw new Error(`File does not exist: ${resolved.relative}`); } await fs.mkdir(path.dirname(resolved.absolute), { recursive: true }); const separator = current && text && !current.endsWith("\n") && !text.startsWith("\n") ? "\n" : ""; const out = options.prepend ? `${text}${separator}${current}` : `${current}${separator}${text}`; await atomicWrite(resolved.absolute, out); this.onInvalidate?.(resolved.vault.name); return { path: resolved.relative, bytes: Buffer.byteLength(text, "utf8") }; }