naftiko: 1.0.0-alpha2 info: label: Local REST API for Obsidian — Periodic Notes description: 'Local REST API for Obsidian — Periodic Notes. 10 operations. Lead operation: Delete the current periodic note for the specified period.. Self-contained Naftiko capability covering one Obsidian business surface.' tags: - Obsidian - Periodic Notes created: '2026-05-19' modified: '2026-05-19' binds: - namespace: env keys: OBSIDIAN_API_KEY: OBSIDIAN_API_KEY capability: consumes: - type: http namespace: local-rest-periodic-notes baseUri: https://{host}:{port} description: Local REST API for Obsidian — Periodic Notes business capability. Self-contained, no shared references. resources: - name: periodic-period path: /periodic/{period}/ operations: - name: delete method: DELETE description: Delete the current periodic note for the specified period. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: get method: GET description: Get current periodic note for the specified period. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: Target-Type in: header type: string description: Type of sub-document section to target. When specified, the operation - name: Target in: header type: string description: The section to target; required when `Target-Type` is specified. - name: Target-Delimiter in: header type: string description: Delimiter used when specifying nested heading targets (e.g. "Heading 1::Subheading"). Defaults to "::". - name: patch method: PATCH description: Partially update content in the current periodic note for the specified period. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: Operation in: header type: string description: Patch operation to perform required: true - name: Create-Target-If-Missing in: header type: string description: If the specified Target does not exist, create it? - name: Apply-If-Content-Preexists in: header type: string description: If patch data already exists in Target, apply patch anyway? - name: Trim-Target-Whitespace in: header type: string description: Trim whitespace from Target content before applying the operation? - name: Target-Type in: header type: string description: Type of sub-document section to target. When specified, the operation required: true - name: Target in: header type: string description: The section to target; required when `Target-Type` is specified. required: true - name: Target-Delimiter in: header type: string description: Delimiter used when specifying nested heading targets (e.g. "Heading 1::Subheading"). Defaults to "::". - name: body in: body type: object description: Request body (JSON). required: true - name: post method: POST description: Append content to the current periodic note for the specified period. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: Create-Target-If-Missing in: header type: string description: If the specified Target does not exist, create it? - name: Apply-If-Content-Preexists in: header type: string description: If patch data already exists in Target, apply patch anyway? - name: Trim-Target-Whitespace in: header type: string description: Trim whitespace from Target content before applying the operation? - name: Target-Type in: header type: string description: Type of sub-document section to target. When specified, the operation - name: Target in: header type: string description: The section to target; required when `Target-Type` is specified. - name: Target-Delimiter in: header type: string description: Delimiter used when specifying nested heading targets (e.g. "Heading 1::Subheading"). Defaults to "::". - name: body in: body type: object description: Request body (JSON). required: true - name: put method: PUT description: Update the content of the current periodic note for the specified period. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: Apply-If-Content-Preexists in: header type: string description: If patch data already exists in Target, apply patch anyway? - name: Trim-Target-Whitespace in: header type: string description: Trim whitespace from Target content before applying the operation? - name: Target-Type in: header type: string description: Type of sub-document section to target. When specified, the operation - name: Target in: header type: string description: The section to target; required when `Target-Type` is specified. - name: Target-Delimiter in: header type: string description: Delimiter used when specifying nested heading targets (e.g. "Heading 1::Subheading"). Defaults to "::". - name: body in: body type: object description: Request body (JSON). required: true - name: periodic-period-year-month-day path: /periodic/{period}/{year}/{month}/{day}/ operations: - name: delete method: DELETE description: Delete the periodic note for the specified period and date. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: year in: path type: number description: The year of the date for which you would like to grab a periodic note. required: true - name: month in: path type: number description: The month (1-12) of the date for which you would like to grab a periodic note. required: true - name: day in: path type: number description: The day (1-31) of the date for which you would like to grab a periodic note. required: true - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: get method: GET description: Get the periodic note for the specified period and date. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: year in: path type: number description: The year of the date for which you would like to grab a periodic note. required: true - name: month in: path type: number description: The month (1-12) of the date for which you would like to grab a periodic note. required: true - name: day in: path type: number description: The day (1-31) of the date for which you would like to grab a periodic note. required: true - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: Target-Type in: header type: string description: Type of sub-document section to target. When specified, the operation - name: Target in: header type: string description: The section to target; required when `Target-Type` is specified. - name: Target-Delimiter in: header type: string description: Delimiter used when specifying nested heading targets (e.g. "Heading 1::Subheading"). Defaults to "::". - name: patch method: PATCH description: Partially update content in the periodic note for the specified period and date. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: year in: path type: number description: The year of the date for which you would like to grab a periodic note. required: true - name: month in: path type: number description: The month (1-12) of the date for which you would like to grab a periodic note. required: true - name: day in: path type: number description: The day (1-31) of the date for which you would like to grab a periodic note. required: true - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: Operation in: header type: string description: Patch operation to perform required: true - name: Create-Target-If-Missing in: header type: string description: If the specified Target does not exist, create it? - name: Apply-If-Content-Preexists in: header type: string description: If patch data already exists in Target, apply patch anyway? - name: Trim-Target-Whitespace in: header type: string description: Trim whitespace from Target content before applying the operation? - name: Target-Type in: header type: string description: Type of sub-document section to target. When specified, the operation required: true - name: Target in: header type: string description: The section to target; required when `Target-Type` is specified. required: true - name: Target-Delimiter in: header type: string description: Delimiter used when specifying nested heading targets (e.g. "Heading 1::Subheading"). Defaults to "::". - name: body in: body type: object description: Request body (JSON). required: true - name: post method: POST description: Append content to the periodic note for the specified period and date. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: year in: path type: number description: The year of the date for which you would like to grab a periodic note. required: true - name: month in: path type: number description: The month (1-12) of the date for which you would like to grab a periodic note. required: true - name: day in: path type: number description: The day (1-31) of the date for which you would like to grab a periodic note. required: true - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: Create-Target-If-Missing in: header type: string description: If the specified Target does not exist, create it? - name: Apply-If-Content-Preexists in: header type: string description: If patch data already exists in Target, apply patch anyway? - name: Trim-Target-Whitespace in: header type: string description: Trim whitespace from Target content before applying the operation? - name: Target-Type in: header type: string description: Type of sub-document section to target. When specified, the operation - name: Target in: header type: string description: The section to target; required when `Target-Type` is specified. - name: Target-Delimiter in: header type: string description: Delimiter used when specifying nested heading targets (e.g. "Heading 1::Subheading"). Defaults to "::". - name: body in: body type: object description: Request body (JSON). required: true - name: put method: PUT description: Update the content of the periodic note for the specified period and date. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: year in: path type: number description: The year of the date for which you would like to grab a periodic note. required: true - name: month in: path type: number description: The month (1-12) of the date for which you would like to grab a periodic note. required: true - name: day in: path type: number description: The day (1-31) of the date for which you would like to grab a periodic note. required: true - name: period in: path type: string description: The name of the period for which you would like to grab a periodic note. required: true - name: Apply-If-Content-Preexists in: header type: string description: If patch data already exists in Target, apply patch anyway? - name: Trim-Target-Whitespace in: header type: string description: Trim whitespace from Target content before applying the operation? - name: Target-Type in: header type: string description: Type of sub-document section to target. When specified, the operation - name: Target in: header type: string description: The section to target; required when `Target-Type` is specified. - name: Target-Delimiter in: header type: string description: Delimiter used when specifying nested heading targets (e.g. "Heading 1::Subheading"). Defaults to "::". - name: body in: body type: object description: Request body (JSON). required: true authentication: type: bearer token: '{{env.OBSIDIAN_API_KEY}}' exposes: - type: rest namespace: local-rest-periodic-notes-rest port: 8080 description: REST adapter for Local REST API for Obsidian — Periodic Notes. One Spectral-compliant resource per consumed operation, prefixed with /v1. resources: - path: /v1/periodic/{period} name: periodic-period description: REST surface for periodic-period. operations: - method: DELETE name: delete description: Delete the current periodic note for the specified period. call: local-rest-periodic-notes.delete with: period: rest.period outputParameters: - type: object mapping: $. - method: GET name: get description: Get current periodic note for the specified period. call: local-rest-periodic-notes.get with: period: rest.period Target-Type: rest.Target-Type Target: rest.Target Target-Delimiter: rest.Target-Delimiter outputParameters: - type: object mapping: $. - method: PATCH name: patch description: Partially update content in the current periodic note for the specified period. call: local-rest-periodic-notes.patch with: period: rest.period Operation: rest.Operation Create-Target-If-Missing: rest.Create-Target-If-Missing Apply-If-Content-Preexists: rest.Apply-If-Content-Preexists Trim-Target-Whitespace: rest.Trim-Target-Whitespace Target-Type: rest.Target-Type Target: rest.Target Target-Delimiter: rest.Target-Delimiter body: rest.body outputParameters: - type: object mapping: $. - method: POST name: post description: Append content to the current periodic note for the specified period. call: local-rest-periodic-notes.post with: period: rest.period Create-Target-If-Missing: rest.Create-Target-If-Missing Apply-If-Content-Preexists: rest.Apply-If-Content-Preexists Trim-Target-Whitespace: rest.Trim-Target-Whitespace Target-Type: rest.Target-Type Target: rest.Target Target-Delimiter: rest.Target-Delimiter body: rest.body outputParameters: - type: object mapping: $. - method: PUT name: put description: Update the content of the current periodic note for the specified period. call: local-rest-periodic-notes.put with: period: rest.period Apply-If-Content-Preexists: rest.Apply-If-Content-Preexists Trim-Target-Whitespace: rest.Trim-Target-Whitespace Target-Type: rest.Target-Type Target: rest.Target Target-Delimiter: rest.Target-Delimiter body: rest.body outputParameters: - type: object mapping: $. - path: /v1/periodic/{period}/{year}/{month}/{day} name: periodic-period-year-month-day description: REST surface for periodic-period-year-month-day. operations: - method: DELETE name: delete description: Delete the periodic note for the specified period and date. call: local-rest-periodic-notes.delete with: year: rest.year month: rest.month day: rest.day period: rest.period outputParameters: - type: object mapping: $. - method: GET name: get description: Get the periodic note for the specified period and date. call: local-rest-periodic-notes.get with: year: rest.year month: rest.month day: rest.day period: rest.period Target-Type: rest.Target-Type Target: rest.Target Target-Delimiter: rest.Target-Delimiter outputParameters: - type: object mapping: $. - method: PATCH name: patch description: Partially update content in the periodic note for the specified period and date. call: local-rest-periodic-notes.patch with: year: rest.year month: rest.month day: rest.day period: rest.period Operation: rest.Operation Create-Target-If-Missing: rest.Create-Target-If-Missing Apply-If-Content-Preexists: rest.Apply-If-Content-Preexists Trim-Target-Whitespace: rest.Trim-Target-Whitespace Target-Type: rest.Target-Type Target: rest.Target Target-Delimiter: rest.Target-Delimiter body: rest.body outputParameters: - type: object mapping: $. - method: POST name: post description: Append content to the periodic note for the specified period and date. call: local-rest-periodic-notes.post with: year: rest.year month: rest.month day: rest.day period: rest.period Create-Target-If-Missing: rest.Create-Target-If-Missing Apply-If-Content-Preexists: rest.Apply-If-Content-Preexists Trim-Target-Whitespace: rest.Trim-Target-Whitespace Target-Type: rest.Target-Type Target: rest.Target Target-Delimiter: rest.Target-Delimiter body: rest.body outputParameters: - type: object mapping: $. - method: PUT name: put description: Update the content of the periodic note for the specified period and date. call: local-rest-periodic-notes.put with: year: rest.year month: rest.month day: rest.day period: rest.period Apply-If-Content-Preexists: rest.Apply-If-Content-Preexists Trim-Target-Whitespace: rest.Trim-Target-Whitespace Target-Type: rest.Target-Type Target: rest.Target Target-Delimiter: rest.Target-Delimiter body: rest.body outputParameters: - type: object mapping: $. - type: mcp namespace: local-rest-periodic-notes-mcp port: 9090 transport: http description: MCP adapter for Local REST API for Obsidian — Periodic Notes. One tool per consumed operation, routed inline through this capability's consumes block. tools: - name: delete-current-periodic-note-specified description: Delete the current periodic note for the specified period. hints: readOnly: false destructive: true idempotent: true call: local-rest-periodic-notes.delete with: period: tools.period outputParameters: - type: object mapping: $. - name: get-current-periodic-note-specified description: Get current periodic note for the specified period. hints: readOnly: true destructive: false idempotent: true call: local-rest-periodic-notes.get with: period: tools.period Target-Type: tools.Target-Type Target: tools.Target Target-Delimiter: tools.Target-Delimiter outputParameters: - type: object mapping: $. - name: partially-update-content-current-periodic description: Partially update content in the current periodic note for the specified period. hints: readOnly: false destructive: false idempotent: true call: local-rest-periodic-notes.patch with: period: tools.period Operation: tools.Operation Create-Target-If-Missing: tools.Create-Target-If-Missing Apply-If-Content-Preexists: tools.Apply-If-Content-Preexists Trim-Target-Whitespace: tools.Trim-Target-Whitespace Target-Type: tools.Target-Type Target: tools.Target Target-Delimiter: tools.Target-Delimiter body: tools.body outputParameters: - type: object mapping: $. - name: append-content-current-periodic-note description: Append content to the current periodic note for the specified period. hints: readOnly: false destructive: false idempotent: false call: local-rest-periodic-notes.post with: period: tools.period Create-Target-If-Missing: tools.Create-Target-If-Missing Apply-If-Content-Preexists: tools.Apply-If-Content-Preexists Trim-Target-Whitespace: tools.Trim-Target-Whitespace Target-Type: tools.Target-Type Target: tools.Target Target-Delimiter: tools.Target-Delimiter body: tools.body outputParameters: - type: object mapping: $. - name: update-content-current-periodic-note description: Update the content of the current periodic note for the specified period. hints: readOnly: false destructive: false idempotent: true call: local-rest-periodic-notes.put with: period: tools.period Apply-If-Content-Preexists: tools.Apply-If-Content-Preexists Trim-Target-Whitespace: tools.Trim-Target-Whitespace Target-Type: tools.Target-Type Target: tools.Target Target-Delimiter: tools.Target-Delimiter body: tools.body outputParameters: - type: object mapping: $. - name: delete-periodic-note-specified-period description: Delete the periodic note for the specified period and date. hints: readOnly: false destructive: true idempotent: true call: local-rest-periodic-notes.delete with: year: tools.year month: tools.month day: tools.day period: tools.period outputParameters: - type: object mapping: $. - name: get-periodic-note-specified-period description: Get the periodic note for the specified period and date. hints: readOnly: true destructive: false idempotent: true call: local-rest-periodic-notes.get with: year: tools.year month: tools.month day: tools.day period: tools.period Target-Type: tools.Target-Type Target: tools.Target Target-Delimiter: tools.Target-Delimiter outputParameters: - type: object mapping: $. - name: partially-update-content-periodic-note description: Partially update content in the periodic note for the specified period and date. hints: readOnly: false destructive: false idempotent: true call: local-rest-periodic-notes.patch with: year: tools.year month: tools.month day: tools.day period: tools.period Operation: tools.Operation Create-Target-If-Missing: tools.Create-Target-If-Missing Apply-If-Content-Preexists: tools.Apply-If-Content-Preexists Trim-Target-Whitespace: tools.Trim-Target-Whitespace Target-Type: tools.Target-Type Target: tools.Target Target-Delimiter: tools.Target-Delimiter body: tools.body outputParameters: - type: object mapping: $. - name: append-content-periodic-note-specified description: Append content to the periodic note for the specified period and date. hints: readOnly: false destructive: false idempotent: false call: local-rest-periodic-notes.post with: year: tools.year month: tools.month day: tools.day period: tools.period Create-Target-If-Missing: tools.Create-Target-If-Missing Apply-If-Content-Preexists: tools.Apply-If-Content-Preexists Trim-Target-Whitespace: tools.Trim-Target-Whitespace Target-Type: tools.Target-Type Target: tools.Target Target-Delimiter: tools.Target-Delimiter body: tools.body outputParameters: - type: object mapping: $. - name: update-content-periodic-note-specified description: Update the content of the periodic note for the specified period and date. hints: readOnly: false destructive: false idempotent: true call: local-rest-periodic-notes.put with: year: tools.year month: tools.month day: tools.day period: tools.period Apply-If-Content-Preexists: tools.Apply-If-Content-Preexists Trim-Target-Whitespace: tools.Trim-Target-Whitespace Target-Type: tools.Target-Type Target: tools.Target Target-Delimiter: tools.Target-Delimiter body: tools.body outputParameters: - type: object mapping: $.