obsidian_fetch 1.0.0 → 1.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02563af73296a2af37e1ea12b6943dad193c5dc77a24ee5d77462d2d846366a2
4
- data.tar.gz: fabf0d51658773dc3b708e737116914bde4b55f9e43dda066911c6576f5b38bd
3
+ metadata.gz: '0992b2a2f014ca5b769ea7fda3489b865084234a8291cec96feacb51ab4c1f0b'
4
+ data.tar.gz: 5cdd32d72283570de361c2b50cf0dd3c2bf8222fff30e17397848f6e0419c3bd
5
5
  SHA512:
6
- metadata.gz: 83967477cbd13c96797d9254b755af6f5436a70877344b1353dc48c406e8cd9a0bd8d7a061480a125da53e4f66c7126290295645ade26f47a64ba64d9be15c61
7
- data.tar.gz: f2baff1697d33d8fe8c97fef41b9efeac56b0386bcfc623745e1658a1d7ad1fb9e4c1e0a363c171814f156dad0fc3ca61de9f8c469ca3eef6344ba7622a8e29d
6
+ metadata.gz: 4f4649c707d4a8d816d1fb5c884608b1e497c5b0e3945a6f69233c689172b6334cb772c1b7ccada4737c11b848806795e897943090ac072e18643c8afe68f7a3
7
+ data.tar.gz: 45043168da41509700e97f1670182eab192057ddf9986628c72846d88dda875cb0a83fcbae4e6471151681a40920e5bbe742756eca54077d8fdc3ee44521c989
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # ObsidianFetch
2
2
 
3
+ > Languages: [日本語](README_ja.md)
4
+
3
5
  MCP servers focused on fetching and presenting information from Obsidian vaults.
4
6
 
5
7
  The existing MCP server has the following drawbacks:
@@ -23,10 +25,31 @@ gem install obsidian_fetch
23
25
 
24
26
  ## Usage
25
27
 
28
+ ### Stdio Transport (default)
29
+
26
30
  ```bash
27
31
  obsidian_fetch /path/to/your/vault
28
32
  ```
29
33
 
34
+ ### Streamable HTTP Transport
35
+
36
+ To run the server as an HTTP server:
37
+
38
+ ```bash
39
+ obsidian_fetch /path/to/your/vault --transport streamable-http
40
+ ```
41
+
42
+ By default, the server listens on `http://localhost:9292`. You can customize the port:
43
+
44
+ ```bash
45
+ obsidian_fetch /path/to/your/vault --transport streamable-http --port 3000
46
+ ```
47
+
48
+ ## Tools
49
+
50
+ - **read**: Read a note from the Obsidian vault. If multiple notes with the same name are found, all will be shown.
51
+ - **list**: Search for files with matching names partially.
52
+
30
53
  ## Contributing
31
54
 
32
55
  Bug reports and pull requests are welcome on GitHub at https://github.com/soukouki/obsidian_fetch.
data/README_ja.md ADDED
@@ -0,0 +1,63 @@
1
+ # ObsidianFetch
2
+
3
+ > Languages: [English version](README.md)
4
+
5
+ ObsidianのVaultから必要な情報をサクッと取得するためのMCPサーバーです。
6
+
7
+ ## 概要
8
+
9
+ 既存のMCPサーバーを使っていると、こんな悩みはありませんでしたか?
10
+
11
+ - コマンドが多すぎて、ローカルLLMだと読み込みに時間がかかる
12
+ - 特定のノートを探してほしいのに、LLMがうまくパスを辿ってくれない
13
+ - ツール設定が複雑で、LLMが正しく呼び出せない
14
+
15
+ 特にローカルGPUでLLMを動かしている場合、これらの問題がボトルネックになります。
16
+
17
+ そこで、「ノートのリスト取得」と「中身の読み込み」というシンプルな機能に特化したサーバーを開発しました。
18
+
19
+ さらに、使い勝手を良くするために以下の機能を追加しています:
20
+
21
+ - **リンクの自動修正**: `[[リンク名]]` のように括弧付きで検索したとき、不要な文字を自動で消して正しくリンクを解決します。
22
+ - **バックリンク対応**: ノートの中身だけでなく、「どのノートから参照されているか」というバックリンクも一緒に取得します。これでLLMが知識のつながりをより正確に把握できます。
23
+
24
+ ## インストール
25
+
26
+ ```bash
27
+ gem install obsidian_fetch
28
+ ```
29
+
30
+ ## 使用方法
31
+
32
+ ### Stdio Transport(デフォルト)
33
+
34
+ ```bash
35
+ obsidian_fetch /path/to/your/vault
36
+ ```
37
+
38
+ ### Streamable HTTP Transport
39
+
40
+ HTTPサーバーとして実行する場合は、以下のコマンドを使用します。
41
+
42
+ ```bash
43
+ obsidian_fetch /path/to/your/vault --transport streamable-http
44
+ ```
45
+
46
+ デフォルトでは `http://localhost:9292` で接続できます。ポート番号は以下のようにカスタマイズ可能です。
47
+
48
+ ```bash
49
+ obsidian_fetch /path/to/your/vault --transport streamable-http --port 3000
50
+ ```
51
+
52
+ ## ツール
53
+
54
+ - **read**: Obsidian Vaultからノートを取得します。同名のノートが複数存在する場合、すべて取得します。
55
+ - **list**: ファイル名で検索します。部分一致での検索が可能です。
56
+
57
+ ## 貢献
58
+
59
+ バグ報告やプルリクエストは、GitHubリポジトリ(https://github.com/soukouki/obsidian_fetch)にてお待ちしております。
60
+
61
+ ## ライセンス
62
+
63
+ このジェムは [MITライセンス](https://opensource.org/licenses/MIT) の下で公開されています。
data/lib/exe.rb CHANGED
@@ -1,11 +1,89 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mcp'
2
4
  require 'obsidian_fetch'
3
5
 
6
+ # Parse arguments with validation
7
+ VALID_TRANSPORTS = %w[stdio streamable-http].freeze
8
+ DEFAULT_TRANSPORT = 'stdio'
9
+ DEFAULT_PORT = 9292
10
+
11
+ transport_type = DEFAULT_TRANSPORT
12
+ port = DEFAULT_PORT
13
+ vault_paths = []
14
+
15
+ i = 0
16
+ while i < ARGV.length
17
+ arg = ARGV[i]
18
+ case arg
19
+ when '--help', '-h'
20
+ puts "Usage: obsidian_fetch [vault_path] [--transport {stdio|streamable-http}] [--port PORT]"
21
+ puts ""
22
+ puts "Options:"
23
+ puts " --transport {stdio|streamable-http} Transport type (default: stdio)"
24
+ puts " stdio: Standard I/O transport for local MCP clients"
25
+ puts " streamable-http: Streamable HTTP transport (MCP spec latest)"
26
+ puts ""
27
+ puts " --port PORT HTTP port for streamable-http transport (default: 9292)"
28
+ puts ""
29
+ puts "Examples:"
30
+ puts " obsidian_fetch /path/to/vault"
31
+ puts " obsidian_fetch /path/to/vault --transport streamable-http"
32
+ puts " obsidian_fetch /path/to/vault --transport streamable-http --port 3000"
33
+ exit 0
34
+ when '--transport'
35
+ if i + 1 >= ARGV.length
36
+ STDERR.puts "Error: --transport requires an argument (stdio or sse)"
37
+ exit 1
38
+ end
39
+ transport_type = ARGV[i + 1]
40
+ unless VALID_TRANSPORTS.include?(transport_type)
41
+ STDERR.puts "Error: Invalid transport '#{transport_type}'. Must be one of: #{VALID_TRANSPORTS.join(', ')}"
42
+ exit 1
43
+ end
44
+ i += 2 # Skip the next argument (transport type)
45
+ when '--port'
46
+ if i + 1 >= ARGV.length
47
+ STDERR.puts "Error: --port requires a numeric argument"
48
+ exit 1
49
+ end
50
+ port_val = ARGV[i + 1]
51
+ unless port_val =~ /^\d+$/
52
+ STDERR.puts "Error: --port must be a positive integer"
53
+ exit 1
54
+ end
55
+ port = port_val.to_i
56
+ unless port > 0 && port <= 65535
57
+ STDERR.puts "Error: --port must be between 1 and 65535"
58
+ exit 1
59
+ end
60
+ i += 2 # Skip the next argument (port value)
61
+ else
62
+ vault_paths << arg
63
+ i += 1
64
+ end
65
+ end
66
+
67
+ # Validate vault paths
68
+ if vault_paths.empty?
69
+ STDERR.puts "Error: At least one vault path is required"
70
+ STDERR.puts "Run with --help for usage information"
71
+ exit 1
72
+ end
73
+
74
+ vault_paths.each do |path|
75
+ unless File.directory?(path)
76
+ STDERR.puts "Error: Vault path '#{path}' does not exist or is not a directory"
77
+ exit 1
78
+ end
79
+ end
80
+
4
81
  # Obsidian Vaultの初期化
5
- vault_paths = ARGV
6
82
  $vault = ObsidianFetch::Vault.new(vault_paths)
7
83
  STDERR.puts "Found #{$vault.notes.size} notes"
8
84
  STDERR.puts "Found #{$vault.links_by_file_name.size} links and #{$vault.links_by_file_path.size} files linked by notes"
85
+ STDERR.puts "Transport type: #{transport_type}"
86
+ STDERR.puts "Port: #{port}" if transport_type == 'streamable-http'
9
87
 
10
88
  # readツールの定義
11
89
  class ReadTool < MCP::Tool
@@ -54,6 +132,40 @@ server = MCP::Server.new(
54
132
  tools: [ReadTool, ListTool],
55
133
  )
56
134
 
57
- # Stdioトランスポートを使用してサーバーを起動
58
- transport = MCP::Server::Transports::StdioTransport.new(server)
59
- transport.open
135
+ # トランスポートを選択してサーバーを起動
136
+ case transport_type
137
+ when 'streamable-http'
138
+ require 'puma'
139
+ require 'rack'
140
+
141
+ # Streamable HTTP トランスポートを使用してサーバーを起動
142
+ transport = MCP::Server::Transports::StreamableHTTPTransport.new(
143
+ server,
144
+ stateless: true,
145
+ enable_json_response: true
146
+ )
147
+
148
+ # PumaでRack appとして起動
149
+ $stdout.sync = true
150
+ $stderr.sync = true
151
+
152
+ server_obj = Puma::Server.new(transport) do
153
+ max_threads 16
154
+ min_threads 1
155
+ end
156
+ server_obj.add_tcp_listener "127.0.0.1", port
157
+
158
+ STDERR.puts "Streamable HTTP transport started on http://localhost:#{port}"
159
+ STDERR.puts "Press Ctrl+C to stop"
160
+
161
+ # サーバーを起動してメインプロセスをブロックする
162
+ server_thread = server_obj.run
163
+ server_thread.join
164
+ when 'stdio'
165
+ # Stdioトランスポートを使用してサーバーを起動
166
+ transport = MCP::Server::Transports::StdioTransport.new(server)
167
+ transport.open
168
+ else
169
+ STDERR.puts "Unknown transport type: #{transport_type}. Supported: stdio, sse"
170
+ exit 1
171
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ObsidianFetch
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.1"
5
5
  end
@@ -61,7 +61,7 @@ module ObsidianFetch
61
61
  puts "YAML syntax error in #{file_path}: #{e.message}"
62
62
  next
63
63
  end
64
- (frontmatter&.[](:aliases) || []).each do |alias_name|
64
+ Array(frontmatter&.[](:aliases) || []).each do |alias_name|
65
65
  alias_name = Vault.normalize_note_name(alias_name)
66
66
  @notes[alias_name] ||= []
67
67
  @notes[alias_name] << file_path
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: obsidian_fetch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - sou7
@@ -15,14 +15,42 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.2.0
18
+ version: 0.14.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.2.0
25
+ version: 0.14.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: rack
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: puma
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '5.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '5.0'
26
54
  email:
27
55
  - soukouki0@yahoo.co.jp
28
56
  executables:
@@ -33,6 +61,7 @@ files:
33
61
  - CHANGELOG.md
34
62
  - LICENSE.txt
35
63
  - README.md
64
+ - README_ja.md
36
65
  - Rakefile
37
66
  - exe/obsidian_fetch
38
67
  - lib/exe.rb
@@ -60,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
89
  - !ruby/object:Gem::Version
61
90
  version: '0'
62
91
  requirements: []
63
- rubygems_version: 3.6.7
92
+ rubygems_version: 3.6.9
64
93
  specification_version: 4
65
94
  summary: MCP servers focused on fetching and presenting information from Obsidian
66
95
  vaults