@nirholas/lyra-tool-discovery 0.1.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/CHANGELOG.md +112 -0
- package/LICENSE +21 -0
- package/README.md +1011 -0
- package/package.json +120 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
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.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Comprehensive README documentation
|
|
12
|
+
- CONTRIBUTING.md guidelines
|
|
13
|
+
- Environment variable template (.env.example)
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Nothing yet
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- Nothing yet
|
|
20
|
+
|
|
21
|
+
## [0.1.0] - 2024-01-15
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
#### Core Features
|
|
26
|
+
- **Multi-provider AI support** - OpenAI (GPT-4o, GPT-4-turbo) and Anthropic (Claude Sonnet, Opus)
|
|
27
|
+
- **Auto-detection** of AI provider from environment variables
|
|
28
|
+
- **8 plugin templates** for SperaxOS integration:
|
|
29
|
+
- `mcp-http` - Remote MCP servers over HTTP/SSE
|
|
30
|
+
- `mcp-stdio` - Local MCP servers via stdio
|
|
31
|
+
- `openapi` - REST API integrations
|
|
32
|
+
- `standalone` - Full React applications
|
|
33
|
+
- `markdown` - Rich text/documentation plugins
|
|
34
|
+
- `default` - Configurable plugins with settings UI
|
|
35
|
+
- `settings` - User preference plugins
|
|
36
|
+
- `basic` - Simple function-based plugins
|
|
37
|
+
|
|
38
|
+
#### Discovery Sources
|
|
39
|
+
- **GitHub source** - Search repositories by topics, names, and README content
|
|
40
|
+
- **npm source** - Search npm registry for MCP-related packages
|
|
41
|
+
- Automatic detection of MCP support via `@modelcontextprotocol/sdk` dependency
|
|
42
|
+
- README and package.json fetching for AI analysis
|
|
43
|
+
|
|
44
|
+
#### CLI Commands
|
|
45
|
+
- `lyra-discover discover` - Search across configured sources
|
|
46
|
+
- `lyra-discover analyze-repo <owner> <repo>` - Analyze specific GitHub repository
|
|
47
|
+
- `lyra-discover analyze-npm <package>` - Analyze specific npm package
|
|
48
|
+
- `lyra-discover providers` - Show available AI providers
|
|
49
|
+
- `lyra-discover templates` - List all plugin templates
|
|
50
|
+
|
|
51
|
+
#### CLI Options
|
|
52
|
+
- `--sources, -s` - Specify discovery sources (github, npm)
|
|
53
|
+
- `--limit, -l` - Limit number of results
|
|
54
|
+
- `--dry-run, -d` - Preview without AI calls
|
|
55
|
+
- `--provider, -p` - Override AI provider
|
|
56
|
+
- `--model, -m` - Override AI model
|
|
57
|
+
|
|
58
|
+
#### Output Formats
|
|
59
|
+
- JSON output for CI/CD pipelines
|
|
60
|
+
- Quick Import format for SperaxOS
|
|
61
|
+
- Console output with rich formatting
|
|
62
|
+
- Plugin manifests for plugin.delivery
|
|
63
|
+
|
|
64
|
+
### Technical Details
|
|
65
|
+
- Built with TypeScript 5.7
|
|
66
|
+
- Uses Commander.js for CLI
|
|
67
|
+
- OpenAI SDK for GPT models
|
|
68
|
+
- Anthropic SDK for Claude models
|
|
69
|
+
- ESM module format
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Version History
|
|
74
|
+
|
|
75
|
+
| Version | Date | Description |
|
|
76
|
+
|---------|------|-------------|
|
|
77
|
+
| 0.1.0 | 2024-01-15 | Initial release |
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Upcoming Features
|
|
82
|
+
|
|
83
|
+
Features planned for future releases:
|
|
84
|
+
|
|
85
|
+
### v0.2.0
|
|
86
|
+
- [ ] Configuration file support (`discovery.config.json`)
|
|
87
|
+
- [ ] Output to file option (`--output`)
|
|
88
|
+
- [ ] Filter by minimum stars
|
|
89
|
+
- [ ] Filter by license type
|
|
90
|
+
|
|
91
|
+
### v0.3.0
|
|
92
|
+
- [ ] Smithery source integration
|
|
93
|
+
- [ ] OpenAPI Directory source
|
|
94
|
+
- [ ] Batch processing mode
|
|
95
|
+
- [ ] Caching for repeated analyses
|
|
96
|
+
|
|
97
|
+
### v0.4.0
|
|
98
|
+
- [ ] Plugin manifest generation
|
|
99
|
+
- [ ] Automatic PR creation for plugin.delivery
|
|
100
|
+
- [ ] GitHub Action for scheduled discovery
|
|
101
|
+
- [ ] Webhook notifications
|
|
102
|
+
|
|
103
|
+
### v1.0.0
|
|
104
|
+
- [ ] Stable API
|
|
105
|
+
- [ ] Comprehensive test suite
|
|
106
|
+
- [ ] Full documentation
|
|
107
|
+
- [ ] Production-ready error handling
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
[Unreleased]: https://github.com/nirholas/lyra-tool-discovery/compare/v0.1.0...HEAD
|
|
112
|
+
[0.1.0]: https://github.com/nirholas/lyra-tool-discovery/releases/tag/v0.1.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-2026 nirholas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,1011 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🔮 Lyra Tool Discovery
|
|
4
|
+
|
|
5
|
+
**AI-powered tool discovery for the MCP ecosystem**
|
|
6
|
+
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
9
|
+
[](http://makeapullrequest.com)
|
|
10
|
+
[](https://openai.com)
|
|
11
|
+
|
|
12
|
+
[Documentation](https://github.com/nirholas/lyra-tool-discovery/tree/main/docs) · [CLI Reference](#-cli-reference) · [Examples](#-examples) · [Contributing](#-contributing)
|
|
13
|
+
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 📖 Overview
|
|
19
|
+
|
|
20
|
+
**Lyra Tool Discovery** is an AI-powered automation tool designed specifically for the **crypto, DeFi, blockchain, and web3 ecosystem**. It solves the painful problem of manually discovering, evaluating, and integrating MCP (Model Context Protocol) servers into your crypto-focused applications. Instead of spending hours searching GitHub, reading READMEs, and figuring out the right integration approach, Lyra does it for you in seconds.
|
|
21
|
+
|
|
22
|
+
The tool crawls multiple sources—GitHub and npm—to find crypto-related MCP servers, APIs, and plugins. It filters results to focus exclusively on **blockchain, DeFi, web3, and cryptocurrency tooling** (including Ethereum, Solana, Bitcoin, wallets, tokens, NFTs, DEXs, staking, bridges, and more). Lyra then leverages state-of-the-art AI (OpenAI GPT-4o or Anthropic Claude) to analyze each discovered tool and automatically generates ready-to-use plugin configurations.
|
|
23
|
+
|
|
24
|
+
### 🪙 Crypto Focus
|
|
25
|
+
|
|
26
|
+
Lyra is optimized for discovering tools related to:
|
|
27
|
+
|
|
28
|
+
- **Blockchain Networks** — Ethereum, Solana, Bitcoin, Layer 2s, bridges
|
|
29
|
+
- **DeFi Protocols** — DEXs, lending, staking, yield farming, liquidity
|
|
30
|
+
- **Web3 Infrastructure** — Wallets, RPC providers, indexers, oracles
|
|
31
|
+
- **Token Standards** — ERC-20, ERC-721, NFTs, token swaps
|
|
32
|
+
- **Smart Contracts** — Development, auditing, deployment tools
|
|
33
|
+
- **On-chain Data** — Analytics, explorers, transaction tracking
|
|
34
|
+
|
|
35
|
+
Lyra is built for **crypto MCP ecosystem developers** who need to rapidly onboard new tools, **plugin marketplace operators** like plugin.delivery who curate crypto plugins, and **automation engineers** building CI/CD pipelines for DeFi tool discovery and deployment.
|
|
36
|
+
|
|
37
|
+
This tool is a critical piece of the discovery-to-deployment pipeline: `lyra-tool-discovery` → `github-to-mcp` → `plugin.delivery` → **SperaxOS users**. By automating the discovery and classification phase, Lyra enables fully automated plugin onboarding with minimal human intervention.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## ✨ Features
|
|
42
|
+
|
|
43
|
+
<table>
|
|
44
|
+
<tr>
|
|
45
|
+
<td width="50%">
|
|
46
|
+
|
|
47
|
+
### 🤖 Multi-Provider AI
|
|
48
|
+
|
|
49
|
+
- **OpenAI** — GPT-4o, GPT-4-turbo, GPT-3.5-turbo
|
|
50
|
+
- **Anthropic** — Claude Sonnet 4, Claude Opus
|
|
51
|
+
- Auto-detection from environment variables
|
|
52
|
+
- Custom model selection via CLI or config
|
|
53
|
+
- Intelligent fallback between providers
|
|
54
|
+
|
|
55
|
+
</td>
|
|
56
|
+
<td width="50%">
|
|
57
|
+
|
|
58
|
+
### 📦 8 Plugin Templates
|
|
59
|
+
|
|
60
|
+
- `mcp-http` — Remote MCP servers (HTTP/SSE)
|
|
61
|
+
- `mcp-stdio` — Local MCP servers (stdio)
|
|
62
|
+
- `openapi` — REST API integrations
|
|
63
|
+
- `standalone` — Full React applications
|
|
64
|
+
- `markdown` — Rich text/documentation
|
|
65
|
+
- `default` — Configurable plugins
|
|
66
|
+
- `settings` — User preference plugins
|
|
67
|
+
- `basic` — Simple function plugins
|
|
68
|
+
|
|
69
|
+
</td>
|
|
70
|
+
</tr>
|
|
71
|
+
<tr>
|
|
72
|
+
<td width="50%">
|
|
73
|
+
|
|
74
|
+
### 🔍 Discovery Sources
|
|
75
|
+
|
|
76
|
+
- **GitHub** — Search repos, topics, READMEs
|
|
77
|
+
- **npm** — Package registry search
|
|
78
|
+
- 🔜 Smithery (MCP directory)
|
|
79
|
+
- 🔜 OpenAPI Directory
|
|
80
|
+
- 🔜 RapidAPI
|
|
81
|
+
|
|
82
|
+
</td>
|
|
83
|
+
<td width="50%">
|
|
84
|
+
|
|
85
|
+
### 🪙 Crypto Filtering
|
|
86
|
+
|
|
87
|
+
- **Keywords** — crypto, defi, blockchain, web3
|
|
88
|
+
- **Networks** — ethereum, solana, bitcoin
|
|
89
|
+
- **Protocols** — wallet, token, nft, dex, staking
|
|
90
|
+
- **Age Filter** — Only repos updated within 12 months
|
|
91
|
+
- **Smart Validation** — AI validates crypto relevance
|
|
92
|
+
|
|
93
|
+
- Full-featured command-line interface
|
|
94
|
+
- Node.js/TypeScript SDK for automation
|
|
95
|
+
- JSON output for CI/CD pipelines
|
|
96
|
+
- Dry-run mode for testing
|
|
97
|
+
- Progress indicators and rich output
|
|
98
|
+
|
|
99
|
+
</td>
|
|
100
|
+
</tr>
|
|
101
|
+
<tr>
|
|
102
|
+
<td width="50%">
|
|
103
|
+
|
|
104
|
+
### 🖥️ CLI & Programmatic API
|
|
105
|
+
|
|
106
|
+
- Full-featured command-line interface
|
|
107
|
+
- Node.js/TypeScript SDK for automation
|
|
108
|
+
- JSON output for CI/CD pipelines
|
|
109
|
+
- Dry-run mode for testing
|
|
110
|
+
- Progress indicators and rich output
|
|
111
|
+
|
|
112
|
+
</td>
|
|
113
|
+
<td width="50%">
|
|
114
|
+
|
|
115
|
+
### 🧪 Testing & Validation
|
|
116
|
+
|
|
117
|
+
- `--dry-run` mode for safe testing
|
|
118
|
+
- List discovered tools without AI calls
|
|
119
|
+
- Validate configurations before deployment
|
|
120
|
+
- Debug logging for troubleshooting
|
|
121
|
+
|
|
122
|
+
</td>
|
|
123
|
+
</tr>
|
|
124
|
+
<tr>
|
|
125
|
+
<td width="50%">
|
|
126
|
+
|
|
127
|
+
### 📤 Flexible Output
|
|
128
|
+
|
|
129
|
+
- Structured JSON for piping to other tools
|
|
130
|
+
- Quick Import format for SperaxOS
|
|
131
|
+
- Plugin manifests for plugin.delivery
|
|
132
|
+
- Console output with rich formatting
|
|
133
|
+
|
|
134
|
+
</td>
|
|
135
|
+
</tr>
|
|
136
|
+
</table>
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 🪙 Crypto Discovery Keywords
|
|
141
|
+
|
|
142
|
+
Lyra automatically filters discovery results to focus on crypto/DeFi/blockchain/web3 tools. The following keywords are used for both search queries and result validation:
|
|
143
|
+
|
|
144
|
+
<details>
|
|
145
|
+
<summary><strong>View all supported keywords</strong></summary>
|
|
146
|
+
|
|
147
|
+
| Category | Keywords |
|
|
148
|
+
|----------|----------|
|
|
149
|
+
| **General** | crypto, cryptocurrency, defi, blockchain, web3 |
|
|
150
|
+
| **Networks** | ethereum, eth, solana, sol, bitcoin, btc, chain |
|
|
151
|
+
| **Tokens** | token, erc20, erc721, nft |
|
|
152
|
+
| **DeFi** | dex, swap, staking, yield, lending, liquidity, vault, bridge |
|
|
153
|
+
| **Infrastructure** | wallet, protocol, onchain, on-chain, smart contract |
|
|
154
|
+
| **Libraries** | web3.js, ethers, viem, wagmi, rainbowkit |
|
|
155
|
+
| **Protocols** | uniswap, aave, compound |
|
|
156
|
+
|
|
157
|
+
</details>
|
|
158
|
+
|
|
159
|
+
Tools that don't match any of these keywords are automatically filtered out, ensuring you only discover crypto-relevant MCP servers.
|
|
160
|
+
|
|
161
|
+
### Age Filtering
|
|
162
|
+
|
|
163
|
+
By default, Lyra only discovers tools that have been updated within the **last 12 months**. This ensures you're finding actively maintained projects. Use `--max-age` to adjust:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Only tools updated in the last 6 months
|
|
167
|
+
lyra-discover discover --max-age 6
|
|
168
|
+
|
|
169
|
+
# Only tools updated in the last 3 months (bleeding edge)
|
|
170
|
+
lyra-discover discover --max-age 3
|
|
171
|
+
|
|
172
|
+
# Tools up to 24 months old
|
|
173
|
+
lyra-discover discover --max-age 24
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Quick Start
|
|
179
|
+
|
|
180
|
+
### Installation
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
# Global install (recommended for CLI usage)
|
|
184
|
+
pnpm add -g @nirholas/lyra-tool-discovery
|
|
185
|
+
|
|
186
|
+
# Or with npm
|
|
187
|
+
npm install -g @nirholas/lyra-tool-discovery
|
|
188
|
+
|
|
189
|
+
# Or as a project dependency
|
|
190
|
+
pnpm add @nirholas/lyra-tool-discovery
|
|
191
|
+
|
|
192
|
+
# Or run directly with npx (no install)
|
|
193
|
+
npx @nirholas/lyra-tool-discovery discover --help
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Environment Setup
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Using OpenAI (default when both keys present)
|
|
200
|
+
export OPENAI_API_KEY="sk-..."
|
|
201
|
+
|
|
202
|
+
# Or using Anthropic
|
|
203
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
204
|
+
|
|
205
|
+
# Optional: Force a specific provider
|
|
206
|
+
export AI_PROVIDER="anthropic" # or "openai"
|
|
207
|
+
|
|
208
|
+
# Optional: Specify a model
|
|
209
|
+
export AI_MODEL="claude-sonnet-4-20250514"
|
|
210
|
+
|
|
211
|
+
# Optional: GitHub token for higher rate limits
|
|
212
|
+
export GITHUB_TOKEN="ghp_..."
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### First Discovery
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# Discover MCP servers from GitHub and npm
|
|
219
|
+
lyra-discover discover --sources github,npm --limit 10
|
|
220
|
+
|
|
221
|
+
# Run in dry-run mode (no AI calls)
|
|
222
|
+
lyra-discover discover --dry-run --limit 20
|
|
223
|
+
|
|
224
|
+
# Analyze a specific GitHub repository
|
|
225
|
+
lyra-discover analyze-repo anthropics claude-mcp
|
|
226
|
+
|
|
227
|
+
# Analyze an npm package
|
|
228
|
+
lyra-discover analyze-npm @modelcontextprotocol/server-github
|
|
229
|
+
|
|
230
|
+
# Check available AI providers
|
|
231
|
+
lyra-discover providers
|
|
232
|
+
|
|
233
|
+
# View all plugin templates
|
|
234
|
+
lyra-discover templates
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 📖 CLI Reference
|
|
240
|
+
|
|
241
|
+
### Global Options
|
|
242
|
+
|
|
243
|
+
| Flag | Alias | Description | Default |
|
|
244
|
+
|------|-------|-------------|---------|
|
|
245
|
+
| `--provider` | `-p` | AI provider (`openai` or `anthropic`) | Auto-detect from env |
|
|
246
|
+
| `--model` | `-m` | AI model to use | Provider default |
|
|
247
|
+
| `--version` | `-V` | Show version number | — |
|
|
248
|
+
| `--help` | `-h` | Show help | — |
|
|
249
|
+
|
|
250
|
+
### Commands
|
|
251
|
+
|
|
252
|
+
#### `discover`
|
|
253
|
+
|
|
254
|
+
Search for MCP tools and APIs across configured sources.
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
lyra-discover discover [options]
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
| Option | Alias | Description | Default |
|
|
261
|
+
|--------|-------|-------------|---------|
|
|
262
|
+
| `--sources` | `-s` | Comma-separated sources: `github`, `npm`, `awesome-list` | `github,npm` |
|
|
263
|
+
| `--limit` | `-l` | Maximum tools to discover per source | `5` |
|
|
264
|
+
| `--max-age` | `-a` | Maximum age in months for discovered repos | `12` |
|
|
265
|
+
| `--dry-run` | `-d` | List tools without AI analysis | `false` |
|
|
266
|
+
| `--provider` | `-p` | AI provider to use | Auto-detect |
|
|
267
|
+
| `--model` | `-m` | AI model to use | Provider default |
|
|
268
|
+
|
|
269
|
+
**Examples:**
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
# Discover crypto MCP tools from GitHub only, limit 10 results
|
|
273
|
+
lyra-discover discover --sources github --limit 10
|
|
274
|
+
|
|
275
|
+
# Find tools updated in the last 6 months only
|
|
276
|
+
lyra-discover discover --max-age 6 --limit 20
|
|
277
|
+
|
|
278
|
+
# Dry run to preview what would be analyzed
|
|
279
|
+
lyra-discover discover --dry-run --sources npm --limit 20
|
|
280
|
+
|
|
281
|
+
# Use Anthropic Claude for analysis
|
|
282
|
+
lyra-discover discover --provider anthropic --model claude-sonnet-4-20250514
|
|
283
|
+
|
|
284
|
+
# Use OpenAI GPT-4o for analysis
|
|
285
|
+
lyra-discover discover --provider openai --model gpt-4o
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Example Output:**
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
🔍 Discovering crypto/DeFi/web3 tools from: github, npm
|
|
292
|
+
📅 Max age: 12 months
|
|
293
|
+
Found 5 from github
|
|
294
|
+
Found 3 from npm
|
|
295
|
+
|
|
296
|
+
📊 Total discovered: 8 tools
|
|
297
|
+
🪙 Crypto-related: 6 tools
|
|
298
|
+
🔌 MCP-compatible: 5 tools
|
|
299
|
+
|
|
300
|
+
🤖 Analyzing: mcp-server-ethereum...
|
|
301
|
+
Template: mcp-stdio
|
|
302
|
+
Reasoning: Has MCP SDK dependency and bin entry for local execution
|
|
303
|
+
|
|
304
|
+
✅ Analyzed 5 tools
|
|
305
|
+
|
|
306
|
+
📦 Generated Configs:
|
|
307
|
+
|
|
308
|
+
--- mcp-server-ethereum ---
|
|
309
|
+
Template: mcp-stdio
|
|
310
|
+
Config: {
|
|
311
|
+
"identifier": "mcp-server-ethereum",
|
|
312
|
+
"customParams": {
|
|
313
|
+
"mcp": {
|
|
314
|
+
"type": "stdio",
|
|
315
|
+
"command": "npx",
|
|
316
|
+
"args": ["-y", "mcp-server-ethereum"]
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
#### `analyze-repo`
|
|
325
|
+
|
|
326
|
+
Analyze a specific GitHub repository.
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
lyra-discover analyze-repo <owner> <repo> [options]
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
| Argument | Description |
|
|
333
|
+
|----------|-------------|
|
|
334
|
+
| `owner` | GitHub repository owner/organization |
|
|
335
|
+
| `repo` | Repository name |
|
|
336
|
+
|
|
337
|
+
| Option | Alias | Description |
|
|
338
|
+
|--------|-------|-------------|
|
|
339
|
+
| `--provider` | `-p` | AI provider to use |
|
|
340
|
+
| `--model` | `-m` | AI model to use |
|
|
341
|
+
|
|
342
|
+
**Examples:**
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
# Analyze the official MCP GitHub server
|
|
346
|
+
lyra-discover analyze-repo modelcontextprotocol servers
|
|
347
|
+
|
|
348
|
+
# Analyze with specific model
|
|
349
|
+
lyra-discover analyze-repo anthropics claude-mcp --model gpt-4o
|
|
350
|
+
|
|
351
|
+
# Analyze a community MCP server
|
|
352
|
+
lyra-discover analyze-repo punkpeye mcp-server-obsidian
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**Example Output:**
|
|
356
|
+
|
|
357
|
+
```
|
|
358
|
+
🔍 Fetching modelcontextprotocol/servers...
|
|
359
|
+
🤖 Analyzing...
|
|
360
|
+
|
|
361
|
+
✅ Analysis complete:
|
|
362
|
+
Template: mcp-stdio
|
|
363
|
+
Reasoning: Repository contains multiple MCP servers with bin entries, using @modelcontextprotocol/sdk
|
|
364
|
+
|
|
365
|
+
📋 Quick Import JSON:
|
|
366
|
+
{
|
|
367
|
+
"mcpServers": {
|
|
368
|
+
"github": {
|
|
369
|
+
"command": "npx",
|
|
370
|
+
"args": ["-y", "@modelcontextprotocol/server-github"]
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
#### `analyze-npm`
|
|
379
|
+
|
|
380
|
+
Analyze a specific npm package.
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
lyra-discover analyze-npm <package> [options]
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
| Argument | Description |
|
|
387
|
+
|----------|-------------|
|
|
388
|
+
| `package` | npm package name (with or without scope) |
|
|
389
|
+
|
|
390
|
+
| Option | Alias | Description |
|
|
391
|
+
|--------|-------|-------------|
|
|
392
|
+
| `--provider` | `-p` | AI provider to use |
|
|
393
|
+
| `--model` | `-m` | AI model to use |
|
|
394
|
+
|
|
395
|
+
**Examples:**
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
# Analyze official MCP server packages
|
|
399
|
+
lyra-discover analyze-npm @modelcontextprotocol/server-github
|
|
400
|
+
lyra-discover analyze-npm @modelcontextprotocol/server-filesystem
|
|
401
|
+
lyra-discover analyze-npm @modelcontextprotocol/server-slack
|
|
402
|
+
|
|
403
|
+
# Analyze community packages
|
|
404
|
+
lyra-discover analyze-npm mcp-server-sqlite
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
#### `providers`
|
|
410
|
+
|
|
411
|
+
Show available AI providers based on configured environment variables.
|
|
412
|
+
|
|
413
|
+
```bash
|
|
414
|
+
lyra-discover providers
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
**Example Output (with keys configured):**
|
|
418
|
+
|
|
419
|
+
```
|
|
420
|
+
🤖 AI Provider Configuration
|
|
421
|
+
|
|
422
|
+
Available providers (based on env vars):
|
|
423
|
+
✅ openai
|
|
424
|
+
✅ anthropic
|
|
425
|
+
|
|
426
|
+
Override with env vars or CLI flags:
|
|
427
|
+
AI_PROVIDER=openai|anthropic
|
|
428
|
+
AI_MODEL=gpt-4o|claude-sonnet-4-20250514|etc.
|
|
429
|
+
--provider openai --model gpt-4o
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
**Example Output (no keys):**
|
|
433
|
+
|
|
434
|
+
```
|
|
435
|
+
🤖 AI Provider Configuration
|
|
436
|
+
|
|
437
|
+
Available providers (based on env vars):
|
|
438
|
+
⚠️ No API keys found!
|
|
439
|
+
|
|
440
|
+
Set one of these environment variables:
|
|
441
|
+
- OPENAI_API_KEY → Use OpenAI (gpt-4o, gpt-4-turbo, etc.)
|
|
442
|
+
- ANTHROPIC_API_KEY → Use Anthropic (claude-sonnet-4-20250514, etc.)
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
#### `templates`
|
|
448
|
+
|
|
449
|
+
Display all available plugin templates with descriptions.
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
lyra-discover templates
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
**Output:**
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
╔═══════════════════════════════════════════════════════════════════════════════╗
|
|
459
|
+
║ plugin.delivery Plugin Templates ║
|
|
460
|
+
╠════════════╦════════════╦═══════════════════════════════════════════════════════╣
|
|
461
|
+
║ Template ║ Type ║ Description ║ Use Case ║
|
|
462
|
+
╠════════════╬════════════╬═══════════════════════════════╬════════════════════╣
|
|
463
|
+
║ basic ║ Default ║ Standard plugin with API ║ Simple data lookups║
|
|
464
|
+
║ default ║ Default ║ Plugin with settings UI ║ Configurable tools ║
|
|
465
|
+
║ markdown ║ Markdown ║ Rich text output ║ Formatted reports ║
|
|
466
|
+
║ openapi ║ OpenAPI ║ Auto-generated from spec ║ Existing APIs ║
|
|
467
|
+
║ settings ║ Default ║ Plugin with user preferences ║ Personalized tools ║
|
|
468
|
+
║ standalone ║ Standalone ║ Full React application ║ Interactive UIs ║
|
|
469
|
+
╠════════════╬════════════╬═══════════════════════════════╬════════════════════╣
|
|
470
|
+
║ mcp-http ║ MCP ║ Streamable HTTP MCP server ║ Remote MCP tools ║
|
|
471
|
+
║ mcp-stdio ║ MCP ║ STDIO-based MCP server ║ Local npm MCP ║
|
|
472
|
+
╚════════════╩════════════╩═══════════════════════════════╩════════════════════╝
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## 🔧 Programmatic API
|
|
478
|
+
|
|
479
|
+
Use Lyra as a library in your Node.js/TypeScript projects:
|
|
480
|
+
|
|
481
|
+
```typescript
|
|
482
|
+
import {
|
|
483
|
+
ToolDiscovery,
|
|
484
|
+
GitHubSource,
|
|
485
|
+
NpmSource,
|
|
486
|
+
AIAnalyzer
|
|
487
|
+
} from '@nirholas/lyra-tool-discovery';
|
|
488
|
+
|
|
489
|
+
// Initialize with default settings (auto-detect AI provider)
|
|
490
|
+
const discovery = new ToolDiscovery();
|
|
491
|
+
|
|
492
|
+
// Or with specific configuration
|
|
493
|
+
const discovery = new ToolDiscovery({
|
|
494
|
+
provider: 'anthropic',
|
|
495
|
+
model: 'claude-sonnet-4-20250514',
|
|
496
|
+
apiKey: process.env.ANTHROPIC_API_KEY // Optional, uses env var by default
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
// Discover from all sources
|
|
500
|
+
const results = await discovery.discover({
|
|
501
|
+
sources: ['github', 'npm'],
|
|
502
|
+
limit: 20,
|
|
503
|
+
dryRun: false
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
// Process results
|
|
507
|
+
for (const result of results) {
|
|
508
|
+
console.log(`Tool: ${result.tool.name}`);
|
|
509
|
+
console.log(`Template: ${result.decision.template}`);
|
|
510
|
+
console.log(`Config:`, result.generated.pluginConfig);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// Analyze a specific GitHub repo
|
|
514
|
+
const repoResult = await discovery.analyzeGitHubRepo('owner', 'repo');
|
|
515
|
+
console.log(repoResult?.decision.template);
|
|
516
|
+
|
|
517
|
+
// Analyze a specific npm package
|
|
518
|
+
const npmResult = await discovery.analyzeNpmPackage('@scope/package-name');
|
|
519
|
+
console.log(npmResult?.decision.template);
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### Using Individual Components
|
|
523
|
+
|
|
524
|
+
```typescript
|
|
525
|
+
import { GitHubSource, NpmSource, AIAnalyzer } from '@nirholas/lyra-tool-discovery';
|
|
526
|
+
|
|
527
|
+
// Use GitHub source directly
|
|
528
|
+
const github = new GitHubSource(process.env.GITHUB_TOKEN);
|
|
529
|
+
const mcpTools = await github.searchMCPServers(10);
|
|
530
|
+
const openApiTools = await github.searchOpenAPISpecs(10);
|
|
531
|
+
const specificRepo = await github.getRepo('owner', 'repo');
|
|
532
|
+
|
|
533
|
+
// Use npm source directly
|
|
534
|
+
const npm = new NpmSource();
|
|
535
|
+
const npmTools = await npm.searchMCPServers(10);
|
|
536
|
+
const specificPackage = await npm.getPackageAsTool('@modelcontextprotocol/server-github');
|
|
537
|
+
|
|
538
|
+
// Use AI analyzer directly
|
|
539
|
+
const ai = new AIAnalyzer({ provider: 'openai', model: 'gpt-4o' });
|
|
540
|
+
const decision = await ai.analyzeAndDecide(discoveredTool);
|
|
541
|
+
const quickImport = ai.generateQuickImport(decision);
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
### Type Definitions
|
|
545
|
+
|
|
546
|
+
```typescript
|
|
547
|
+
import type {
|
|
548
|
+
// Discovery types
|
|
549
|
+
DiscoveredTool,
|
|
550
|
+
DiscoveryResult,
|
|
551
|
+
DiscoverySource,
|
|
552
|
+
|
|
553
|
+
// Template types
|
|
554
|
+
PluginTemplate,
|
|
555
|
+
TemplateDecision,
|
|
556
|
+
|
|
557
|
+
// MCP types
|
|
558
|
+
MCPConnection,
|
|
559
|
+
MCPHttpConnection,
|
|
560
|
+
MCPStdioConnection,
|
|
561
|
+
MCPAuthConfig,
|
|
562
|
+
|
|
563
|
+
// Plugin types
|
|
564
|
+
CustomPlugin,
|
|
565
|
+
PluginManifest,
|
|
566
|
+
PluginIndexEntry,
|
|
567
|
+
MCPQuickImportConfig
|
|
568
|
+
} from '@nirholas/lyra-tool-discovery';
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
---
|
|
572
|
+
|
|
573
|
+
## 🏗️ Architecture
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
577
|
+
│ LYRA TOOL DISCOVERY │
|
|
578
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
579
|
+
│ │
|
|
580
|
+
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────────────┐ │
|
|
581
|
+
│ │ Sources │ │ AI Analyzer │ │ Template Engine │ │
|
|
582
|
+
│ ├────────────────┤ ├────────────────┤ ├────────────────────────┤ │
|
|
583
|
+
│ │ │ │ │ │ │ │
|
|
584
|
+
│ │ • GitHub API │────▶│ • OpenAI │────▶│ • basic │ │
|
|
585
|
+
│ │ - Repos │ │ - GPT-4o │ │ • default │ │
|
|
586
|
+
│ │ - Topics │ │ - GPT-4-turbo│ │ • markdown │ │
|
|
587
|
+
│ │ - READMEs │ │ │ │ • openapi │ │
|
|
588
|
+
│ │ │ │ • Anthropic │ │ • settings │ │
|
|
589
|
+
│ │ • npm Registry │ │ - Claude │ │ • standalone │ │
|
|
590
|
+
│ │ - Packages │ │ - Sonnet │ │ • mcp-http │ │
|
|
591
|
+
│ │ - Keywords │ │ - Opus │ │ • mcp-stdio │ │
|
|
592
|
+
│ │ │ │ │ │ │ │
|
|
593
|
+
│ └────────────────┘ └────────────────┘ └────────────────────────┘ │
|
|
594
|
+
│ │ │ │ │
|
|
595
|
+
│ │ │ │ │
|
|
596
|
+
│ ▼ ▼ ▼ │
|
|
597
|
+
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
|
598
|
+
│ │ Discovery Result │ │
|
|
599
|
+
│ ├─────────────────────────────────────────────────────────────────────┤ │
|
|
600
|
+
│ │ { │ │
|
|
601
|
+
│ │ tool: DiscoveredTool, // Source metadata │ │
|
|
602
|
+
│ │ decision: TemplateDecision, // AI analysis result │ │
|
|
603
|
+
│ │ generated: { │ │
|
|
604
|
+
│ │ pluginConfig: CustomPlugin | PluginIndexEntry │ │
|
|
605
|
+
│ │ } │ │
|
|
606
|
+
│ │ } │ │
|
|
607
|
+
│ └─────────────────────────────────────────────────────────────────────┘ │
|
|
608
|
+
│ │ │
|
|
609
|
+
│ ▼ │
|
|
610
|
+
│ ┌───────────────────────────────┐ │
|
|
611
|
+
│ │ Output Formats │ │
|
|
612
|
+
│ ├───────────────────────────────┤ │
|
|
613
|
+
│ │ • JSON (for pipelines) │ │
|
|
614
|
+
│ │ • Quick Import (SperaxOS) │ │
|
|
615
|
+
│ │ • Plugin Manifests │ │
|
|
616
|
+
│ │ • Console (human-readable) │ │
|
|
617
|
+
│ └───────────────────────────────┘ │
|
|
618
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
## 📋 Plugin Templates
|
|
624
|
+
|
|
625
|
+
Lyra analyzes tools and automatically selects from 8 plugin templates:
|
|
626
|
+
|
|
627
|
+
| Template | Transport | Type | Use Case | AI Selection Criteria |
|
|
628
|
+
|----------|-----------|------|----------|----------------------|
|
|
629
|
+
| `mcp-http` | HTTP/SSE | MCP | Remote MCP servers | Has MCP SDK + HTTP server code, publicly accessible URL |
|
|
630
|
+
| `mcp-stdio` | stdio | MCP | Local MCP servers | Has MCP SDK + `bin` entry in package.json, runs via npx |
|
|
631
|
+
| `openapi` | HTTP | OpenAPI | REST API integrations | Has OpenAPI/Swagger spec file or documentation |
|
|
632
|
+
| `standalone` | — | Standalone | Interactive applications | Needs complex UI, React components, data visualization |
|
|
633
|
+
| `markdown` | — | Markdown | Documentation/content | Outputs formatted text, reports, documentation |
|
|
634
|
+
| `default` | — | Default | Configurable plugins | Needs settings UI, configuration options |
|
|
635
|
+
| `settings` | — | Default | User preferences | Stores user preferences, personalization |
|
|
636
|
+
| `basic` | — | Default | Simple functions | Simple data lookups, basic API calls |
|
|
637
|
+
|
|
638
|
+
### AI Decision Priority
|
|
639
|
+
|
|
640
|
+
The AI follows this priority order when selecting templates:
|
|
641
|
+
|
|
642
|
+
1. **MCP Detection** → If tool uses `@modelcontextprotocol/sdk`:
|
|
643
|
+
- Has HTTP server → `mcp-http`
|
|
644
|
+
- Has bin entry → `mcp-stdio`
|
|
645
|
+
2. **OpenAPI Detection** → If has `openapi.json/yaml` or Swagger spec → `openapi`
|
|
646
|
+
3. **Complex UI** → If needs interactive dashboard → `standalone`
|
|
647
|
+
4. **Formatted Output** → If outputs rich text/markdown → `markdown`
|
|
648
|
+
5. **Configuration** → If needs user settings → `default` or `settings`
|
|
649
|
+
6. **Default** → Simple function → `basic`
|
|
650
|
+
|
|
651
|
+
---
|
|
652
|
+
|
|
653
|
+
## 🔗 Integration Pipeline
|
|
654
|
+
|
|
655
|
+
Lyra Tool Discovery is part of a larger automation toolchain for the SperaxOS ecosystem:
|
|
656
|
+
|
|
657
|
+
```
|
|
658
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
659
|
+
│ │ │ │ │ │ │ │
|
|
660
|
+
│ lyra-discover │────▶│ github-to-mcp │────▶│ plugin.delivery │────▶│ SperaxOS │
|
|
661
|
+
│ │ │ │ │ │ │ │
|
|
662
|
+
│ Discovery & │ │ Conversion │ │ Marketplace │ │ End Users │
|
|
663
|
+
│ Analysis │ │ │ │ │ │ │
|
|
664
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
1. **Discovery** (this tool) — Finds tools on GitHub/npm, analyzes with AI, generates configs
|
|
668
|
+
2. **Conversion** — [github-to-mcp](https://github.com/nirholas/github-to-mcp) converts repos to MCP servers
|
|
669
|
+
3. **Registry** — [plugin.delivery](https://plugin.delivery) hosts the plugin marketplace
|
|
670
|
+
4. **Consumption** — SperaxOS users discover and install plugins
|
|
671
|
+
|
|
672
|
+
### Automated PR Workflow
|
|
673
|
+
|
|
674
|
+
You can set up a GitHub Action to automate the entire pipeline:
|
|
675
|
+
|
|
676
|
+
```yaml
|
|
677
|
+
# .github/workflows/discover-tools.yml
|
|
678
|
+
name: Discover New Tools
|
|
679
|
+
|
|
680
|
+
on:
|
|
681
|
+
schedule:
|
|
682
|
+
- cron: '0 0 * * *' # Daily at midnight
|
|
683
|
+
workflow_dispatch:
|
|
684
|
+
|
|
685
|
+
jobs:
|
|
686
|
+
discover:
|
|
687
|
+
runs-on: ubuntu-latest
|
|
688
|
+
steps:
|
|
689
|
+
- uses: actions/checkout@v4
|
|
690
|
+
|
|
691
|
+
- name: Setup Node.js
|
|
692
|
+
uses: actions/setup-node@v4
|
|
693
|
+
with:
|
|
694
|
+
node-version: '20'
|
|
695
|
+
|
|
696
|
+
- name: Install Lyra
|
|
697
|
+
run: npm install -g @nirholas/lyra-tool-discovery
|
|
698
|
+
|
|
699
|
+
- name: Discover new MCP servers
|
|
700
|
+
env:
|
|
701
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
702
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
703
|
+
run: |
|
|
704
|
+
lyra-discover discover \
|
|
705
|
+
--sources github,npm \
|
|
706
|
+
--limit 50 \
|
|
707
|
+
> discovered-tools.json
|
|
708
|
+
|
|
709
|
+
- name: Create PR with new tools
|
|
710
|
+
uses: peter-evans/create-pull-request@v5
|
|
711
|
+
with:
|
|
712
|
+
title: '🔮 New tools discovered by Lyra'
|
|
713
|
+
body: 'Automated discovery run found new MCP servers and APIs.'
|
|
714
|
+
branch: lyra/discovered-tools
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
---
|
|
718
|
+
|
|
719
|
+
## ⚙️ Configuration
|
|
720
|
+
|
|
721
|
+
### Environment Variables
|
|
722
|
+
|
|
723
|
+
| Variable | Description | Example |
|
|
724
|
+
|----------|-------------|---------|
|
|
725
|
+
| `OPENAI_API_KEY` | OpenAI API key | `sk-...` |
|
|
726
|
+
| `ANTHROPIC_API_KEY` | Anthropic API key | `sk-ant-...` |
|
|
727
|
+
| `AI_PROVIDER` | Force specific provider | `openai` or `anthropic` |
|
|
728
|
+
| `AI_MODEL` | Override default model | `gpt-4o`, `claude-sonnet-4-20250514` |
|
|
729
|
+
| `GITHUB_TOKEN` | GitHub token for higher rate limits | `ghp_...` |
|
|
730
|
+
|
|
731
|
+
### Configuration File (Coming Soon)
|
|
732
|
+
|
|
733
|
+
Support for `discovery.config.json`:
|
|
734
|
+
|
|
735
|
+
```json
|
|
736
|
+
{
|
|
737
|
+
"sources": {
|
|
738
|
+
"github": {
|
|
739
|
+
"enabled": true,
|
|
740
|
+
"searchQueries": [
|
|
741
|
+
"mcp server in:name,description",
|
|
742
|
+
"modelcontextprotocol in:readme",
|
|
743
|
+
"@modelcontextprotocol in:readme"
|
|
744
|
+
],
|
|
745
|
+
"minStars": 10
|
|
746
|
+
},
|
|
747
|
+
"npm": {
|
|
748
|
+
"enabled": true,
|
|
749
|
+
"keywords": ["mcp", "model-context-protocol", "mcp-server"],
|
|
750
|
+
"scopes": ["@modelcontextprotocol"]
|
|
751
|
+
}
|
|
752
|
+
},
|
|
753
|
+
"ai": {
|
|
754
|
+
"provider": "anthropic",
|
|
755
|
+
"model": "claude-sonnet-4-20250514",
|
|
756
|
+
"maxTokens": 4096
|
|
757
|
+
},
|
|
758
|
+
"output": {
|
|
759
|
+
"format": "json",
|
|
760
|
+
"path": "./data/discovered-tools.json",
|
|
761
|
+
"includeMetadata": true
|
|
762
|
+
},
|
|
763
|
+
"filters": {
|
|
764
|
+
"requireMCPSupport": true,
|
|
765
|
+
"requireLicense": true,
|
|
766
|
+
"excludeArchived": true
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
---
|
|
772
|
+
|
|
773
|
+
## 📚 Examples
|
|
774
|
+
|
|
775
|
+
### Example 1: Discover and Save Results
|
|
776
|
+
|
|
777
|
+
```bash
|
|
778
|
+
# Discover tools and save to file
|
|
779
|
+
lyra-discover discover --sources github,npm --limit 20 > tools.json
|
|
780
|
+
|
|
781
|
+
# Parse with jq
|
|
782
|
+
cat tools.json | jq '.[] | {name: .tool.name, template: .decision.template}'
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
### Example 2: Batch Analyze Repositories
|
|
786
|
+
|
|
787
|
+
```bash
|
|
788
|
+
# Create a list of repos to analyze
|
|
789
|
+
repos=(
|
|
790
|
+
"modelcontextprotocol/servers"
|
|
791
|
+
"anthropics/claude-mcp"
|
|
792
|
+
"punkpeye/mcp-server-obsidian"
|
|
793
|
+
)
|
|
794
|
+
|
|
795
|
+
# Analyze each repo
|
|
796
|
+
for repo in "${repos[@]}"; do
|
|
797
|
+
owner=$(echo $repo | cut -d'/' -f1)
|
|
798
|
+
name=$(echo $repo | cut -d'/' -f2)
|
|
799
|
+
lyra-discover analyze-repo $owner $name
|
|
800
|
+
echo "---"
|
|
801
|
+
done
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
### Example 3: Analyze npm Packages in CI
|
|
805
|
+
|
|
806
|
+
```typescript
|
|
807
|
+
// scripts/analyze-packages.ts
|
|
808
|
+
import { ToolDiscovery } from '@nirholas/lyra-tool-discovery';
|
|
809
|
+
|
|
810
|
+
const packages = [
|
|
811
|
+
'@modelcontextprotocol/server-github',
|
|
812
|
+
'@modelcontextprotocol/server-filesystem',
|
|
813
|
+
'@modelcontextprotocol/server-slack',
|
|
814
|
+
];
|
|
815
|
+
|
|
816
|
+
async function main() {
|
|
817
|
+
const discovery = new ToolDiscovery({ provider: 'openai' });
|
|
818
|
+
|
|
819
|
+
for (const pkg of packages) {
|
|
820
|
+
const result = await discovery.analyzeNpmPackage(pkg);
|
|
821
|
+
if (result) {
|
|
822
|
+
console.log(JSON.stringify({
|
|
823
|
+
package: pkg,
|
|
824
|
+
template: result.decision.template,
|
|
825
|
+
config: result.generated.pluginConfig
|
|
826
|
+
}, null, 2));
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
main();
|
|
832
|
+
```
|
|
833
|
+
|
|
834
|
+
### Example 4: Custom Source Integration
|
|
835
|
+
|
|
836
|
+
```typescript
|
|
837
|
+
import { AIAnalyzer, type DiscoveredTool } from '@nirholas/lyra-tool-discovery';
|
|
838
|
+
|
|
839
|
+
// Create a custom discovered tool
|
|
840
|
+
const customTool: DiscoveredTool = {
|
|
841
|
+
id: 'custom:my-tool',
|
|
842
|
+
name: 'my-custom-mcp-server',
|
|
843
|
+
description: 'A custom MCP server for my application',
|
|
844
|
+
source: 'github',
|
|
845
|
+
sourceUrl: 'https://github.com/myorg/my-tool',
|
|
846
|
+
hasMCPSupport: true,
|
|
847
|
+
hasNpmPackage: true,
|
|
848
|
+
readme: '# My Tool\n\nAn MCP server that does X, Y, Z...',
|
|
849
|
+
packageJson: {
|
|
850
|
+
name: 'my-custom-mcp-server',
|
|
851
|
+
bin: { 'my-mcp': './dist/cli.js' },
|
|
852
|
+
dependencies: { '@modelcontextprotocol/sdk': '^1.0.0' }
|
|
853
|
+
}
|
|
854
|
+
};
|
|
855
|
+
|
|
856
|
+
// Analyze with AI
|
|
857
|
+
const ai = new AIAnalyzer({ provider: 'anthropic' });
|
|
858
|
+
const decision = await ai.analyzeAndDecide(customTool);
|
|
859
|
+
console.log(`Template: ${decision.template}`);
|
|
860
|
+
console.log(`Reasoning: ${decision.reasoning}`);
|
|
861
|
+
```
|
|
862
|
+
|
|
863
|
+
### Example 5: Dry Run with Filtering
|
|
864
|
+
|
|
865
|
+
```bash
|
|
866
|
+
# Discover in dry-run mode to see what would be analyzed
|
|
867
|
+
lyra-discover discover --dry-run --sources github --limit 50
|
|
868
|
+
|
|
869
|
+
# Output:
|
|
870
|
+
# [DRY RUN] Would analyze: mcp-server-github
|
|
871
|
+
# Source: github
|
|
872
|
+
# URL: https://github.com/modelcontextprotocol/servers
|
|
873
|
+
# MCP: Yes
|
|
874
|
+
# [DRY RUN] Would analyze: claude-mcp
|
|
875
|
+
# Source: github
|
|
876
|
+
# URL: https://github.com/anthropics/claude-mcp
|
|
877
|
+
# MCP: Yes
|
|
878
|
+
# ...
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
### Example 6: Generate Quick Import for SperaxOS
|
|
882
|
+
|
|
883
|
+
```typescript
|
|
884
|
+
import { ToolDiscovery } from '@nirholas/lyra-tool-discovery';
|
|
885
|
+
|
|
886
|
+
const discovery = new ToolDiscovery();
|
|
887
|
+
const result = await discovery.analyzeNpmPackage('@modelcontextprotocol/server-github');
|
|
888
|
+
|
|
889
|
+
// The quick import format can be directly pasted into SperaxOS
|
|
890
|
+
console.log(`Add this to your MCP configuration:`);
|
|
891
|
+
console.log(JSON.stringify({
|
|
892
|
+
mcpServers: {
|
|
893
|
+
[result.tool.name]: result.decision.config.customParams?.mcp
|
|
894
|
+
}
|
|
895
|
+
}, null, 2));
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
---
|
|
899
|
+
|
|
900
|
+
## 🤝 Contributing
|
|
901
|
+
|
|
902
|
+
We welcome contributions! Here's how to get started:
|
|
903
|
+
|
|
904
|
+
### Development Setup
|
|
905
|
+
|
|
906
|
+
```bash
|
|
907
|
+
# Clone the repository
|
|
908
|
+
git clone https://github.com/nirholas/lyra-tool-discovery.git
|
|
909
|
+
cd lyra-tool-discovery
|
|
910
|
+
|
|
911
|
+
# Install dependencies
|
|
912
|
+
pnpm install
|
|
913
|
+
|
|
914
|
+
# Set up environment
|
|
915
|
+
cp .env.example .env
|
|
916
|
+
# Edit .env with your API keys
|
|
917
|
+
|
|
918
|
+
# Run in development mode
|
|
919
|
+
pnpm dev discover --dry-run
|
|
920
|
+
|
|
921
|
+
# Build
|
|
922
|
+
pnpm build
|
|
923
|
+
|
|
924
|
+
# Run tests
|
|
925
|
+
pnpm test
|
|
926
|
+
```
|
|
927
|
+
|
|
928
|
+
### Code Style
|
|
929
|
+
|
|
930
|
+
- We use **TypeScript** with strict mode
|
|
931
|
+
- **ESLint** for linting
|
|
932
|
+
- **Prettier** for formatting
|
|
933
|
+
- Write **JSDoc comments** for public APIs
|
|
934
|
+
- Follow **conventional commits** for commit messages
|
|
935
|
+
|
|
936
|
+
### Pull Request Process
|
|
937
|
+
|
|
938
|
+
1. Fork the repository
|
|
939
|
+
2. Create a feature branch: `git checkout -b feature/amazing-feature`
|
|
940
|
+
3. Make your changes
|
|
941
|
+
4. Add tests if applicable
|
|
942
|
+
5. Run `pnpm build` and `pnpm test`
|
|
943
|
+
6. Commit with conventional commit message: `feat: add amazing feature`
|
|
944
|
+
7. Push to your fork: `git push origin feature/amazing-feature`
|
|
945
|
+
8. Open a Pull Request
|
|
946
|
+
|
|
947
|
+
### Areas for Contribution
|
|
948
|
+
|
|
949
|
+
- 🔌 **New Sources** — Add support for Smithery, OpenAPI Directory, RapidAPI
|
|
950
|
+
- 🤖 **AI Providers** — Add support for Gemini, Mistral, local models
|
|
951
|
+
- 📝 **Documentation** — Improve examples, add tutorials
|
|
952
|
+
- 🧪 **Testing** — Add unit tests, integration tests
|
|
953
|
+
- 🐛 **Bug Fixes** — Check the issues tab
|
|
954
|
+
|
|
955
|
+
---
|
|
956
|
+
|
|
957
|
+
## 🔗 Related Projects
|
|
958
|
+
|
|
959
|
+
| Project | Description |
|
|
960
|
+
|---------|-------------|
|
|
961
|
+
| [github-to-mcp](https://github.com/nirholas/github-to-mcp) | Convert GitHub repos to MCP servers |
|
|
962
|
+
| [plugin.delivery](https://plugin.delivery) | Plugin marketplace for SperaxOS |
|
|
963
|
+
| [SperaxOS](https://sperax.io) | AI-native operating system |
|
|
964
|
+
| [lyra-registry](https://github.com/nirholas/lyra-registry) | Curated registry of discovered plugins |
|
|
965
|
+
| [UCAI](https://github.com/nirholas/ucai) | Universal Context AI framework |
|
|
966
|
+
| [MCP SDK](https://github.com/modelcontextprotocol/sdk) | Official Model Context Protocol SDK |
|
|
967
|
+
|
|
968
|
+
---
|
|
969
|
+
|
|
970
|
+
## 📄 License
|
|
971
|
+
|
|
972
|
+
MIT License © 2024 [nirholas](https://github.com/nirholas)
|
|
973
|
+
|
|
974
|
+
```
|
|
975
|
+
MIT License
|
|
976
|
+
|
|
977
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
978
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
979
|
+
in the Software without restriction, including without limitation the rights
|
|
980
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
981
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
982
|
+
furnished to do so, subject to the following conditions:
|
|
983
|
+
|
|
984
|
+
The above copyright notice and this permission notice shall be included in all
|
|
985
|
+
copies or substantial portions of the Software.
|
|
986
|
+
|
|
987
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
988
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
989
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
990
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
991
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
992
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
993
|
+
SOFTWARE.
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
---
|
|
997
|
+
|
|
998
|
+
## 🙏 Credits
|
|
999
|
+
|
|
1000
|
+
- made by nich [Model Context Protocol](https://modelcontextprotocol.io) ecosystem
|
|
1001
|
+
- Powered by [OpenAI](https://openai.com) and [Anthropic](https://anthropic.com)
|
|
1002
|
+
- Inspired by the need to automate plugin discovery for SperaxOS
|
|
1003
|
+
|
|
1004
|
+
---
|
|
1005
|
+
|
|
1006
|
+
<div align="center">
|
|
1007
|
+
|
|
1008
|
+
**[⬆ Back to Top](#-lyra-tool-discovery)**
|
|
1009
|
+
|
|
1010
|
+
|
|
1011
|
+
</div>
|
package/package.json
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nirholas/lyra-tool-discovery",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-powered MCP tool discovery - find, analyze, and generate plugin configs for Model Context Protocol servers",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./cli": {
|
|
15
|
+
"import": "./dist/cli.js",
|
|
16
|
+
"types": "./dist/cli.d.ts"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"lyra-discover": "./dist/cli.js"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"README.md",
|
|
25
|
+
"LICENSE",
|
|
26
|
+
"CHANGELOG.md"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsup",
|
|
30
|
+
"dev": "tsx src/cli.ts",
|
|
31
|
+
"discover": "tsx src/cli.ts discover",
|
|
32
|
+
"discover:dry": "tsx src/cli.ts discover --dry-run",
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"test:coverage": "vitest run --coverage",
|
|
37
|
+
"prepublishOnly": "pnpm run build && pnpm run test",
|
|
38
|
+
"example:basic": "tsx examples/basic-discovery.ts",
|
|
39
|
+
"example:repo": "tsx examples/analyze-single-repo.ts",
|
|
40
|
+
"example:npm": "tsx examples/analyze-npm-package.ts",
|
|
41
|
+
"example:ai": "tsx examples/custom-ai-provider.ts",
|
|
42
|
+
"example:batch": "tsx examples/batch-processing.ts",
|
|
43
|
+
"example:filter": "tsx examples/filter-by-template.ts",
|
|
44
|
+
"example:json": "tsx examples/json-output.ts",
|
|
45
|
+
"example:dry": "tsx examples/dry-run-mode.ts",
|
|
46
|
+
"example:search": "tsx examples/custom-search-queries.ts",
|
|
47
|
+
"example:pipeline": "tsx examples/pipeline-integration.ts",
|
|
48
|
+
"example:errors": "tsx examples/11-error-handling.ts",
|
|
49
|
+
"example:action": "tsx examples/12-github-action-script.ts",
|
|
50
|
+
"dashboard": "pnpm --dir dashboard dev",
|
|
51
|
+
"dashboard:build": "pnpm --dir dashboard build",
|
|
52
|
+
"dashboard:start": "pnpm --dir dashboard start"
|
|
53
|
+
},
|
|
54
|
+
"keywords": [
|
|
55
|
+
"mcp",
|
|
56
|
+
"model-context-protocol",
|
|
57
|
+
"ai",
|
|
58
|
+
"tool-discovery",
|
|
59
|
+
"plugin",
|
|
60
|
+
"crypto",
|
|
61
|
+
"defi",
|
|
62
|
+
"blockchain",
|
|
63
|
+
"web3",
|
|
64
|
+
"ethereum",
|
|
65
|
+
"openai",
|
|
66
|
+
"anthropic",
|
|
67
|
+
"claude",
|
|
68
|
+
"gpt",
|
|
69
|
+
"speraxos",
|
|
70
|
+
"plugin-delivery"
|
|
71
|
+
],
|
|
72
|
+
"author": {
|
|
73
|
+
"name": "nirholas",
|
|
74
|
+
"url": "https://github.com/nirholas"
|
|
75
|
+
},
|
|
76
|
+
"license": "MIT",
|
|
77
|
+
"repository": {
|
|
78
|
+
"type": "git",
|
|
79
|
+
"url": "git+https://github.com/nirholas/lyra-tool-discovery.git"
|
|
80
|
+
},
|
|
81
|
+
"bugs": {
|
|
82
|
+
"url": "https://github.com/nirholas/lyra-tool-discovery/issues"
|
|
83
|
+
},
|
|
84
|
+
"homepage": "https://github.com/nirholas/lyra-tool-discovery#readme",
|
|
85
|
+
"engines": {
|
|
86
|
+
"node": ">=18.0.0"
|
|
87
|
+
},
|
|
88
|
+
"publishConfig": {
|
|
89
|
+
"access": "public",
|
|
90
|
+
"registry": "https://registry.npmjs.org/"
|
|
91
|
+
},
|
|
92
|
+
"dependencies": {
|
|
93
|
+
"@anthropic-ai/sdk": "^0.52.0",
|
|
94
|
+
"commander": "^13.0.0",
|
|
95
|
+
"debug": "^4.3.4",
|
|
96
|
+
"openai": "^4.77.0",
|
|
97
|
+
"zod": "^3.22.4"
|
|
98
|
+
},
|
|
99
|
+
"devDependencies": {
|
|
100
|
+
"@types/debug": "^4.1.12",
|
|
101
|
+
"@types/node": "^22.10.5",
|
|
102
|
+
"@vitest/coverage-v8": "^2.1.8",
|
|
103
|
+
"tsup": "^8.3.5",
|
|
104
|
+
"tsx": "^4.19.2",
|
|
105
|
+
"typescript": "^5.7.3",
|
|
106
|
+
"vitest": "^2.1.8"
|
|
107
|
+
},
|
|
108
|
+
"peerDependencies": {
|
|
109
|
+
"@anthropic-ai/sdk": ">=0.50.0",
|
|
110
|
+
"openai": ">=4.0.0"
|
|
111
|
+
},
|
|
112
|
+
"peerDependenciesMeta": {
|
|
113
|
+
"@anthropic-ai/sdk": {
|
|
114
|
+
"optional": true
|
|
115
|
+
},
|
|
116
|
+
"openai": {
|
|
117
|
+
"optional": true
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|