obsidian-mcp-server 2.0.6 → 3.0.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.
- package/CLAUDE.md +364 -0
- package/Dockerfile +99 -0
- package/LICENSE +4 -6
- package/README.md +246 -206
- package/changelog/3.0.x/3.0.0.md +102 -0
- package/changelog/template.md +51 -0
- package/dist/config/server-config.d.ts +19 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +55 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -295
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts +8 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.js +8 -0
- package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/index.d.ts +36 -0
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/index.js +9 -0
- package/dist/mcp-server/resources/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-status.resource.d.ts +23 -0
- package/dist/mcp-server/resources/definitions/obsidian-status.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-status.resource.js +47 -0
- package/dist/mcp-server/resources/definitions/obsidian-status.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts +13 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js +30 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts +21 -0
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js +38 -0
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts +45 -0
- package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/_shared/schemas.js +66 -0
- package/dist/mcp-server/tools/definitions/_shared/schemas.js.map +1 -0
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts +51 -0
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js +120 -0
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js.map +1 -0
- package/dist/mcp-server/tools/definitions/index.d.ts +531 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +38 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +42 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +58 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +46 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +66 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts +19 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js +43 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +92 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +245 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.d.ts +13 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.js +38 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +59 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +273 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts +13 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js +38 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts +68 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +178 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts +77 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +172 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +22 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +88 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts +81 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +83 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts +59 -0
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +167 -0
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +76 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +244 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +41 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +76 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -0
- package/dist/services/obsidian/frontmatter-ops.d.ts +34 -0
- package/dist/services/obsidian/frontmatter-ops.d.ts.map +1 -0
- package/dist/services/obsidian/frontmatter-ops.js +230 -0
- package/dist/services/obsidian/frontmatter-ops.js.map +1 -0
- package/dist/services/obsidian/obsidian-service.d.ts +73 -0
- package/dist/services/obsidian/obsidian-service.d.ts.map +1 -0
- package/dist/services/obsidian/obsidian-service.js +399 -0
- package/dist/services/obsidian/obsidian-service.js.map +1 -0
- package/dist/services/obsidian/section-extractor.d.ts +13 -0
- package/dist/services/obsidian/section-extractor.d.ts.map +1 -0
- package/dist/services/obsidian/section-extractor.js +124 -0
- package/dist/services/obsidian/section-extractor.js.map +1 -0
- package/dist/services/obsidian/types.d.ts +91 -0
- package/dist/services/obsidian/types.d.ts.map +1 -0
- package/dist/services/obsidian/types.js +7 -0
- package/dist/services/obsidian/types.js.map +1 -0
- package/package.json +63 -69
- package/server.json +167 -0
- package/CHANGELOG.md +0 -118
- package/dist/config/index.d.ts +0 -41
- package/dist/config/index.js +0 -191
- package/dist/mcp-server/server.d.ts +0 -33
- package/dist/mcp-server/server.js +0 -211
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/logic.d.ts +0 -51
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/logic.js +0 -168
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/registration.d.ts +0 -19
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/registration.js +0 -91
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/logic.d.ts +0 -77
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/logic.js +0 -341
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/registration.d.ts +0 -18
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/registration.js +0 -69
- package/dist/mcp-server/tools/obsidianListNotesTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianListNotesTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianListNotesTool/logic.d.ts +0 -68
- package/dist/mcp-server/tools/obsidianListNotesTool/logic.js +0 -215
- package/dist/mcp-server/tools/obsidianListNotesTool/registration.d.ts +0 -23
- package/dist/mcp-server/tools/obsidianListNotesTool/registration.js +0 -98
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/index.d.ts +0 -3
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/index.js +0 -2
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/logic.d.ts +0 -42
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/logic.js +0 -152
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/registration.d.ts +0 -3
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/registration.js +0 -52
- package/dist/mcp-server/tools/obsidianManageTagsTool/index.d.ts +0 -3
- package/dist/mcp-server/tools/obsidianManageTagsTool/index.js +0 -2
- package/dist/mcp-server/tools/obsidianManageTagsTool/logic.d.ts +0 -28
- package/dist/mcp-server/tools/obsidianManageTagsTool/logic.js +0 -161
- package/dist/mcp-server/tools/obsidianManageTagsTool/registration.d.ts +0 -3
- package/dist/mcp-server/tools/obsidianManageTagsTool/registration.js +0 -52
- package/dist/mcp-server/tools/obsidianReadNoteTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianReadNoteTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianReadNoteTool/logic.d.ts +0 -87
- package/dist/mcp-server/tools/obsidianReadNoteTool/logic.js +0 -216
- package/dist/mcp-server/tools/obsidianReadNoteTool/registration.d.ts +0 -20
- package/dist/mcp-server/tools/obsidianReadNoteTool/registration.js +0 -101
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/logic.d.ts +0 -255
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/logic.js +0 -583
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/registration.d.ts +0 -22
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/registration.js +0 -111
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/logic.d.ts +0 -183
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/logic.js +0 -490
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/registration.d.ts +0 -21
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/registration.js +0 -108
- package/dist/mcp-server/transports/auth/core/authContext.d.ts +0 -33
- package/dist/mcp-server/transports/auth/core/authContext.js +0 -24
- package/dist/mcp-server/transports/auth/core/authTypes.d.ts +0 -17
- package/dist/mcp-server/transports/auth/core/authTypes.js +0 -5
- package/dist/mcp-server/transports/auth/core/authUtils.d.ts +0 -18
- package/dist/mcp-server/transports/auth/core/authUtils.js +0 -45
- package/dist/mcp-server/transports/auth/index.d.ts +0 -10
- package/dist/mcp-server/transports/auth/index.js +0 -9
- package/dist/mcp-server/transports/auth/strategies/jwt/jwtMiddleware.d.ts +0 -27
- package/dist/mcp-server/transports/auth/strategies/jwt/jwtMiddleware.js +0 -149
- package/dist/mcp-server/transports/auth/strategies/oauth/oauthMiddleware.d.ts +0 -20
- package/dist/mcp-server/transports/auth/strategies/oauth/oauthMiddleware.js +0 -124
- package/dist/mcp-server/transports/httpErrorHandler.d.ts +0 -26
- package/dist/mcp-server/transports/httpErrorHandler.js +0 -73
- package/dist/mcp-server/transports/httpTransport.d.ts +0 -21
- package/dist/mcp-server/transports/httpTransport.js +0 -208
- package/dist/mcp-server/transports/stdioTransport.d.ts +0 -42
- package/dist/mcp-server/transports/stdioTransport.js +0 -63
- package/dist/services/obsidianRestAPI/index.d.ts +0 -15
- package/dist/services/obsidianRestAPI/index.js +0 -17
- package/dist/services/obsidianRestAPI/methods/activeFileMethods.d.ts +0 -38
- package/dist/services/obsidianRestAPI/methods/activeFileMethods.js +0 -62
- package/dist/services/obsidianRestAPI/methods/commandMethods.d.ts +0 -22
- package/dist/services/obsidianRestAPI/methods/commandMethods.js +0 -31
- package/dist/services/obsidianRestAPI/methods/openMethods.d.ts +0 -16
- package/dist/services/obsidianRestAPI/methods/openMethods.js +0 -21
- package/dist/services/obsidianRestAPI/methods/patchMethods.d.ts +0 -37
- package/dist/services/obsidianRestAPI/methods/patchMethods.js +0 -94
- package/dist/services/obsidianRestAPI/methods/periodicNoteMethods.d.ts +0 -42
- package/dist/services/obsidianRestAPI/methods/periodicNoteMethods.js +0 -66
- package/dist/services/obsidianRestAPI/methods/searchMethods.d.ts +0 -25
- package/dist/services/obsidianRestAPI/methods/searchMethods.js +0 -36
- package/dist/services/obsidianRestAPI/methods/vaultMethods.d.ts +0 -58
- package/dist/services/obsidianRestAPI/methods/vaultMethods.js +0 -144
- package/dist/services/obsidianRestAPI/service.d.ts +0 -195
- package/dist/services/obsidianRestAPI/service.js +0 -379
- package/dist/services/obsidianRestAPI/types.d.ts +0 -127
- package/dist/services/obsidianRestAPI/types.js +0 -7
- package/dist/services/obsidianRestAPI/vaultCache/index.d.ts +0 -4
- package/dist/services/obsidianRestAPI/vaultCache/index.js +0 -4
- package/dist/services/obsidianRestAPI/vaultCache/service.d.ts +0 -88
- package/dist/services/obsidianRestAPI/vaultCache/service.js +0 -299
- package/dist/types-global/errors.d.ts +0 -73
- package/dist/types-global/errors.js +0 -71
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.js +0 -13
- package/dist/utils/internal/asyncUtils.d.ts +0 -54
- package/dist/utils/internal/asyncUtils.js +0 -101
- package/dist/utils/internal/errorHandler.d.ts +0 -176
- package/dist/utils/internal/errorHandler.js +0 -351
- package/dist/utils/internal/index.d.ts +0 -4
- package/dist/utils/internal/index.js +0 -4
- package/dist/utils/internal/logger.d.ts +0 -141
- package/dist/utils/internal/logger.js +0 -406
- package/dist/utils/internal/requestContext.d.ts +0 -83
- package/dist/utils/internal/requestContext.js +0 -72
- package/dist/utils/metrics/index.d.ts +0 -1
- package/dist/utils/metrics/index.js +0 -1
- package/dist/utils/metrics/tokenCounter.d.ts +0 -27
- package/dist/utils/metrics/tokenCounter.js +0 -128
- package/dist/utils/obsidian/index.d.ts +0 -5
- package/dist/utils/obsidian/index.js +0 -5
- package/dist/utils/obsidian/obsidianApiUtils.d.ts +0 -14
- package/dist/utils/obsidian/obsidianApiUtils.js +0 -29
- package/dist/utils/obsidian/obsidianStatUtils.d.ts +0 -68
- package/dist/utils/obsidian/obsidianStatUtils.js +0 -143
- package/dist/utils/parsing/dateParser.d.ts +0 -56
- package/dist/utils/parsing/dateParser.js +0 -104
- package/dist/utils/parsing/index.d.ts +0 -2
- package/dist/utils/parsing/index.js +0 -3
- package/dist/utils/parsing/jsonParser.d.ts +0 -80
- package/dist/utils/parsing/jsonParser.js +0 -133
- package/dist/utils/security/idGenerator.d.ts +0 -140
- package/dist/utils/security/idGenerator.js +0 -194
- package/dist/utils/security/index.d.ts +0 -3
- package/dist/utils/security/index.js +0 -3
- package/dist/utils/security/rateLimiter.d.ts +0 -156
- package/dist/utils/security/rateLimiter.js +0 -235
- package/dist/utils/security/sanitization.d.ts +0 -244
- package/dist/utils/security/sanitization.js +0 -599
package/CHANGELOG.md
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [2.0.6] - 2025-06-20
|
|
9
|
-
|
|
10
|
-
### Changed
|
|
11
|
-
|
|
12
|
-
- **Tool Renaming**: Renamed `obsidian_read_file`, `obsidian_delete_file`, and `obsidian_list_files` to `obsidian_read_note`, `obsidian_delete_note`, and `obsidian_list_notes` respectively. This change improves semantic clarity and aligns the tool names more closely with Obsidian's terminology, reducing ambiguity for AI agents.
|
|
13
|
-
- **Dependency Updates**: Updated all dependencies to their latest versions.
|
|
14
|
-
- **Documentation Improvements**: Updated `.clinerules` to reflect the new tool names and ensure all documentation is current.
|
|
15
|
-
|
|
16
|
-
## [2.0.5] - 2025-06-20
|
|
17
|
-
|
|
18
|
-
### Changed
|
|
19
|
-
|
|
20
|
-
- **Tool Renaming**: Renamed the `obsidian_update_file` tool to `obsidian_update_note` to avoid conflicts and better reflect its function. During agentic use, LLMs confused this tool with filesystem operations, leading to errors. The new name clarifies that it operates on Obsidian notes specifically.
|
|
21
|
-
- **HTTP Transport Refactor**: Restructured the HTTP transport layer for improved clarity and robustness. Authentication logic is now more modular, and a centralized error handler has been implemented.
|
|
22
|
-
- **Dependency Updates**: Updated all dependencies to their latest versions.
|
|
23
|
-
- **Documentation Improvements**: Enhanced the documentation around installation & MCP Client configuration. Suggested by [@bgheneti](https://github.com/bgheneti) in [PR #14](https://github.com/cyanheads/obsidian-mcp-server/pull/14). Thanks!
|
|
24
|
-
|
|
25
|
-
## [2.0.4] - 2025-06-13
|
|
26
|
-
|
|
27
|
-
### Added
|
|
28
|
-
|
|
29
|
-
- **Recursive File Listing**: The `obsidian_list_files` tool now supports recursive listing of directories with a `recursionDepth` parameter.
|
|
30
|
-
|
|
31
|
-
### Changed
|
|
32
|
-
|
|
33
|
-
- **Documentation**:
|
|
34
|
-
- Consolidated tool specifications into `obsidian_mcp_tools_spec.md`.
|
|
35
|
-
- Updated `.clinerules` with a detailed logger implementation example for the agent.
|
|
36
|
-
- Updated the repository's directory tree documentation.
|
|
37
|
-
|
|
38
|
-
## [2.0.3] - 2025-06-12
|
|
39
|
-
|
|
40
|
-
### Fixed
|
|
41
|
-
|
|
42
|
-
- **NPM Package Display**: Explicitly included `README.md`, `LICENSE`, and `CHANGELOG.md` in the `files` array in `package.json` to ensure they are displayed correctly on the npm package page.
|
|
43
|
-
|
|
44
|
-
## [2.0.2] - 2025-06-12
|
|
45
|
-
|
|
46
|
-
### Fixed
|
|
47
|
-
|
|
48
|
-
- **NPM Package Version**: Bad npm package. Bumping to v2.0.2 for publishing.
|
|
49
|
-
|
|
50
|
-
## [2.0.1] - 2025-06-12
|
|
51
|
-
|
|
52
|
-
### Added
|
|
53
|
-
|
|
54
|
-
- **Enhanced Documentation**:
|
|
55
|
-
- Added a warning to the `VaultCacheService` documentation about its potential for high memory usage on large vaults.
|
|
56
|
-
- Added a code comment in `obsidianManageFrontmatterTool` to clarify the regex-based key deletion strategy.
|
|
57
|
-
|
|
58
|
-
### Changed
|
|
59
|
-
|
|
60
|
-
- **Improved SSL Handling**: The `OBSIDIAN_VERIFY_SSL` environment variable is now correctly parsed as a boolean, ensuring more reliable SSL verification behavior.
|
|
61
|
-
- **API Service Refactoring**: Simplified the `httpsAgent` handling within the `ObsidianRestApiService` to improve code clarity and remove redundant agent creation on each request.
|
|
62
|
-
|
|
63
|
-
### Fixed
|
|
64
|
-
|
|
65
|
-
- **Path Import Correction**: Corrected a path import in the `obsidianGlobalSearchTool` to use `node:path/posix` for better cross-platform compatibility.
|
|
66
|
-
|
|
67
|
-
## [2.0.0] - 2025-06-12
|
|
68
|
-
|
|
69
|
-
Version 2.0.0 is a complete overhaul of the Obsidian MCP Server, migrating it to my [`cyanheads/mcp-ts-template`](https://github.com/cyanheads/mcp-ts-template). This release introduces a more robust architecture, a streamlined toolset, enhanced security, and significant performance improvements. It is a breaking change from the 1.x series.
|
|
70
|
-
|
|
71
|
-
### Added
|
|
72
|
-
|
|
73
|
-
- **New Core Architecture**: The server is now built on the [`cyanheads/mcp-ts-template`](https://github.com/cyanheads/mcp-ts-template), providing a standardized, modular, and maintainable structure.
|
|
74
|
-
- **Hono HTTP Transport**: The HTTP transport has been migrated from Express to Hono, offering a more lightweight and performant server.
|
|
75
|
-
- **Vault Cache Service**: A new in-memory `VaultCacheService` has been introduced. It caches vault content to improve performance for search operations and provides a resilient fallback if the Obsidian API is temporarily unavailable. It also refreshes periodically.
|
|
76
|
-
- **Advanced Authentication**:
|
|
77
|
-
- Added support for **OAuth 2.1** bearer token validation alongside the existing secret key-based JWTs.
|
|
78
|
-
- Introduced `authContext` using `AsyncLocalStorage` for secure, request-scoped access to authentication details.
|
|
79
|
-
- **New Tools**:
|
|
80
|
-
- `obsidian_delete_file`: A new tool to permanently delete files from the vault.
|
|
81
|
-
- `obsidian_search_replace`: A powerful new tool to perform search and replace operations with regex support.
|
|
82
|
-
- **Enhanced Utilities**:
|
|
83
|
-
- **Request Context**: A robust request context system (`requestContextService`) for improved logging and tracing.
|
|
84
|
-
- **Error Handling**: A centralized `ErrorHandler` for consistent and detailed error reporting.
|
|
85
|
-
- **Async Utilities**: A `retryWithDelay` utility is now used across the application to make API calls more resilient.
|
|
86
|
-
- **New Development Scripts**: Added `docs:generate` (for TypeDoc) and `inspect:stdio`/`inspect:http` (for MCP Inspector) to `package.json`.
|
|
87
|
-
|
|
88
|
-
### Changed
|
|
89
|
-
|
|
90
|
-
- **Project Structure**: The entire project has been reorganized to align with the [`cyanheads/mcp-ts-template`](https://github.com/cyanheads/mcp-ts-template), improving separation of concerns (e.g., `services`, `mcp-server`, `types-global`).
|
|
91
|
-
- **Tool Consolidation and Enhancement**: The toolset has been redesigned for clarity and power:
|
|
92
|
-
- `obsidian_list_files` replaces `obsidian_list_files_in_vault` and `obsidian_list_files_in_dir`, offering more flexible filtering.
|
|
93
|
-
- `obsidian_read_file` replaces `obsidian_get_file_contents` and now supports returning content as structured JSON.
|
|
94
|
-
- `obsidian_update_file` replaces `obsidian_append_content` and `obsidian_update_content` with explicit modes (`append`, `prepend`, `overwrite`).
|
|
95
|
-
- `obsidian_global_search` replaces `obsidian_find_in_file` with added support for path/date filtering and pagination.
|
|
96
|
-
- `obsidian_manage_frontmatter` replaces `obsidian_get_properties` and `obsidian_update_properties` with atomic get/set/delete operations.
|
|
97
|
-
- `obsidian_manage_tags` replaces `obsidian_get_tags` and now manages both frontmatter and inline tags.
|
|
98
|
-
- **Configuration Overhaul**: Environment variables have been renamed for consistency and clarity.
|
|
99
|
-
- `OBSIDIAN_BASE_URL` now consolidates protocol, host, and port.
|
|
100
|
-
- New variables like `MCP_TRANSPORT_TYPE`, `MCP_LOG_LEVEL`, and `MCP_AUTH_SECRET_KEY` have been introduced.
|
|
101
|
-
- **Dependency Updates**: All dependencies, including the MCP SDK, have been updated to their latest stable versions.
|
|
102
|
-
- **Obsidian API Service**: The `ObsidianRestApiService` has been completely refactored into a modular class, providing a typed, resilient, and centralized client for all interactions with the Obsidian Local REST API.
|
|
103
|
-
|
|
104
|
-
### Removed
|
|
105
|
-
|
|
106
|
-
- **Removed Tools**: The following tools from version 1.x have been removed and their functionality integrated into the new, more comprehensive tools:
|
|
107
|
-
- `obsidian_list_files_in_vault`
|
|
108
|
-
- `obsidian_list_files_in_dir`
|
|
109
|
-
- `obsidian_get_file_contents`
|
|
110
|
-
- `obsidian_append_content`
|
|
111
|
-
- `obsidian_update_content`
|
|
112
|
-
- `obsidian_find_in_file`
|
|
113
|
-
- `obsidian_complex_search` (path-based searching is now a filter in `obsidian_global_search`)
|
|
114
|
-
- `obsidian_get_tags`
|
|
115
|
-
- `obsidian_get_properties`
|
|
116
|
-
- `obsidian_update_properties`
|
|
117
|
-
- **Removed Resources**: The `obsidian://tags` resource has been removed. Tag information is now available through the `obsidian_manage_tags` tool. I may add the resource back in the future if there is demand for it. Please open an issue if you would like to see it return.
|
|
118
|
-
- **Old Configuration**: All old, non-prefixed environment variables (e.g., `VERIFY_SSL`, `REQUEST_TIMEOUT`) have been removed in favor of the new, standardized configuration schema.
|
package/dist/config/index.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Main application configuration object.
|
|
3
|
-
*/
|
|
4
|
-
export declare const config: {
|
|
5
|
-
pkg: {
|
|
6
|
-
name: string;
|
|
7
|
-
version: string;
|
|
8
|
-
};
|
|
9
|
-
mcpServerName: string;
|
|
10
|
-
mcpServerVersion: string;
|
|
11
|
-
logLevel: string;
|
|
12
|
-
logsPath: string;
|
|
13
|
-
environment: string;
|
|
14
|
-
mcpTransportType: "stdio" | "http";
|
|
15
|
-
mcpHttpPort: number;
|
|
16
|
-
mcpHttpHost: string;
|
|
17
|
-
mcpAllowedOrigins: string[] | undefined;
|
|
18
|
-
mcpAuthMode: "jwt" | "oauth" | undefined;
|
|
19
|
-
mcpAuthSecretKey: string | undefined;
|
|
20
|
-
oauthIssuerUrl: string | undefined;
|
|
21
|
-
oauthAudience: string | undefined;
|
|
22
|
-
oauthJwksUri: string | undefined;
|
|
23
|
-
obsidianApiKey: string;
|
|
24
|
-
obsidianBaseUrl: string;
|
|
25
|
-
obsidianVerifySsl: boolean;
|
|
26
|
-
obsidianCacheRefreshIntervalMin: number;
|
|
27
|
-
obsidianEnableCache: boolean;
|
|
28
|
-
obsidianApiSearchTimeoutMs: number;
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* The configured logging level for the application.
|
|
32
|
-
* Exported separately for convenience (e.g., logger initialization).
|
|
33
|
-
* @type {string}
|
|
34
|
-
*/
|
|
35
|
-
export declare const logLevel: string;
|
|
36
|
-
/**
|
|
37
|
-
* The configured runtime environment for the application.
|
|
38
|
-
* Exported separately for convenience.
|
|
39
|
-
* @type {string}
|
|
40
|
-
*/
|
|
41
|
-
export declare const environment: string;
|
package/dist/config/index.js
DELETED
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import dotenv from "dotenv";
|
|
2
|
-
import { existsSync, mkdirSync, readFileSync, statSync } from "fs";
|
|
3
|
-
import path, { dirname, join } from "path";
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
dotenv.config();
|
|
7
|
-
// --- Determine Project Root ---
|
|
8
|
-
/**
|
|
9
|
-
* Finds the project root directory by searching upwards for package.json.
|
|
10
|
-
* @param startDir The directory to start searching from.
|
|
11
|
-
* @returns The absolute path to the project root, or throws an error if not found.
|
|
12
|
-
*/
|
|
13
|
-
const findProjectRoot = (startDir) => {
|
|
14
|
-
let currentDir = startDir;
|
|
15
|
-
while (true) {
|
|
16
|
-
const packageJsonPath = join(currentDir, "package.json");
|
|
17
|
-
if (existsSync(packageJsonPath)) {
|
|
18
|
-
return currentDir;
|
|
19
|
-
}
|
|
20
|
-
const parentDir = dirname(currentDir);
|
|
21
|
-
if (parentDir === currentDir) {
|
|
22
|
-
// Reached the root of the filesystem without finding package.json
|
|
23
|
-
throw new Error(`Could not find project root (package.json) starting from ${startDir}`);
|
|
24
|
-
}
|
|
25
|
-
currentDir = parentDir;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
let projectRoot;
|
|
29
|
-
try {
|
|
30
|
-
// For ESM, __dirname is not available directly.
|
|
31
|
-
const currentModuleDir = dirname(fileURLToPath(import.meta.url));
|
|
32
|
-
projectRoot = findProjectRoot(currentModuleDir);
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
console.error(`FATAL: Error determining project root: ${error.message}`);
|
|
36
|
-
projectRoot = process.cwd();
|
|
37
|
-
console.warn(`Warning: Using process.cwd() (${projectRoot}) as fallback project root.`);
|
|
38
|
-
}
|
|
39
|
-
// --- End Determine Project Root ---
|
|
40
|
-
const pkgPath = join(projectRoot, "package.json");
|
|
41
|
-
let pkg = { name: "obsidian-mcp-server", version: "0.0.0" };
|
|
42
|
-
try {
|
|
43
|
-
pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
44
|
-
}
|
|
45
|
-
catch (error) {
|
|
46
|
-
if (process.stderr.isTTY) {
|
|
47
|
-
console.error("Warning: Could not read package.json for default config values. Using hardcoded defaults.", error);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Zod schema for validating environment variables.
|
|
52
|
-
* @private
|
|
53
|
-
*/
|
|
54
|
-
const EnvSchema = z.object({
|
|
55
|
-
MCP_SERVER_NAME: z.string().optional(),
|
|
56
|
-
MCP_SERVER_VERSION: z.string().optional(),
|
|
57
|
-
MCP_LOG_LEVEL: z.string().default("info"),
|
|
58
|
-
LOGS_DIR: z.string().default(path.join(projectRoot, "logs")),
|
|
59
|
-
NODE_ENV: z.string().default("development"),
|
|
60
|
-
MCP_TRANSPORT_TYPE: z.enum(["stdio", "http"]).default("stdio"),
|
|
61
|
-
MCP_HTTP_PORT: z.coerce.number().int().positive().default(3010),
|
|
62
|
-
MCP_HTTP_HOST: z.string().default("127.0.0.1"),
|
|
63
|
-
MCP_ALLOWED_ORIGINS: z.string().optional(),
|
|
64
|
-
MCP_AUTH_MODE: z.enum(["jwt", "oauth"]).optional(),
|
|
65
|
-
MCP_AUTH_SECRET_KEY: z
|
|
66
|
-
.string()
|
|
67
|
-
.min(32, "MCP_AUTH_SECRET_KEY must be at least 32 characters long for security")
|
|
68
|
-
.optional(),
|
|
69
|
-
OAUTH_ISSUER_URL: z.string().url().optional(),
|
|
70
|
-
OAUTH_AUDIENCE: z.string().optional(),
|
|
71
|
-
OAUTH_JWKS_URI: z.string().url().optional(),
|
|
72
|
-
// --- Obsidian Specific Config ---
|
|
73
|
-
OBSIDIAN_API_KEY: z.string().min(1, "OBSIDIAN_API_KEY cannot be empty"),
|
|
74
|
-
OBSIDIAN_BASE_URL: z.string().url().default("http://127.0.0.1:27123"),
|
|
75
|
-
OBSIDIAN_VERIFY_SSL: z
|
|
76
|
-
.string()
|
|
77
|
-
.transform((val) => val.toLowerCase() === "true")
|
|
78
|
-
.default("false"),
|
|
79
|
-
OBSIDIAN_CACHE_REFRESH_INTERVAL_MIN: z.coerce
|
|
80
|
-
.number()
|
|
81
|
-
.int()
|
|
82
|
-
.positive()
|
|
83
|
-
.default(10),
|
|
84
|
-
OBSIDIAN_ENABLE_CACHE: z
|
|
85
|
-
.string()
|
|
86
|
-
.transform((val) => val.toLowerCase() === "true")
|
|
87
|
-
.default("true"),
|
|
88
|
-
OBSIDIAN_API_SEARCH_TIMEOUT_MS: z.coerce
|
|
89
|
-
.number()
|
|
90
|
-
.int()
|
|
91
|
-
.positive()
|
|
92
|
-
.default(30000),
|
|
93
|
-
});
|
|
94
|
-
const parsedEnv = EnvSchema.safeParse(process.env);
|
|
95
|
-
if (!parsedEnv.success) {
|
|
96
|
-
const errorDetails = parsedEnv.error.flatten().fieldErrors;
|
|
97
|
-
if (process.stderr.isTTY) {
|
|
98
|
-
console.error("❌ Invalid environment variables:", errorDetails);
|
|
99
|
-
}
|
|
100
|
-
throw new Error(`Invalid environment configuration. Please check your .env file or environment variables. Details: ${JSON.stringify(errorDetails)}`);
|
|
101
|
-
}
|
|
102
|
-
const env = parsedEnv.data;
|
|
103
|
-
// --- Directory Ensurance Function ---
|
|
104
|
-
const ensureDirectory = (dirPath, rootDir, dirName) => {
|
|
105
|
-
const resolvedDirPath = path.isAbsolute(dirPath)
|
|
106
|
-
? dirPath
|
|
107
|
-
: path.resolve(rootDir, dirPath);
|
|
108
|
-
if (!resolvedDirPath.startsWith(rootDir + path.sep) &&
|
|
109
|
-
resolvedDirPath !== rootDir) {
|
|
110
|
-
if (process.stderr.isTTY) {
|
|
111
|
-
console.error(`Error: ${dirName} path "${dirPath}" resolves to "${resolvedDirPath}", which is outside the project boundary "${rootDir}".`);
|
|
112
|
-
}
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
if (!existsSync(resolvedDirPath)) {
|
|
116
|
-
try {
|
|
117
|
-
mkdirSync(resolvedDirPath, { recursive: true });
|
|
118
|
-
}
|
|
119
|
-
catch (err) {
|
|
120
|
-
if (process.stderr.isTTY) {
|
|
121
|
-
console.error(`Error creating ${dirName} directory at ${resolvedDirPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
122
|
-
}
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
try {
|
|
128
|
-
if (!statSync(resolvedDirPath).isDirectory()) {
|
|
129
|
-
if (process.stderr.isTTY) {
|
|
130
|
-
console.error(`Error: ${dirName} path ${resolvedDirPath} exists but is not a directory.`);
|
|
131
|
-
}
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
catch (statError) {
|
|
136
|
-
if (process.stderr.isTTY) {
|
|
137
|
-
console.error(`Error accessing ${dirName} path ${resolvedDirPath}: ${statError.message}`);
|
|
138
|
-
}
|
|
139
|
-
return null;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return resolvedDirPath;
|
|
143
|
-
};
|
|
144
|
-
// --- End Directory Ensurance Function ---
|
|
145
|
-
const validatedLogsPath = ensureDirectory(env.LOGS_DIR, projectRoot, "logs");
|
|
146
|
-
if (!validatedLogsPath) {
|
|
147
|
-
if (process.stderr.isTTY) {
|
|
148
|
-
console.error("FATAL: Logs directory configuration is invalid or could not be created. Please check permissions and path. Exiting.");
|
|
149
|
-
}
|
|
150
|
-
process.exit(1);
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Main application configuration object.
|
|
154
|
-
*/
|
|
155
|
-
export const config = {
|
|
156
|
-
pkg,
|
|
157
|
-
mcpServerName: env.MCP_SERVER_NAME || pkg.name,
|
|
158
|
-
mcpServerVersion: env.MCP_SERVER_VERSION || pkg.version,
|
|
159
|
-
logLevel: env.MCP_LOG_LEVEL,
|
|
160
|
-
logsPath: validatedLogsPath,
|
|
161
|
-
environment: env.NODE_ENV,
|
|
162
|
-
mcpTransportType: env.MCP_TRANSPORT_TYPE,
|
|
163
|
-
mcpHttpPort: env.MCP_HTTP_PORT,
|
|
164
|
-
mcpHttpHost: env.MCP_HTTP_HOST,
|
|
165
|
-
mcpAllowedOrigins: env.MCP_ALLOWED_ORIGINS?.split(",")
|
|
166
|
-
.map((origin) => origin.trim())
|
|
167
|
-
.filter(Boolean),
|
|
168
|
-
mcpAuthMode: env.MCP_AUTH_MODE,
|
|
169
|
-
mcpAuthSecretKey: env.MCP_AUTH_SECRET_KEY,
|
|
170
|
-
oauthIssuerUrl: env.OAUTH_ISSUER_URL,
|
|
171
|
-
oauthAudience: env.OAUTH_AUDIENCE,
|
|
172
|
-
oauthJwksUri: env.OAUTH_JWKS_URI,
|
|
173
|
-
obsidianApiKey: env.OBSIDIAN_API_KEY,
|
|
174
|
-
obsidianBaseUrl: env.OBSIDIAN_BASE_URL,
|
|
175
|
-
obsidianVerifySsl: env.OBSIDIAN_VERIFY_SSL,
|
|
176
|
-
obsidianCacheRefreshIntervalMin: env.OBSIDIAN_CACHE_REFRESH_INTERVAL_MIN,
|
|
177
|
-
obsidianEnableCache: env.OBSIDIAN_ENABLE_CACHE,
|
|
178
|
-
obsidianApiSearchTimeoutMs: env.OBSIDIAN_API_SEARCH_TIMEOUT_MS,
|
|
179
|
-
};
|
|
180
|
-
/**
|
|
181
|
-
* The configured logging level for the application.
|
|
182
|
-
* Exported separately for convenience (e.g., logger initialization).
|
|
183
|
-
* @type {string}
|
|
184
|
-
*/
|
|
185
|
-
export const logLevel = config.logLevel;
|
|
186
|
-
/**
|
|
187
|
-
* The configured runtime environment for the application.
|
|
188
|
-
* Exported separately for convenience.
|
|
189
|
-
* @type {string}
|
|
190
|
-
*/
|
|
191
|
-
export const environment = config.environment;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Main entry point for the MCP (Model Context Protocol) server.
|
|
3
|
-
* This file orchestrates the server's lifecycle:
|
|
4
|
-
* 1. Initializes the core `McpServer` instance (from `@modelcontextprotocol/sdk`) with its identity and capabilities.
|
|
5
|
-
* 2. Registers available resources and tools, making them discoverable and usable by clients.
|
|
6
|
-
* 3. Selects and starts the appropriate communication transport (stdio or Streamable HTTP)
|
|
7
|
-
* based on configuration.
|
|
8
|
-
* 4. Handles top-level error management during startup.
|
|
9
|
-
*
|
|
10
|
-
* MCP Specification References:
|
|
11
|
-
* - Lifecycle: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/basic/lifecycle.mdx
|
|
12
|
-
* - Overview (Capabilities): https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/basic/index.mdx
|
|
13
|
-
* - Transports: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/basic/transports.mdx
|
|
14
|
-
* @module src/mcp-server/server
|
|
15
|
-
*/
|
|
16
|
-
import { ServerType } from "@hono/node-server";
|
|
17
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
18
|
-
import { ObsidianRestApiService } from "../services/obsidianRestAPI/index.js";
|
|
19
|
-
import { VaultCacheService } from "../services/obsidianRestAPI/vaultCache/index.js";
|
|
20
|
-
/**
|
|
21
|
-
* Main application entry point. Initializes services and starts the MCP server.
|
|
22
|
-
* Orchestrates server startup, transport selection, and top-level error handling.
|
|
23
|
-
*
|
|
24
|
-
* MCP Spec Relevance:
|
|
25
|
-
* - Manages server startup, leading to a server ready for MCP messages.
|
|
26
|
-
* - Handles critical startup failures, ensuring appropriate process exit.
|
|
27
|
-
*
|
|
28
|
-
* @param {ObsidianRestApiService} obsidianService - The shared Obsidian REST API service instance, instantiated by the caller (e.g., index.ts).
|
|
29
|
-
* @param {VaultCacheService | undefined} vaultCacheService - The shared Vault Cache service instance, instantiated by the caller (e.g., index.ts).
|
|
30
|
-
* @returns {Promise<void | McpServer>} For 'stdio', resolves with `McpServer`. For 'http', runs indefinitely.
|
|
31
|
-
* Rejects on critical failure, leading to process exit.
|
|
32
|
-
*/
|
|
33
|
-
export declare function initializeAndStartServer(obsidianService: ObsidianRestApiService, vaultCacheService: VaultCacheService | undefined): Promise<void | McpServer | ServerType>;
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Main entry point for the MCP (Model Context Protocol) server.
|
|
3
|
-
* This file orchestrates the server's lifecycle:
|
|
4
|
-
* 1. Initializes the core `McpServer` instance (from `@modelcontextprotocol/sdk`) with its identity and capabilities.
|
|
5
|
-
* 2. Registers available resources and tools, making them discoverable and usable by clients.
|
|
6
|
-
* 3. Selects and starts the appropriate communication transport (stdio or Streamable HTTP)
|
|
7
|
-
* based on configuration.
|
|
8
|
-
* 4. Handles top-level error management during startup.
|
|
9
|
-
*
|
|
10
|
-
* MCP Specification References:
|
|
11
|
-
* - Lifecycle: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/basic/lifecycle.mdx
|
|
12
|
-
* - Overview (Capabilities): https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/basic/index.mdx
|
|
13
|
-
* - Transports: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/basic/transports.mdx
|
|
14
|
-
* @module src/mcp-server/server
|
|
15
|
-
*/
|
|
16
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
17
|
-
// Import validated configuration and environment details.
|
|
18
|
-
import { config, environment } from "../config/index.js";
|
|
19
|
-
// Import core utilities: ErrorHandler, logger, requestContextService.
|
|
20
|
-
import { ErrorHandler, logger, requestContextService } from "../utils/index.js";
|
|
21
|
-
// Import registration functions for specific resources and tools.
|
|
22
|
-
import { registerObsidianDeleteNoteTool } from "./tools/obsidianDeleteNoteTool/index.js";
|
|
23
|
-
import { registerObsidianGlobalSearchTool } from "./tools/obsidianGlobalSearchTool/index.js";
|
|
24
|
-
import { registerObsidianListNotesTool } from "./tools/obsidianListNotesTool/index.js";
|
|
25
|
-
import { registerObsidianReadNoteTool } from "./tools/obsidianReadNoteTool/index.js";
|
|
26
|
-
import { registerObsidianSearchReplaceTool } from "./tools/obsidianSearchReplaceTool/index.js";
|
|
27
|
-
import { registerObsidianUpdateNoteTool } from "./tools/obsidianUpdateNoteTool/index.js";
|
|
28
|
-
import { registerObsidianManageFrontmatterTool } from "./tools/obsidianManageFrontmatterTool/index.js";
|
|
29
|
-
import { registerObsidianManageTagsTool } from "./tools/obsidianManageTagsTool/index.js";
|
|
30
|
-
// Import transport setup functions.
|
|
31
|
-
import { startHttpTransport } from "./transports/httpTransport.js";
|
|
32
|
-
import { connectStdioTransport } from "./transports/stdioTransport.js";
|
|
33
|
-
/**
|
|
34
|
-
* Creates and configures a new instance of the `McpServer`.
|
|
35
|
-
*
|
|
36
|
-
* This function is central to defining the server's identity and functionality
|
|
37
|
-
* as presented to connecting clients during the MCP initialization phase.
|
|
38
|
-
* It uses pre-instantiated shared services like Obsidian API and Vault Cache.
|
|
39
|
-
*
|
|
40
|
-
* MCP Spec Relevance:
|
|
41
|
-
* - Server Identity (`serverInfo`): The `name` and `version` provided here are part
|
|
42
|
-
* of the `ServerInformation` object returned in the `InitializeResult` message.
|
|
43
|
-
* - Capabilities Declaration: Declares supported features (logging, dynamic resources/tools).
|
|
44
|
-
* - Resource/Tool Registration: Calls registration functions, passing necessary service instances.
|
|
45
|
-
*
|
|
46
|
-
* Design Note: This factory is called once for 'stdio' transport and per session for 'http' transport.
|
|
47
|
-
*
|
|
48
|
-
* @param {ObsidianRestApiService} obsidianService - The shared Obsidian REST API service instance.
|
|
49
|
-
* @param {VaultCacheService | undefined} vaultCacheService - The shared Vault Cache service instance, which may be undefined if disabled.
|
|
50
|
-
* @returns {Promise<McpServer>} A promise resolving with the configured `McpServer` instance.
|
|
51
|
-
* @throws {Error} If any resource or tool registration fails.
|
|
52
|
-
* @private
|
|
53
|
-
*/
|
|
54
|
-
async function createMcpServerInstance(obsidianService, vaultCacheService) {
|
|
55
|
-
const context = requestContextService.createRequestContext({
|
|
56
|
-
operation: "createMcpServerInstance",
|
|
57
|
-
});
|
|
58
|
-
logger.info("Initializing MCP server instance with shared services", context);
|
|
59
|
-
requestContextService.configure({
|
|
60
|
-
appName: config.mcpServerName,
|
|
61
|
-
appVersion: config.mcpServerVersion,
|
|
62
|
-
environment,
|
|
63
|
-
});
|
|
64
|
-
logger.debug("Instantiating McpServer with capabilities", {
|
|
65
|
-
...context,
|
|
66
|
-
serverInfo: {
|
|
67
|
-
name: config.mcpServerName,
|
|
68
|
-
version: config.mcpServerVersion,
|
|
69
|
-
},
|
|
70
|
-
capabilities: {
|
|
71
|
-
logging: {},
|
|
72
|
-
resources: { listChanged: true },
|
|
73
|
-
tools: { listChanged: true },
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
const server = new McpServer({ name: config.mcpServerName, version: config.mcpServerVersion }, {
|
|
77
|
-
capabilities: {
|
|
78
|
-
logging: {}, // Server can receive logging/setLevel and send notifications/message
|
|
79
|
-
resources: { listChanged: true }, // Server supports dynamic resource lists
|
|
80
|
-
tools: { listChanged: true }, // Server supports dynamic tool lists
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
try {
|
|
84
|
-
logger.debug("Registering resources and tools using shared services...", context);
|
|
85
|
-
// Register all tools, passing the vaultCacheService which may be undefined
|
|
86
|
-
await registerObsidianListNotesTool(server, obsidianService);
|
|
87
|
-
await registerObsidianReadNoteTool(server, obsidianService);
|
|
88
|
-
await registerObsidianDeleteNoteTool(server, obsidianService, vaultCacheService);
|
|
89
|
-
if (vaultCacheService) {
|
|
90
|
-
await registerObsidianGlobalSearchTool(server, obsidianService, vaultCacheService);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
logger.warning("Skipping registration of 'obsidian_global_search' because the Vault Cache Service is disabled.", context);
|
|
94
|
-
}
|
|
95
|
-
await registerObsidianSearchReplaceTool(server, obsidianService, vaultCacheService);
|
|
96
|
-
await registerObsidianUpdateNoteTool(server, obsidianService, vaultCacheService);
|
|
97
|
-
await registerObsidianManageFrontmatterTool(server, obsidianService, vaultCacheService);
|
|
98
|
-
await registerObsidianManageTagsTool(server, obsidianService, vaultCacheService);
|
|
99
|
-
logger.info("Resources and tools registered successfully", context);
|
|
100
|
-
if (vaultCacheService) {
|
|
101
|
-
logger.info("Triggering background vault cache build (if not already built/building)...", context);
|
|
102
|
-
// Intentionally not awaiting this promise to allow server startup to proceed.
|
|
103
|
-
// Errors are logged within the catch block.
|
|
104
|
-
vaultCacheService.buildVaultCache().catch((cacheBuildError) => {
|
|
105
|
-
logger.error("Error occurred during background vault cache build", {
|
|
106
|
-
...context, // Use the initial context for correlation
|
|
107
|
-
subOperation: "BackgroundVaultCacheBuild", // Add sub-operation for clarity
|
|
108
|
-
error: cacheBuildError instanceof Error
|
|
109
|
-
? cacheBuildError.message
|
|
110
|
-
: String(cacheBuildError),
|
|
111
|
-
stack: cacheBuildError instanceof Error
|
|
112
|
-
? cacheBuildError.stack
|
|
113
|
-
: undefined,
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
catch (err) {
|
|
119
|
-
logger.error("Failed to register resources/tools", {
|
|
120
|
-
...context,
|
|
121
|
-
error: err instanceof Error ? err.message : String(err),
|
|
122
|
-
stack: err instanceof Error ? err.stack : undefined,
|
|
123
|
-
});
|
|
124
|
-
throw err; // Re-throw to be caught by the caller (e.g., startTransport)
|
|
125
|
-
}
|
|
126
|
-
return server;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Selects, sets up, and starts the appropriate MCP transport layer based on configuration.
|
|
130
|
-
* This function acts as the bridge between the core server logic and the communication channel.
|
|
131
|
-
* It now accepts shared service instances to pass them down the chain.
|
|
132
|
-
*
|
|
133
|
-
* MCP Spec Relevance:
|
|
134
|
-
* - Transport Selection: Uses `config.mcpTransportType` ('stdio' or 'http').
|
|
135
|
-
* - Transport Connection: Calls dedicated functions for chosen transport.
|
|
136
|
-
* - Server Instance Lifecycle: Single instance for 'stdio', per-session for 'http'.
|
|
137
|
-
*
|
|
138
|
-
* @param {ObsidianRestApiService} obsidianService - The shared Obsidian REST API service instance.
|
|
139
|
-
* @param {VaultCacheService | undefined} vaultCacheService - The shared Vault Cache service instance.
|
|
140
|
-
* @returns {Promise<McpServer | void>} Resolves with the `McpServer` instance for 'stdio', or `void` for 'http'.
|
|
141
|
-
* @throws {Error} If the configured transport type is unsupported or if transport setup fails.
|
|
142
|
-
* @private
|
|
143
|
-
*/
|
|
144
|
-
async function startTransport(obsidianService, vaultCacheService) {
|
|
145
|
-
const transportType = config.mcpTransportType;
|
|
146
|
-
const context = requestContextService.createRequestContext({
|
|
147
|
-
operation: "startTransport",
|
|
148
|
-
transport: transportType,
|
|
149
|
-
});
|
|
150
|
-
logger.info(`Starting transport: ${transportType}`, context);
|
|
151
|
-
if (transportType === "http") {
|
|
152
|
-
logger.debug("Delegating to startHttpTransport with a factory for McpServer instances...", context);
|
|
153
|
-
// For HTTP, startHttpTransport manages its own lifecycle and server instances per session.
|
|
154
|
-
// It needs a factory function to create new McpServer instances, passing along the shared services.
|
|
155
|
-
const mcpServerFactory = async () => createMcpServerInstance(obsidianService, vaultCacheService);
|
|
156
|
-
const httpServerInstance = await startHttpTransport(mcpServerFactory, context);
|
|
157
|
-
return httpServerInstance; // Return the http.Server instance.
|
|
158
|
-
}
|
|
159
|
-
if (transportType === "stdio") {
|
|
160
|
-
logger.debug("Creating single McpServer instance for stdio transport using shared services...", context);
|
|
161
|
-
const server = await createMcpServerInstance(obsidianService, vaultCacheService);
|
|
162
|
-
logger.debug("Delegating to connectStdioTransport...", context);
|
|
163
|
-
await connectStdioTransport(server, context);
|
|
164
|
-
return server; // Return the single server instance for stdio.
|
|
165
|
-
}
|
|
166
|
-
// Should not be reached if config validation is effective.
|
|
167
|
-
logger.fatal(`Unsupported transport type configured: ${transportType}`, context);
|
|
168
|
-
throw new Error(`Unsupported transport type: ${transportType}. Must be 'stdio' or 'http'.`);
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Main application entry point. Initializes services and starts the MCP server.
|
|
172
|
-
* Orchestrates server startup, transport selection, and top-level error handling.
|
|
173
|
-
*
|
|
174
|
-
* MCP Spec Relevance:
|
|
175
|
-
* - Manages server startup, leading to a server ready for MCP messages.
|
|
176
|
-
* - Handles critical startup failures, ensuring appropriate process exit.
|
|
177
|
-
*
|
|
178
|
-
* @param {ObsidianRestApiService} obsidianService - The shared Obsidian REST API service instance, instantiated by the caller (e.g., index.ts).
|
|
179
|
-
* @param {VaultCacheService | undefined} vaultCacheService - The shared Vault Cache service instance, instantiated by the caller (e.g., index.ts).
|
|
180
|
-
* @returns {Promise<void | McpServer>} For 'stdio', resolves with `McpServer`. For 'http', runs indefinitely.
|
|
181
|
-
* Rejects on critical failure, leading to process exit.
|
|
182
|
-
*/
|
|
183
|
-
export async function initializeAndStartServer(obsidianService, vaultCacheService) {
|
|
184
|
-
const context = requestContextService.createRequestContext({
|
|
185
|
-
operation: "initializeAndStartServer",
|
|
186
|
-
});
|
|
187
|
-
logger.info("MCP Server initialization sequence started (services provided).", context);
|
|
188
|
-
try {
|
|
189
|
-
// Services are now provided by the caller (e.g., index.ts)
|
|
190
|
-
logger.debug("Using provided shared services (ObsidianRestApiService, VaultCacheService).", context);
|
|
191
|
-
// Initiate the transport setup based on configuration, passing shared services.
|
|
192
|
-
const result = await startTransport(obsidianService, vaultCacheService);
|
|
193
|
-
logger.info("MCP Server initialization sequence completed successfully.", context);
|
|
194
|
-
return result;
|
|
195
|
-
}
|
|
196
|
-
catch (err) {
|
|
197
|
-
logger.fatal("Critical error during MCP server initialization.", {
|
|
198
|
-
...context,
|
|
199
|
-
error: err instanceof Error ? err.message : String(err),
|
|
200
|
-
stack: err instanceof Error ? err.stack : undefined,
|
|
201
|
-
});
|
|
202
|
-
// Ensure the error is handled by our centralized handler, which might log more details or perform cleanup.
|
|
203
|
-
ErrorHandler.handleError(err, {
|
|
204
|
-
operation: "initializeAndStartServer", // More specific operation
|
|
205
|
-
context: context, // Pass the existing context
|
|
206
|
-
critical: true, // This is a critical failure
|
|
207
|
-
});
|
|
208
|
-
logger.info("Exiting process due to critical initialization error.", context);
|
|
209
|
-
process.exit(1); // Exit with a non-zero code to indicate failure.
|
|
210
|
-
}
|
|
211
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Barrel file for the 'obsidian_delete_note' MCP tool.
|
|
3
|
-
*
|
|
4
|
-
* This file serves as the public entry point for the obsidian_delete_note tool module.
|
|
5
|
-
* It re-exports the primary registration function (`registerObsidianDeleteNoteTool`)
|
|
6
|
-
* from the './registration.js' module. This pattern simplifies imports for consumers
|
|
7
|
-
* of the tool, allowing them to import necessary components from a single location.
|
|
8
|
-
*
|
|
9
|
-
* Consumers (like the main server setup) should import the registration function
|
|
10
|
-
* from this file to integrate the tool into the MCP server instance.
|
|
11
|
-
*/
|
|
12
|
-
export { registerObsidianDeleteNoteTool } from "./registration.js";
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Barrel file for the 'obsidian_delete_note' MCP tool.
|
|
3
|
-
*
|
|
4
|
-
* This file serves as the public entry point for the obsidian_delete_note tool module.
|
|
5
|
-
* It re-exports the primary registration function (`registerObsidianDeleteNoteTool`)
|
|
6
|
-
* from the './registration.js' module. This pattern simplifies imports for consumers
|
|
7
|
-
* of the tool, allowing them to import necessary components from a single location.
|
|
8
|
-
*
|
|
9
|
-
* Consumers (like the main server setup) should import the registration function
|
|
10
|
-
* from this file to integrate the tool into the MCP server instance.
|
|
11
|
-
*/
|
|
12
|
-
export { registerObsidianDeleteNoteTool } from "./registration.js";
|