obsidian-native-mcp 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/.github/workflows/ci.yml +70 -42
  2. package/.github/workflows/release.yml +152 -0
  3. package/.nvmrc +1 -0
  4. package/CHANGELOG.md +2 -2
  5. package/DESIGN_V1.md +583 -0
  6. package/DEVELOPER.md +158 -106
  7. package/README.md +137 -74
  8. package/dist/audit/log.js +99 -0
  9. package/dist/audit/log.js.map +1 -0
  10. package/dist/cache/file-cache.js +66 -0
  11. package/dist/cache/file-cache.js.map +1 -0
  12. package/dist/cli/index.js +139 -32
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/fs/io.js +68 -0
  15. package/dist/fs/io.js.map +1 -0
  16. package/dist/fs/paths.js +41 -0
  17. package/dist/fs/paths.js.map +1 -0
  18. package/dist/fs/trash.js +20 -0
  19. package/dist/fs/trash.js.map +1 -0
  20. package/dist/fs/walk.js +73 -0
  21. package/dist/fs/walk.js.map +1 -0
  22. package/dist/handlers/args.js +97 -0
  23. package/dist/handlers/args.js.map +1 -0
  24. package/dist/handlers/registry.js +54 -0
  25. package/dist/handlers/registry.js.map +1 -0
  26. package/dist/markdown/blocks.js +95 -0
  27. package/dist/markdown/blocks.js.map +1 -0
  28. package/dist/markdown/fingerprint.js +99 -0
  29. package/dist/markdown/fingerprint.js.map +1 -0
  30. package/dist/markdown/frontmatter.js +153 -0
  31. package/dist/markdown/frontmatter.js.map +1 -0
  32. package/dist/markdown/headings.js +104 -0
  33. package/dist/markdown/headings.js.map +1 -0
  34. package/dist/markdown/links.js +93 -0
  35. package/dist/markdown/links.js.map +1 -0
  36. package/dist/markdown/outline.js +12 -0
  37. package/dist/markdown/outline.js.map +1 -0
  38. package/dist/markdown/parse-file.js +41 -0
  39. package/dist/markdown/parse-file.js.map +1 -0
  40. package/dist/markdown/parse.js +49 -0
  41. package/dist/markdown/parse.js.map +1 -0
  42. package/dist/markdown/tags.js +40 -0
  43. package/dist/markdown/tags.js.map +1 -0
  44. package/dist/mcp/framing.js +56 -0
  45. package/dist/mcp/framing.js.map +1 -0
  46. package/dist/mcp/http.js +240 -0
  47. package/dist/mcp/http.js.map +1 -0
  48. package/dist/mcp/protocol.js +16 -56
  49. package/dist/mcp/protocol.js.map +1 -1
  50. package/dist/mcp/server.js +105 -420
  51. package/dist/mcp/server.js.map +1 -1
  52. package/dist/mcp/stdio.js +38 -0
  53. package/dist/mcp/stdio.js.map +1 -0
  54. package/dist/mcp/transport.js +4 -2
  55. package/dist/mcp/transport.js.map +1 -1
  56. package/dist/plugin/main.js +21813 -1832
  57. package/dist/plugin/main.js.map +1 -1
  58. package/dist/plugin/manifest.json +1 -1
  59. package/dist/plugin/settings.js +149 -41
  60. package/dist/plugin/settings.js.map +1 -1
  61. package/dist/prompts/provider.js +96 -0
  62. package/dist/prompts/provider.js.map +1 -0
  63. package/dist/tools/common.js +84 -0
  64. package/dist/tools/common.js.map +1 -0
  65. package/dist/tools/index.js +41 -0
  66. package/dist/tools/index.js.map +1 -0
  67. package/dist/tools/read.js +631 -0
  68. package/dist/tools/read.js.map +1 -0
  69. package/dist/tools/write-basic.js +319 -0
  70. package/dist/tools/write-basic.js.map +1 -0
  71. package/dist/tools/write-bulk.js +331 -0
  72. package/dist/tools/write-bulk.js.map +1 -0
  73. package/dist/tools/write-patch.js +152 -0
  74. package/dist/tools/write-patch.js.map +1 -0
  75. package/dist/tools/write-structural.js +389 -0
  76. package/dist/tools/write-structural.js.map +1 -0
  77. package/dist/tools/write-surgical.js +349 -0
  78. package/dist/tools/write-surgical.js.map +1 -0
  79. package/dist/utils/log.js +2 -6
  80. package/dist/utils/log.js.map +1 -1
  81. package/dist/utils/types.js +19 -0
  82. package/dist/utils/types.js.map +1 -0
  83. package/dist/vault/permissions.js +73 -0
  84. package/dist/vault/permissions.js.map +1 -0
  85. package/dist/vault/registry.js +164 -0
  86. package/dist/vault/registry.js.map +1 -0
  87. package/eslint.config.mjs +2 -2
  88. package/manifest.json +1 -1
  89. package/package.json +18 -2
  90. package/scripts/start-mcp.sh +6 -0
  91. package/src/audit/log.ts +110 -0
  92. package/src/cache/file-cache.ts +92 -0
  93. package/src/cli/index.ts +155 -31
  94. package/src/fs/io.ts +69 -0
  95. package/src/fs/paths.ts +45 -0
  96. package/src/fs/trash.ts +22 -0
  97. package/src/fs/walk.ts +95 -0
  98. package/src/handlers/args.ts +129 -0
  99. package/src/handlers/registry.ts +100 -0
  100. package/src/markdown/blocks.ts +108 -0
  101. package/src/markdown/fingerprint.ts +112 -0
  102. package/src/markdown/frontmatter.ts +173 -0
  103. package/src/markdown/headings.ts +116 -0
  104. package/src/markdown/links.ts +99 -0
  105. package/src/markdown/outline.ts +18 -0
  106. package/src/markdown/parse-file.ts +51 -0
  107. package/src/markdown/parse.ts +53 -0
  108. package/src/markdown/tags.ts +42 -0
  109. package/src/mcp/framing.ts +59 -0
  110. package/src/mcp/http.ts +275 -0
  111. package/src/mcp/protocol.ts +41 -81
  112. package/src/mcp/server.ts +150 -431
  113. package/src/mcp/stdio.ts +41 -0
  114. package/src/mcp/transport.ts +12 -5
  115. package/src/plugin/main.ts +104 -86
  116. package/src/plugin/settings.ts +176 -44
  117. package/src/prompts/provider.ts +98 -0
  118. package/src/tools/common.ts +106 -0
  119. package/src/tools/index.ts +60 -0
  120. package/src/tools/read.ts +662 -0
  121. package/src/tools/write-basic.ts +330 -0
  122. package/src/tools/write-bulk.ts +355 -0
  123. package/src/tools/write-patch.ts +166 -0
  124. package/src/tools/write-structural.ts +409 -0
  125. package/src/tools/write-surgical.ts +378 -0
  126. package/src/utils/types.ts +147 -0
  127. package/src/vault/permissions.ts +94 -0
  128. package/src/vault/registry.ts +191 -0
  129. package/tests/fixtures/vaults/agents/AGENTS.md +16 -0
  130. package/tests/fixtures/vaults/code-heavy/code-heavy.md +46 -0
  131. package/tests/fixtures/vaults/daily-note/Daily/2026-05-21.md +21 -0
  132. package/tests/fixtures/vaults/dup-headings/dup-headings.md +17 -0
  133. package/tests/fixtures/vaults/frontmatter-stress/fm.md +17 -0
  134. package/tests/fixtures/vaults/large-kb/big.md +5501 -0
  135. package/tests/fixtures/vaults/links-zoo/Target.md +3 -0
  136. package/tests/fixtures/vaults/links-zoo/source.md +13 -0
  137. package/tests/fixtures/vaults/tiny/tiny.md +3 -0
  138. package/tests/helpers/sandbox.ts +107 -0
  139. package/tests/integration/apply-edits.test.ts +56 -0
  140. package/tests/integration/audit.test.ts +66 -0
  141. package/tests/integration/blocks.test.ts +71 -0
  142. package/tests/integration/file-ops.test.ts +78 -0
  143. package/tests/integration/links.test.ts +65 -0
  144. package/tests/integration/permissions.test.ts +72 -0
  145. package/tests/scenarios/S1-mark-tasks-done.test.ts +69 -0
  146. package/tests/scenarios/S10-code-fence-safety.test.ts +78 -0
  147. package/tests/scenarios/S11-no-fabrication.test.ts +72 -0
  148. package/tests/scenarios/S12-apply-patch.test.ts +92 -0
  149. package/tests/scenarios/S13-search-pagination.test.ts +35 -0
  150. package/tests/scenarios/S14-read-write-roundtrip.test.ts +76 -0
  151. package/tests/scenarios/S15-byte-budget.test.ts +77 -0
  152. package/tests/scenarios/S2-refactor-section.test.ts +87 -0
  153. package/tests/scenarios/S4-S5-concurrent.test.ts +85 -0
  154. package/tests/scenarios/S6-S7-large-file.test.ts +77 -0
  155. package/tests/scenarios/S8-bulk-atomic.test.ts +105 -0
  156. package/tests/scenarios/S9-frontmatter-nested.test.ts +63 -0
  157. package/tests/unit/fingerprint.test.ts +85 -0
  158. package/tests/unit/frontmatter.test.ts +78 -0
  159. package/tests/unit/headings.test.ts +66 -0
  160. package/tsconfig.json +5 -3
  161. package/dist/handlers/prompts.js +0 -100
  162. package/dist/handlers/prompts.js.map +0 -1
  163. package/dist/handlers/tools.js +0 -186
  164. package/dist/handlers/tools.js.map +0 -1
  165. package/dist/mcp/http-transport.js +0 -142
  166. package/dist/mcp/http-transport.js.map +0 -1
  167. package/dist/mcp/stdio-transport.js +0 -49
  168. package/dist/mcp/stdio-transport.js.map +0 -1
  169. package/dist/utils/fs-utils.js +0 -735
  170. package/dist/utils/fs-utils.js.map +0 -1
  171. package/dist/utils/markdown.js +0 -256
  172. package/dist/utils/markdown.js.map +0 -1
  173. package/dist/utils/search.js +0 -63
  174. package/dist/utils/search.js.map +0 -1
  175. package/dist/utils/vaults.js +0 -179
  176. package/dist/utils/vaults.js.map +0 -1
  177. package/src/handlers/prompts.ts +0 -120
  178. package/src/handlers/tools.ts +0 -233
  179. package/src/mcp/http-transport.ts +0 -159
  180. package/src/mcp/stdio-transport.ts +0 -54
  181. package/src/utils/fs-utils.ts +0 -1139
  182. package/src/utils/markdown.ts +0 -325
  183. package/src/utils/search.ts +0 -85
  184. package/src/utils/vaults.ts +0 -198
  185. package/tests/fs-utils.test.ts +0 -309
  186. package/tests/http-transport.test.ts +0 -111
  187. package/tests/protocol.test.ts +0 -36
  188. package/tests/server-tools.test.ts +0 -98
@@ -2,74 +2,102 @@ name: CI
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [main]
5
+ branches:
6
+ - main
7
+ - master
8
+ - develop
9
+ - "feature/**"
10
+ - "renovate/**"
6
11
  pull_request:
7
- branches: [main]
12
+ workflow_dispatch:
8
13
 
9
14
  permissions:
10
15
  contents: read
11
16
 
12
17
  jobs:
18
+ setup:
19
+ name: Setup
20
+ runs-on: ubuntu-latest
21
+ if: github.event_name != 'push' || !contains(github.event.head_commit.message, '[skip ci]')
22
+ steps:
23
+ - uses: actions/checkout@v6
24
+ - uses: actions/setup-node@v6
25
+ with:
26
+ node-version-file: .nvmrc
27
+ cache: npm
28
+ - run: npm ci
29
+
30
+ format:
31
+ name: Format
32
+ needs: setup
33
+ runs-on: ubuntu-latest
34
+ if: github.event_name != 'push' || !contains(github.event.head_commit.message, '[skip ci]')
35
+ steps:
36
+ - uses: actions/checkout@v6
37
+ - uses: actions/setup-node@v6
38
+ with:
39
+ node-version-file: .nvmrc
40
+ cache: npm
41
+ - run: npm ci
42
+ - run: npm run format:check
43
+
13
44
  lint:
14
- name: Lint and Type Check
45
+ name: Lint
46
+ needs: setup
15
47
  runs-on: ubuntu-latest
48
+ if: github.event_name != 'push' || !contains(github.event.head_commit.message, '[skip ci]')
16
49
  steps:
17
- - uses: actions/checkout@v4
18
- - uses: actions/setup-node@v4
50
+ - uses: actions/checkout@v6
51
+ - uses: actions/setup-node@v6
19
52
  with:
20
- node-version: "22"
53
+ node-version-file: .nvmrc
21
54
  cache: npm
22
55
  - run: npm ci
23
56
  - run: npm run lint
24
- - run: npm run format:check
25
- - run: npm test
26
- - run: npm run check
27
57
 
28
- build:
29
- name: Build
30
- needs: lint
58
+ typecheck:
59
+ name: Typecheck
60
+ needs: setup
31
61
  runs-on: ubuntu-latest
62
+ if: github.event_name != 'push' || !contains(github.event.head_commit.message, '[skip ci]')
32
63
  steps:
33
- - uses: actions/checkout@v4
34
- - uses: actions/setup-node@v4
64
+ - uses: actions/checkout@v6
65
+ - uses: actions/setup-node@v6
35
66
  with:
36
- node-version: "22"
67
+ node-version-file: .nvmrc
37
68
  cache: npm
38
69
  - run: npm ci
39
- - run: npm run build
40
- - run: npm run build:plugin
41
- - uses: actions/upload-artifact@v4
70
+ - run: npm run check
71
+
72
+ test:
73
+ name: Test
74
+ needs: setup
75
+ runs-on: ubuntu-latest
76
+ if: github.event_name != 'push' || !contains(github.event.head_commit.message, '[skip ci]')
77
+ steps:
78
+ - uses: actions/checkout@v6
79
+ - uses: actions/setup-node@v6
42
80
  with:
43
- name: dist
44
- path: dist/
81
+ node-version-file: .nvmrc
82
+ cache: npm
83
+ - run: npm ci
84
+ - run: npm test
45
85
 
46
- release:
47
- name: Release
48
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
49
- needs: build
86
+ build:
87
+ name: Build
88
+ needs: [format, lint, typecheck, test]
50
89
  runs-on: ubuntu-latest
51
- permissions:
52
- contents: write
53
- issues: write
54
- pull-requests: write
55
- id-token: write
90
+ if: github.event_name != 'push' || !contains(github.event.head_commit.message, '[skip ci]')
56
91
  steps:
57
92
  - uses: actions/checkout@v4
58
- with:
59
- fetch-depth: 0
60
- persist-credentials: false
61
93
  - uses: actions/setup-node@v4
62
94
  with:
63
- node-version: "22"
95
+ node-version-file: .nvmrc
64
96
  cache: npm
65
97
  - run: npm ci
66
- - name: Install npm with OIDC support
67
- run: npm install --no-save npm@11.5.1
68
98
  - run: npm run build
69
- - name: Semantic Release
70
- env:
71
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
72
- run: |
73
- export PATH="$PWD/node_modules/.bin:$PATH"
74
- npm --version
75
- npx semantic-release
99
+ - run: npm run build:plugin
100
+ - uses: actions/upload-artifact@v7
101
+ with:
102
+ name: dist
103
+ path: dist/
@@ -0,0 +1,152 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["CI"]
6
+ types:
7
+ - completed
8
+ workflow_dispatch:
9
+ inputs:
10
+ reason:
11
+ description: Optional note for this manual release.
12
+ required: false
13
+ default: ""
14
+
15
+ concurrency:
16
+ group: release-${{ github.event.workflow_run.head_branch || github.ref }}
17
+ cancel-in-progress: false
18
+
19
+ permissions:
20
+ checks: read
21
+ contents: write
22
+ issues: write
23
+ pull-requests: write
24
+ id-token: write
25
+
26
+ env:
27
+ RELEASE_ALLOWED_ACTORS: "usrivastava92"
28
+
29
+ jobs:
30
+ authorize:
31
+ name: Authorize actor
32
+ if: github.event_name == 'workflow_dispatch'
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - name: Check triggering actor against allow-list
36
+ env:
37
+ ACTOR: ${{ github.triggering_actor }}
38
+ ALLOWED: ${{ env.RELEASE_ALLOWED_ACTORS }}
39
+ run: |
40
+ echo "Triggered by: $ACTOR"
41
+ echo "Allow-list: $ALLOWED"
42
+ if printf '%s' ",$ALLOWED," | tr -d ' ' | grep -q ",${ACTOR},"; then
43
+ echo "$ACTOR is authorized to trigger releases."
44
+ else
45
+ echo "$ACTOR is NOT in RELEASE_ALLOWED_ACTORS." >&2
46
+ echo "Update the allow-list in .github/workflows/release.yml if needed." >&2
47
+ exit 1
48
+ fi
49
+
50
+ verify-ci:
51
+ name: Verify CI passed
52
+ needs: authorize
53
+ if: github.event_name == 'workflow_dispatch'
54
+ runs-on: ubuntu-latest
55
+ steps:
56
+ - name: Ensure target commit passed CI build
57
+ uses: actions/github-script@v7
58
+ with:
59
+ script: |
60
+ const { owner, repo } = context.repo;
61
+ const ref = context.sha;
62
+ const { data } = await github.rest.checks.listForRef({
63
+ owner,
64
+ repo,
65
+ ref,
66
+ per_page: 100,
67
+ });
68
+
69
+ const buildCheck = data.check_runs.find((run) => run.name === 'Build');
70
+
71
+ if (!buildCheck) {
72
+ core.setFailed(`No 'Build' check found for ${ref}. Run CI on this commit before releasing.`);
73
+ return;
74
+ }
75
+
76
+ if (buildCheck.status !== 'completed' || buildCheck.conclusion !== 'success') {
77
+ core.setFailed(
78
+ `'Build' check for ${ref} is ${buildCheck.status}/${buildCheck.conclusion ?? 'null'}. ` +
79
+ `Release requires a successful CI run first.`,
80
+ );
81
+ }
82
+
83
+ release-auto:
84
+ name: Release npm package
85
+ if: |
86
+ github.event_name == 'workflow_run' &&
87
+ github.event.workflow_run.conclusion == 'success' &&
88
+ github.event.workflow_run.event == 'push' &&
89
+ github.event.workflow_run.head_branch == 'main'
90
+ runs-on: ubuntu-latest
91
+ steps:
92
+ - uses: actions/checkout@v6
93
+ with:
94
+ fetch-depth: 0
95
+ persist-credentials: false
96
+ ref: ${{ github.event.workflow_run.head_sha || github.sha }}
97
+
98
+ - uses: actions/setup-node@v6
99
+ with:
100
+ node-version-file: .nvmrc
101
+ cache: npm
102
+
103
+ - run: npm ci
104
+
105
+ - name: Install npm with OIDC support
106
+ run: npm install --no-save npm@11.5.1
107
+
108
+ - run: npm run build
109
+
110
+ - name: Semantic Release
111
+ env:
112
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
113
+ run: |
114
+ export PATH="$PWD/node_modules/.bin:$PATH"
115
+ npm --version
116
+ npx semantic-release
117
+
118
+ release-manual:
119
+ name: Release npm package (manual)
120
+ needs: verify-ci
121
+ if: github.event_name == 'workflow_dispatch'
122
+ runs-on: ubuntu-latest
123
+ steps:
124
+ - name: Record trigger reason
125
+ if: ${{ inputs.reason != '' }}
126
+ run: echo "Manual release reason - ${{ inputs.reason }}" >> "$GITHUB_STEP_SUMMARY"
127
+
128
+ - uses: actions/checkout@v6
129
+ with:
130
+ fetch-depth: 0
131
+ persist-credentials: false
132
+ ref: ${{ github.event.workflow_run.head_sha || github.sha }}
133
+
134
+ - uses: actions/setup-node@v6
135
+ with:
136
+ node-version-file: .nvmrc
137
+ cache: npm
138
+
139
+ - run: npm ci
140
+
141
+ - name: Install npm with OIDC support
142
+ run: npm install --no-save npm@11.5.1
143
+
144
+ - run: npm run build
145
+
146
+ - name: Semantic Release
147
+ env:
148
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
149
+ run: |
150
+ export PATH="$PWD/node_modules/.bin:$PATH"
151
+ npm --version
152
+ npx semantic-release
package/.nvmrc ADDED
@@ -0,0 +1 @@
1
+ 22
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
- # [1.1.0](https://github.com/usrivastava92/obsidian-native-mcp/compare/v1.0.3...v1.1.0) (2026-05-20)
1
+ # [1.3.0](https://github.com/usrivastava92/obsidian-native-mcp/compare/v1.2.0...v1.3.0) (2026-05-23)
2
2
 
3
3
 
4
4
  ### Features
5
5
 
6
- * add expanded MCP file management tools ([#11](https://github.com/usrivastava92/obsidian-native-mcp/issues/11)) ([b0ded35](https://github.com/usrivastava92/obsidian-native-mcp/commit/b0ded35492b10000998b283c1bbd1827edd28ef3))
6
+ * v1.0 complete rewrite LLM-optimized MCP server ([60b0bd0](https://github.com/usrivastava92/obsidian-native-mcp/commit/60b0bd0aa65a015768c89925a7e9109a0c91b305))