shared_tools 0.3.1 → 0.4.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 +4 -4
- data/CHANGELOG.md +46 -16
- data/README.md +257 -262
- data/lib/shared_tools/browser_tool.rb +5 -0
- data/lib/shared_tools/calculator_tool.rb +4 -0
- data/lib/shared_tools/clipboard_tool.rb +4 -0
- data/lib/shared_tools/composite_analysis_tool.rb +4 -0
- data/lib/shared_tools/computer_tool.rb +5 -0
- data/lib/shared_tools/cron_tool.rb +4 -0
- data/lib/shared_tools/current_date_time_tool.rb +4 -0
- data/lib/shared_tools/data_science_kit.rb +4 -0
- data/lib/shared_tools/database.rb +4 -0
- data/lib/shared_tools/database_query_tool.rb +4 -0
- data/lib/shared_tools/database_tool.rb +5 -0
- data/lib/shared_tools/disk_tool.rb +5 -0
- data/lib/shared_tools/dns_tool.rb +4 -0
- data/lib/shared_tools/doc_tool.rb +5 -0
- data/lib/shared_tools/error_handling_tool.rb +4 -0
- data/lib/shared_tools/eval_tool.rb +5 -0
- data/lib/shared_tools/mcp/brave_search_client.rb +37 -0
- data/lib/shared_tools/mcp/chart_client.rb +32 -0
- data/lib/shared_tools/mcp/github_client.rb +38 -0
- data/lib/shared_tools/mcp/hugging_face_client.rb +43 -0
- data/lib/shared_tools/mcp/memory_client.rb +33 -0
- data/lib/shared_tools/mcp/notion_client.rb +40 -0
- data/lib/shared_tools/mcp/sequential_thinking_client.rb +33 -0
- data/lib/shared_tools/mcp/slack_client.rb +54 -0
- data/lib/shared_tools/mcp/streamable_http_patch.rb +42 -0
- data/lib/shared_tools/mcp/tavily_client.rb +41 -0
- data/lib/shared_tools/mcp.rb +45 -16
- data/lib/shared_tools/system_info_tool.rb +4 -0
- data/lib/shared_tools/tools/browser/base_tool.rb +8 -12
- data/lib/shared_tools/tools/browser/click_tool.rb +4 -2
- data/lib/shared_tools/tools/browser/ferrum_driver.rb +119 -0
- data/lib/shared_tools/tools/browser/inspect_tool.rb +4 -2
- data/lib/shared_tools/tools/browser/page_inspect_tool.rb +4 -2
- data/lib/shared_tools/tools/browser/page_screenshot_tool.rb +19 -7
- data/lib/shared_tools/tools/browser/selector_inspect_tool.rb +4 -2
- data/lib/shared_tools/tools/browser/text_field_area_set_tool.rb +4 -2
- data/lib/shared_tools/tools/browser/visit_tool.rb +4 -2
- data/lib/shared_tools/tools/browser.rb +31 -2
- data/lib/shared_tools/tools/browser_tool.rb +6 -0
- data/lib/shared_tools/tools/clipboard_tool.rb +69 -144
- data/lib/shared_tools/tools/composite_analysis_tool.rb +60 -4
- data/lib/shared_tools/tools/computer/mac_driver.rb +37 -4
- data/lib/shared_tools/tools/cron_tool.rb +237 -379
- data/lib/shared_tools/tools/current_date_time_tool.rb +54 -120
- data/lib/shared_tools/tools/data_science_kit.rb +63 -13
- data/lib/shared_tools/tools/dns_tool.rb +335 -269
- data/lib/shared_tools/tools/doc/docx_reader_tool.rb +107 -0
- data/lib/shared_tools/tools/doc/spreadsheet_reader_tool.rb +171 -0
- data/lib/shared_tools/tools/doc/text_reader_tool.rb +57 -0
- data/lib/shared_tools/tools/doc.rb +3 -0
- data/lib/shared_tools/tools/doc_tool.rb +101 -6
- data/lib/shared_tools/tools/docker/compose_run_tool.rb +1 -1
- data/lib/shared_tools/tools/enabler.rb +42 -0
- data/lib/shared_tools/tools/error_handling_tool.rb +3 -1
- data/lib/shared_tools/tools/notification/base_driver.rb +51 -0
- data/lib/shared_tools/tools/notification/linux_driver.rb +115 -0
- data/lib/shared_tools/tools/notification/mac_driver.rb +66 -0
- data/lib/shared_tools/tools/notification/null_driver.rb +29 -0
- data/lib/shared_tools/tools/notification.rb +12 -0
- data/lib/shared_tools/tools/notification_tool.rb +99 -0
- data/lib/shared_tools/tools/system_info_tool.rb +130 -343
- data/lib/shared_tools/tools/workflow_manager_tool.rb +32 -0
- data/lib/shared_tools/utilities.rb +193 -0
- data/lib/shared_tools/version.rb +1 -1
- data/lib/shared_tools/weather_tool.rb +4 -0
- data/lib/shared_tools/workflow_manager_tool.rb +4 -0
- data/lib/shared_tools.rb +28 -38
- metadata +74 -9
- data/lib/shared_tools/mcp/github_mcp_server.rb +0 -58
- data/lib/shared_tools/mcp/imcp.rb +0 -28
- data/lib/shared_tools/mcp/tavily_mcp_server.rb +0 -44
- data/lib/shared_tools/tools/devops_toolkit.rb +0 -420
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# lib/shared_tools/utilities.rb
|
|
4
|
+
#
|
|
5
|
+
# General-purpose utility methods for SharedTools MCP clients and tools.
|
|
6
|
+
# Loaded automatically by lib/shared_tools.rb.
|
|
7
|
+
|
|
8
|
+
module SharedTools
|
|
9
|
+
MCP_LOG_MUTEX = Mutex.new
|
|
10
|
+
@mcp_load_log = {}
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
|
|
14
|
+
# ---------------------------------------------------------------------------
|
|
15
|
+
# MCP load tracking
|
|
16
|
+
# ---------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
# Record the outcome of loading a single MCP client.
|
|
19
|
+
# Called by mcp.rb from within each loader thread.
|
|
20
|
+
#
|
|
21
|
+
# SharedTools.record_mcp_result("tavily") # success
|
|
22
|
+
# SharedTools.record_mcp_result("notion", error: e) # failure
|
|
23
|
+
def record_mcp_result(name, error: nil)
|
|
24
|
+
MCP_LOG_MUTEX.synchronize do
|
|
25
|
+
@mcp_load_log[name] = error ? { status: :failed, reason: error.message } : { status: :ok }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Returns an array of client names that loaded successfully.
|
|
30
|
+
#
|
|
31
|
+
# SharedTools.mcp_loaded #=> ["github", "memory", "chart"]
|
|
32
|
+
def mcp_loaded
|
|
33
|
+
MCP_LOG_MUTEX.synchronize { @mcp_load_log.select { |_, v| v[:status] == :ok }.keys }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Returns a hash of client names that failed to load, mapped to their error messages.
|
|
37
|
+
#
|
|
38
|
+
# SharedTools.mcp_failed #=> {"tavily" => "Missing envars: TAVILY_API_KEY", ...}
|
|
39
|
+
def mcp_failed
|
|
40
|
+
MCP_LOG_MUTEX.synchronize do
|
|
41
|
+
@mcp_load_log.select { |_, v| v[:status] == :failed }.transform_values { |v| v[:reason] }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Prints a summary table of MCP client load results and returns the full log hash.
|
|
46
|
+
#
|
|
47
|
+
# SharedTools.mcp_status
|
|
48
|
+
# # MCP Client Status
|
|
49
|
+
# # ✓ github
|
|
50
|
+
# # ✓ memory
|
|
51
|
+
# # ✗ tavily — Missing envars: TAVILY_API_KEY
|
|
52
|
+
def mcp_status
|
|
53
|
+
log = MCP_LOG_MUTEX.synchronize { @mcp_load_log.dup }
|
|
54
|
+
|
|
55
|
+
if log.empty?
|
|
56
|
+
puts "No MCP clients have been loaded yet. Try: require 'shared_tools/mcp'"
|
|
57
|
+
return log
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
puts "MCP Client Status"
|
|
61
|
+
puts "-" * 40
|
|
62
|
+
log.sort.each do |name, entry|
|
|
63
|
+
if entry[:status] == :ok
|
|
64
|
+
puts " \u2713 #{name}"
|
|
65
|
+
else
|
|
66
|
+
puts " \u2717 #{name} \u2014 #{entry[:reason]}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
puts "-" * 40
|
|
70
|
+
puts " #{log.count { |_, v| v[:status] == :ok }} loaded, " \
|
|
71
|
+
"#{log.count { |_, v| v[:status] == :failed }} skipped"
|
|
72
|
+
|
|
73
|
+
log
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Returns true if all named environment variables are set and non-empty.
|
|
77
|
+
# Warns for each missing variable and returns false if any are absent.
|
|
78
|
+
#
|
|
79
|
+
# SharedTools.verify_envars("GITHUB_PERSONAL_ACCESS_TOKEN")
|
|
80
|
+
# SharedTools.verify_envars("TAVILY_API_KEY", "ANOTHER_KEY")
|
|
81
|
+
def verify_envars(*names)
|
|
82
|
+
missing = names.select { |n| ENV.fetch(n, "").empty? }
|
|
83
|
+
missing.each { |n| warn "SharedTools — #{n} is not set" }
|
|
84
|
+
unless missing.empty?
|
|
85
|
+
raise LoadError, "Missing envars: #{missing.join(', ')}"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# High-level package installer. Detects the current platform and calls the
|
|
90
|
+
# appropriate *_install method. Raises LoadError if any package cannot be installed.
|
|
91
|
+
#
|
|
92
|
+
# SharedTools.package_install("github-mcp-server")
|
|
93
|
+
# SharedTools.package_install("curl", "jq")
|
|
94
|
+
def package_install(*packages)
|
|
95
|
+
case RUBY_PLATFORM
|
|
96
|
+
when /darwin/
|
|
97
|
+
brew_install(*packages)
|
|
98
|
+
when /linux/
|
|
99
|
+
if system("which apt-get > /dev/null 2>&1")
|
|
100
|
+
apt_install(*packages)
|
|
101
|
+
elsif system("which dnf > /dev/null 2>&1")
|
|
102
|
+
dnf_install(*packages)
|
|
103
|
+
elsif system("which brew > /dev/null 2>&1")
|
|
104
|
+
brew_install(*packages)
|
|
105
|
+
else
|
|
106
|
+
raise LoadError, "No supported package manager found (apt-get, dnf, brew)"
|
|
107
|
+
end
|
|
108
|
+
else
|
|
109
|
+
raise LoadError, "Unsupported platform: #{RUBY_PLATFORM}"
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Ensures each named binary is available in PATH, installing via brew if missing.
|
|
114
|
+
# Raises LoadError if brew is not installed or any package install fails.
|
|
115
|
+
#
|
|
116
|
+
# SharedTools.brew_install("github-mcp-server")
|
|
117
|
+
# SharedTools.brew_install("gh", "jq")
|
|
118
|
+
def brew_install(*packages)
|
|
119
|
+
raise LoadError, "Homebrew is not installed (https://brew.sh)" unless system("which brew > /dev/null 2>&1")
|
|
120
|
+
|
|
121
|
+
packages.each do |pkg|
|
|
122
|
+
next unless `brew list --versions #{pkg} 2>/dev/null`.strip.empty?
|
|
123
|
+
|
|
124
|
+
warn "SharedTools — #{pkg} not found, installing via brew..."
|
|
125
|
+
raise LoadError, "#{pkg} could not be installed" unless system("brew install --quiet #{pkg} > /dev/null 2>&1")
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Ensures each named binary is available in PATH, installing via apt-get if missing.
|
|
130
|
+
# Raises LoadError if any package install fails.
|
|
131
|
+
#
|
|
132
|
+
# SharedTools.apt_install("curl")
|
|
133
|
+
# SharedTools.apt_install("curl", "jq")
|
|
134
|
+
def apt_install(*packages)
|
|
135
|
+
packages.each do |pkg|
|
|
136
|
+
# SMELL: what if package is a library?
|
|
137
|
+
next if system("which #{pkg} > /dev/null 2>&1")
|
|
138
|
+
|
|
139
|
+
warn "SharedTools — #{pkg} not found, installing via apt-get..."
|
|
140
|
+
raise LoadError, "#{pkg} could not be installed" unless system("sudo apt-get install -y -q #{pkg} > /dev/null 2>&1")
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Ensures each named binary is available in PATH, installing via dnf if missing.
|
|
145
|
+
# Raises LoadError if any package install fails.
|
|
146
|
+
#
|
|
147
|
+
# SharedTools.dnf_install("curl")
|
|
148
|
+
# SharedTools.dnf_install("curl", "jq")
|
|
149
|
+
def dnf_install(*packages)
|
|
150
|
+
packages.each do |pkg|
|
|
151
|
+
# SMELL: What if package is a library?
|
|
152
|
+
next if system("which #{pkg} > /dev/null 2>&1")
|
|
153
|
+
|
|
154
|
+
warn "SharedTools — #{pkg} not found, installing via dnf..."
|
|
155
|
+
raise LoadError, "#{pkg} could not be installed" unless system("sudo dnf install -y -q #{pkg} > /dev/null 2>&1")
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Ensures each named npm package binary is available in PATH, installing
|
|
160
|
+
# globally via npm if missing. Raises LoadError if npm is not found or any install fails.
|
|
161
|
+
#
|
|
162
|
+
# SharedTools.npm_install("typescript")
|
|
163
|
+
# SharedTools.npm_install("typescript", "ts-node")
|
|
164
|
+
def npm_install(*packages)
|
|
165
|
+
raise LoadError, "npm is not installed (https://nodejs.org)" unless system("which npm > /dev/null 2>&1")
|
|
166
|
+
|
|
167
|
+
packages.each do |pkg|
|
|
168
|
+
# SMELL: What if package is a library?
|
|
169
|
+
next if system("which #{pkg} > /dev/null 2>&1")
|
|
170
|
+
|
|
171
|
+
warn "SharedTools — #{pkg} not found, installing via npm..."
|
|
172
|
+
raise LoadError, "#{pkg} could not be installed" unless system("npm install -g --silent #{pkg} > /dev/null 2>&1")
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Ensures each named gem is available, installing via gem install if missing.
|
|
177
|
+
# Raises LoadError if gem is not available or any install fails.
|
|
178
|
+
#
|
|
179
|
+
# SharedTools.gem_install("nokogiri")
|
|
180
|
+
# SharedTools.gem_install("nokogiri", "oj")
|
|
181
|
+
def gem_install(*packages)
|
|
182
|
+
raise LoadError, "gem is not available" unless system("which gem > /dev/null 2>&1")
|
|
183
|
+
|
|
184
|
+
packages.each do |pkg|
|
|
185
|
+
next if system("gem list -i #{pkg} > /dev/null 2>&1")
|
|
186
|
+
|
|
187
|
+
warn "SharedTools — #{pkg} not found, installing via gem..."
|
|
188
|
+
raise LoadError, "#{pkg} could not be installed" unless system("gem install --silent #{pkg} > /dev/null 2>&1")
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
end
|
|
193
|
+
end
|
data/lib/shared_tools/version.rb
CHANGED
data/lib/shared_tools.rb
CHANGED
|
@@ -17,54 +17,27 @@ SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/disk.rb")
|
|
|
17
17
|
SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/doc.rb")
|
|
18
18
|
SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/docker.rb")
|
|
19
19
|
SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/eval.rb")
|
|
20
|
+
SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/notification.rb")
|
|
20
21
|
SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/version.rb") # Defines VERSION constant, not Version class
|
|
21
22
|
SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/incomplete") # Empty/incomplete tools directory
|
|
23
|
+
SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/enabler.rb") # Experimental; defines Tools::Enabler not SharedTools::Tools::Enabler
|
|
24
|
+
|
|
25
|
+
# Ignore per-tool shim files (require-path shortcuts: require 'shared_tools/<tool_name>')
|
|
26
|
+
Dir.glob("#{__dir__}/shared_tools/*_tool.rb").each { |f| SharedToolsLoader.ignore(f) }
|
|
27
|
+
SharedToolsLoader.ignore("#{__dir__}/shared_tools/data_science_kit.rb")
|
|
28
|
+
SharedToolsLoader.ignore("#{__dir__}/shared_tools/database.rb")
|
|
29
|
+
SharedToolsLoader.ignore("#{__dir__}/shared_tools/utilities.rb") # Reopens SharedTools, not SharedTools::Utilities
|
|
30
|
+
|
|
22
31
|
SharedToolsLoader.setup
|
|
23
32
|
|
|
24
33
|
module SharedTools
|
|
25
|
-
@auto_execute
|
|
26
|
-
|
|
34
|
+
@auto_execute ||= true # Auto-execute by default, no human-in-the-loop
|
|
27
35
|
class << self
|
|
36
|
+
|
|
28
37
|
def auto_execute(wildwest=true)
|
|
29
38
|
@auto_execute = wildwest
|
|
30
39
|
end
|
|
31
40
|
|
|
32
|
-
# Load all tool classes so they're available via ObjectSpace
|
|
33
|
-
# Call this when using AIA with --rq shared_tools
|
|
34
|
-
# Uses manual loading to gracefully handle missing dependencies
|
|
35
|
-
def load_all_tools
|
|
36
|
-
tools_dir = File.join(__dir__, 'shared_tools', 'tools')
|
|
37
|
-
Dir.glob(File.join(tools_dir, '*_tool.rb')).each do |tool_file|
|
|
38
|
-
begin
|
|
39
|
-
require tool_file
|
|
40
|
-
rescue LoadError => e
|
|
41
|
-
# Skip tools with missing dependencies
|
|
42
|
-
warn "SharedTools: Skipping #{File.basename(tool_file)} - #{e.message}" if ENV['DEBUG']
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# Get all available tool classes (those that inherit from RubyLLM::Tool)
|
|
48
|
-
# Only returns tools that can be successfully instantiated without arguments (RubyLLM requirement)
|
|
49
|
-
def tools
|
|
50
|
-
load_all_tools
|
|
51
|
-
ObjectSpace.each_object(Class).select do |klass|
|
|
52
|
-
next false unless klass < RubyLLM::Tool
|
|
53
|
-
next false unless klass.to_s.start_with?('SharedTools::')
|
|
54
|
-
|
|
55
|
-
# Actually try to instantiate the tool to verify it works
|
|
56
|
-
# RubyLLM calls tool.new without args, so tools must be instantiable this way
|
|
57
|
-
begin
|
|
58
|
-
klass.new
|
|
59
|
-
true
|
|
60
|
-
rescue ArgumentError, LoadError, StandardError => e
|
|
61
|
-
# Skip tools that can't be instantiated (missing args, missing platform drivers, etc.)
|
|
62
|
-
warn "SharedTools: Excluding #{klass} - #{e.message}" if ENV['DEBUG']
|
|
63
|
-
false
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
41
|
def execute?(tool: 'unknown', stuff: '')
|
|
69
42
|
# Return true if auto_execute is explicitly enabled
|
|
70
43
|
return true if @auto_execute == true
|
|
@@ -78,5 +51,22 @@ module SharedTools
|
|
|
78
51
|
print "\nIs it okay to proceed? (y/N"
|
|
79
52
|
STDIN.getch == "y"
|
|
80
53
|
end
|
|
54
|
+
|
|
55
|
+
# Force-load all tool classes into ObjectSpace.
|
|
56
|
+
# Called by AIA's GemActivator.trigger_tool_loading when shared_tools is
|
|
57
|
+
# passed to --require. Without this, Zeitwerk lazy-loads classes on first
|
|
58
|
+
# reference, so no RubyLLM::Tool subclasses appear in ObjectSpace at scan time.
|
|
59
|
+
def load_all_tools
|
|
60
|
+
SharedToolsLoader.eager_load
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Return all loaded RubyLLM::Tool subclasses provided by this gem.
|
|
64
|
+
# Also triggers eager loading so the list is complete.
|
|
65
|
+
def tools
|
|
66
|
+
load_all_tools
|
|
67
|
+
ObjectSpace.each_object(Class).select { |k| k < ::RubyLLM::Tool }.to_a
|
|
68
|
+
end
|
|
81
69
|
end
|
|
82
70
|
end
|
|
71
|
+
|
|
72
|
+
require_relative "shared_tools/utilities"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: shared_tools
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dewayne VanHoozer
|
|
@@ -122,7 +122,21 @@ dependencies:
|
|
|
122
122
|
- !ruby/object:Gem::Version
|
|
123
123
|
version: '0'
|
|
124
124
|
- !ruby/object:Gem::Dependency
|
|
125
|
-
name:
|
|
125
|
+
name: docx
|
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - ">="
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '0'
|
|
131
|
+
type: :development
|
|
132
|
+
prerelease: false
|
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - ">="
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: '0'
|
|
138
|
+
- !ruby/object:Gem::Dependency
|
|
139
|
+
name: roo
|
|
126
140
|
requirement: !ruby/object:Gem::Requirement
|
|
127
141
|
requirements:
|
|
128
142
|
- - ">="
|
|
@@ -136,7 +150,7 @@ dependencies:
|
|
|
136
150
|
- !ruby/object:Gem::Version
|
|
137
151
|
version: '0'
|
|
138
152
|
- !ruby/object:Gem::Dependency
|
|
139
|
-
name:
|
|
153
|
+
name: sqlite3
|
|
140
154
|
requirement: !ruby/object:Gem::Requirement
|
|
141
155
|
requirements:
|
|
142
156
|
- - ">="
|
|
@@ -150,7 +164,7 @@ dependencies:
|
|
|
150
164
|
- !ruby/object:Gem::Version
|
|
151
165
|
version: '0'
|
|
152
166
|
- !ruby/object:Gem::Dependency
|
|
153
|
-
name:
|
|
167
|
+
name: ferrum
|
|
154
168
|
requirement: !ruby/object:Gem::Requirement
|
|
155
169
|
requirements:
|
|
156
170
|
- - ">="
|
|
@@ -219,6 +233,20 @@ dependencies:
|
|
|
219
233
|
- - ">="
|
|
220
234
|
- !ruby/object:Gem::Version
|
|
221
235
|
version: '0'
|
|
236
|
+
- !ruby/object:Gem::Dependency
|
|
237
|
+
name: minitest-mock
|
|
238
|
+
requirement: !ruby/object:Gem::Requirement
|
|
239
|
+
requirements:
|
|
240
|
+
- - ">="
|
|
241
|
+
- !ruby/object:Gem::Version
|
|
242
|
+
version: '0'
|
|
243
|
+
type: :development
|
|
244
|
+
prerelease: false
|
|
245
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
246
|
+
requirements:
|
|
247
|
+
- - ">="
|
|
248
|
+
- !ruby/object:Gem::Version
|
|
249
|
+
version: '0'
|
|
222
250
|
- !ruby/object:Gem::Dependency
|
|
223
251
|
name: rake
|
|
224
252
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -246,10 +274,34 @@ files:
|
|
|
246
274
|
- LICENSE
|
|
247
275
|
- README.md
|
|
248
276
|
- lib/shared_tools.rb
|
|
277
|
+
- lib/shared_tools/browser_tool.rb
|
|
278
|
+
- lib/shared_tools/calculator_tool.rb
|
|
279
|
+
- lib/shared_tools/clipboard_tool.rb
|
|
280
|
+
- lib/shared_tools/composite_analysis_tool.rb
|
|
281
|
+
- lib/shared_tools/computer_tool.rb
|
|
282
|
+
- lib/shared_tools/cron_tool.rb
|
|
283
|
+
- lib/shared_tools/current_date_time_tool.rb
|
|
284
|
+
- lib/shared_tools/data_science_kit.rb
|
|
285
|
+
- lib/shared_tools/database.rb
|
|
286
|
+
- lib/shared_tools/database_query_tool.rb
|
|
287
|
+
- lib/shared_tools/database_tool.rb
|
|
288
|
+
- lib/shared_tools/disk_tool.rb
|
|
289
|
+
- lib/shared_tools/dns_tool.rb
|
|
290
|
+
- lib/shared_tools/doc_tool.rb
|
|
291
|
+
- lib/shared_tools/error_handling_tool.rb
|
|
292
|
+
- lib/shared_tools/eval_tool.rb
|
|
249
293
|
- lib/shared_tools/mcp.rb
|
|
250
|
-
- lib/shared_tools/mcp/
|
|
251
|
-
- lib/shared_tools/mcp/
|
|
252
|
-
- lib/shared_tools/mcp/
|
|
294
|
+
- lib/shared_tools/mcp/brave_search_client.rb
|
|
295
|
+
- lib/shared_tools/mcp/chart_client.rb
|
|
296
|
+
- lib/shared_tools/mcp/github_client.rb
|
|
297
|
+
- lib/shared_tools/mcp/hugging_face_client.rb
|
|
298
|
+
- lib/shared_tools/mcp/memory_client.rb
|
|
299
|
+
- lib/shared_tools/mcp/notion_client.rb
|
|
300
|
+
- lib/shared_tools/mcp/sequential_thinking_client.rb
|
|
301
|
+
- lib/shared_tools/mcp/slack_client.rb
|
|
302
|
+
- lib/shared_tools/mcp/streamable_http_patch.rb
|
|
303
|
+
- lib/shared_tools/mcp/tavily_client.rb
|
|
304
|
+
- lib/shared_tools/system_info_tool.rb
|
|
253
305
|
- lib/shared_tools/tools.rb
|
|
254
306
|
- lib/shared_tools/tools/browser.rb
|
|
255
307
|
- lib/shared_tools/tools/browser/base_driver.rb
|
|
@@ -257,6 +309,7 @@ files:
|
|
|
257
309
|
- lib/shared_tools/tools/browser/click_tool.rb
|
|
258
310
|
- lib/shared_tools/tools/browser/elements/element_grouper.rb
|
|
259
311
|
- lib/shared_tools/tools/browser/elements/nearby_element_detector.rb
|
|
312
|
+
- lib/shared_tools/tools/browser/ferrum_driver.rb
|
|
260
313
|
- lib/shared_tools/tools/browser/formatters/action_formatter.rb
|
|
261
314
|
- lib/shared_tools/tools/browser/formatters/data_entry_formatter.rb
|
|
262
315
|
- lib/shared_tools/tools/browser/formatters/element_formatter.rb
|
|
@@ -293,7 +346,6 @@ files:
|
|
|
293
346
|
- lib/shared_tools/tools/database/sqlite_driver.rb
|
|
294
347
|
- lib/shared_tools/tools/database_query_tool.rb
|
|
295
348
|
- lib/shared_tools/tools/database_tool.rb
|
|
296
|
-
- lib/shared_tools/tools/devops_toolkit.rb
|
|
297
349
|
- lib/shared_tools/tools/disk.rb
|
|
298
350
|
- lib/shared_tools/tools/disk/base_driver.rb
|
|
299
351
|
- lib/shared_tools/tools/disk/base_tool.rb
|
|
@@ -311,23 +363,36 @@ files:
|
|
|
311
363
|
- lib/shared_tools/tools/disk_tool.rb
|
|
312
364
|
- lib/shared_tools/tools/dns_tool.rb
|
|
313
365
|
- lib/shared_tools/tools/doc.rb
|
|
366
|
+
- lib/shared_tools/tools/doc/docx_reader_tool.rb
|
|
314
367
|
- lib/shared_tools/tools/doc/pdf_reader_tool.rb
|
|
368
|
+
- lib/shared_tools/tools/doc/spreadsheet_reader_tool.rb
|
|
369
|
+
- lib/shared_tools/tools/doc/text_reader_tool.rb
|
|
315
370
|
- lib/shared_tools/tools/doc_tool.rb
|
|
316
371
|
- lib/shared_tools/tools/docker.rb
|
|
317
372
|
- lib/shared_tools/tools/docker/base_tool.rb
|
|
318
373
|
- lib/shared_tools/tools/docker/compose_run_tool.rb
|
|
374
|
+
- lib/shared_tools/tools/enabler.rb
|
|
319
375
|
- lib/shared_tools/tools/error_handling_tool.rb
|
|
320
376
|
- lib/shared_tools/tools/eval.rb
|
|
321
377
|
- lib/shared_tools/tools/eval/python_eval_tool.rb
|
|
322
378
|
- lib/shared_tools/tools/eval/ruby_eval_tool.rb
|
|
323
379
|
- lib/shared_tools/tools/eval/shell_eval_tool.rb
|
|
324
380
|
- lib/shared_tools/tools/eval_tool.rb
|
|
381
|
+
- lib/shared_tools/tools/notification.rb
|
|
382
|
+
- lib/shared_tools/tools/notification/base_driver.rb
|
|
383
|
+
- lib/shared_tools/tools/notification/linux_driver.rb
|
|
384
|
+
- lib/shared_tools/tools/notification/mac_driver.rb
|
|
385
|
+
- lib/shared_tools/tools/notification/null_driver.rb
|
|
386
|
+
- lib/shared_tools/tools/notification_tool.rb
|
|
325
387
|
- lib/shared_tools/tools/secure_tool_template.rb
|
|
326
388
|
- lib/shared_tools/tools/system_info_tool.rb
|
|
327
389
|
- lib/shared_tools/tools/version.rb
|
|
328
390
|
- lib/shared_tools/tools/weather_tool.rb
|
|
329
391
|
- lib/shared_tools/tools/workflow_manager_tool.rb
|
|
392
|
+
- lib/shared_tools/utilities.rb
|
|
330
393
|
- lib/shared_tools/version.rb
|
|
394
|
+
- lib/shared_tools/weather_tool.rb
|
|
395
|
+
- lib/shared_tools/workflow_manager_tool.rb
|
|
331
396
|
homepage: https://github.com/madbomber/shared_tools
|
|
332
397
|
licenses:
|
|
333
398
|
- MIT
|
|
@@ -349,7 +414,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
349
414
|
- !ruby/object:Gem::Version
|
|
350
415
|
version: '0'
|
|
351
416
|
requirements: []
|
|
352
|
-
rubygems_version: 4.0.
|
|
417
|
+
rubygems_version: 4.0.9
|
|
353
418
|
specification_version: 4
|
|
354
419
|
summary: Shared utilities and AI tools for Ruby applications with configurable logging
|
|
355
420
|
test_files: []
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# shared_tools/mcp/github_mcp_server.rb
|
|
2
|
-
#
|
|
3
|
-
# GitHub MCP Server Client Configuration for ruby_llm-mcp >= 0.7.0
|
|
4
|
-
#
|
|
5
|
-
# Provides access to GitHub operations including:
|
|
6
|
-
# - Repository management
|
|
7
|
-
# - Issue and PR operations
|
|
8
|
-
# - Code search
|
|
9
|
-
# - Branch operations
|
|
10
|
-
# - And more GitHub API functionality
|
|
11
|
-
#
|
|
12
|
-
# Installation:
|
|
13
|
-
# brew install github-mcp-server
|
|
14
|
-
#
|
|
15
|
-
# Configuration:
|
|
16
|
-
# Set environment variable: GITHUB_PERSONAL_ACCESS_TOKEN
|
|
17
|
-
# export GITHUB_PERSONAL_ACCESS_TOKEN=your_token_here
|
|
18
|
-
#
|
|
19
|
-
# Compatible with ruby_llm-mcp v0.7.0+
|
|
20
|
-
|
|
21
|
-
require "ruby_llm/mcp"
|
|
22
|
-
|
|
23
|
-
RubyLLM::MCP.add_client(
|
|
24
|
-
name: "github-mcp-server",
|
|
25
|
-
transport_type: :stdio,
|
|
26
|
-
config: {
|
|
27
|
-
command: "/opt/homebrew/bin/github-mcp-server",
|
|
28
|
-
args: %w[stdio],
|
|
29
|
-
env: { "GITHUB_PERSONAL_ACCESS_TOKEN" => ENV.fetch("GITHUB_PERSONAL_ACCESS_TOKEN") },
|
|
30
|
-
},
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
__END__
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
A GitHub MCP server that handles various tools and resources.
|
|
38
|
-
|
|
39
|
-
Usage:
|
|
40
|
-
server [command]
|
|
41
|
-
|
|
42
|
-
Available Commands:
|
|
43
|
-
completion Generate the autocompletion script for the specified shell
|
|
44
|
-
help Help about any command
|
|
45
|
-
stdio Start stdio server
|
|
46
|
-
|
|
47
|
-
Flags:
|
|
48
|
-
--dynamic-toolsets Enable dynamic toolsets
|
|
49
|
-
--enable-command-logging When enabled, the server will log all command requests and responses to the log file
|
|
50
|
-
--export-translations Save translations to a JSON file
|
|
51
|
-
--gh-host string Specify the GitHub hostname (for GitHub Enterprise etc.)
|
|
52
|
-
-h, --help help for server
|
|
53
|
-
--log-file string Path to log file
|
|
54
|
-
--read-only Restrict the server to read-only operations
|
|
55
|
-
--toolsets strings An optional comma separated list of groups of tools to allow, defaults to enabling all (default [all])
|
|
56
|
-
-v, --version version for server
|
|
57
|
-
|
|
58
|
-
Use "server [command] --help" for more information about a command.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# shared_tools/mcp/imcp.rb
|
|
2
|
-
#
|
|
3
|
-
# iMCP Client Configuration for ruby_llm-mcp >= 0.7.0
|
|
4
|
-
#
|
|
5
|
-
# iMCP is a macOS application that provides MCP access to:
|
|
6
|
-
# - Notes
|
|
7
|
-
# - Calendar
|
|
8
|
-
# - Contacts
|
|
9
|
-
# - Reminders
|
|
10
|
-
# - And other macOS native applications
|
|
11
|
-
#
|
|
12
|
-
# Installation:
|
|
13
|
-
# brew install --cask loopwork/tap/iMCP
|
|
14
|
-
#
|
|
15
|
-
# Documentation:
|
|
16
|
-
# https://github.com/loopwork/iMCP
|
|
17
|
-
#
|
|
18
|
-
# Compatible with ruby_llm-mcp v0.7.0+
|
|
19
|
-
|
|
20
|
-
require 'ruby_llm/mcp'
|
|
21
|
-
|
|
22
|
-
RubyLLM::MCP.add_client(
|
|
23
|
-
name: "imcp-server",
|
|
24
|
-
transport_type: :stdio,
|
|
25
|
-
config: {
|
|
26
|
-
command: "/Applications/iMCP.app/Contents/MacOS/imcp-server 2> /dev/null"
|
|
27
|
-
}
|
|
28
|
-
)
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# shared_tools/mcp/tavily_mcp_server.rb
|
|
2
|
-
#
|
|
3
|
-
# Tavily MCP Server Client Configuration for ruby_llm-mcp >= 0.7.0
|
|
4
|
-
#
|
|
5
|
-
# Provides AI-powered web search and research capabilities:
|
|
6
|
-
# - Web search with AI-optimized results
|
|
7
|
-
# - Research-grade content extraction
|
|
8
|
-
# - Real-time information gathering
|
|
9
|
-
# - News and current events search
|
|
10
|
-
#
|
|
11
|
-
# Installation:
|
|
12
|
-
# Requires Node.js and npx (comes with Node.js)
|
|
13
|
-
# The mcp-remote package will be installed automatically via npx
|
|
14
|
-
#
|
|
15
|
-
# Configuration:
|
|
16
|
-
# Set environment variable: TAVILY_API_KEY
|
|
17
|
-
# export TAVILY_API_KEY=your_api_key_here
|
|
18
|
-
# Get your API key at: https://tavily.com
|
|
19
|
-
#
|
|
20
|
-
# Compatible with ruby_llm-mcp v0.7.0+
|
|
21
|
-
|
|
22
|
-
require "ruby_llm/mcp"
|
|
23
|
-
|
|
24
|
-
RubyLLM::MCP.add_client(
|
|
25
|
-
name: "tavily",
|
|
26
|
-
transport_type: :stdio,
|
|
27
|
-
config: {
|
|
28
|
-
command: "npx -y mcp-remote https://mcp.tavily.com/mcp/?tavilyApiKey=#{ENV.fetch('TAVILY_API_KEY')}",
|
|
29
|
-
env: {}
|
|
30
|
-
}
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
__END__
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
# {
|
|
38
|
-
# "mcpServers": {
|
|
39
|
-
# "tavily-remote-mcp": {
|
|
40
|
-
# "command": "npx -y mcp-remote https://mcp.tavily.com/mcp/?tavilyApiKey=$TAVILY_API_KEY",
|
|
41
|
-
# "env": {}
|
|
42
|
-
# }
|
|
43
|
-
# }
|
|
44
|
-
# }
|