slop-mcp 0.1.1__tar.gz
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.
- slop_mcp-0.1.1/.gitignore +17 -0
- slop_mcp-0.1.1/LICENSE +21 -0
- slop_mcp-0.1.1/PKG-INFO +228 -0
- slop_mcp-0.1.1/README.md +201 -0
- slop_mcp-0.1.1/pyproject.toml +50 -0
- slop_mcp-0.1.1/src/slop_mcp/__init__.py +103 -0
- slop_mcp-0.1.1/src/slop_mcp/__main__.py +8 -0
slop_mcp-0.1.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 StandardBeagle
|
|
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.
|
slop_mcp-0.1.1/PKG-INFO
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: slop-mcp
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: MCP server for orchestrating multiple MCP servers with progressive tool discovery
|
|
5
|
+
Project-URL: Homepage, https://github.com/standardbeagle/slop-mcp
|
|
6
|
+
Project-URL: Repository, https://github.com/standardbeagle/slop-mcp
|
|
7
|
+
Project-URL: Issues, https://github.com/standardbeagle/slop-mcp/issues
|
|
8
|
+
Author-email: StandardBeagle <dev@standardbeagle.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: ai,llm,mcp,model-context-protocol,tools
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
24
|
+
Requires-Python: >=3.8
|
|
25
|
+
Requires-Dist: httpx>=0.24.0
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
# slop-mcp
|
|
29
|
+
|
|
30
|
+
A Model Context Protocol (MCP) server that orchestrates multiple MCP servers, providing progressive tool discovery and efficient context management.
|
|
31
|
+
|
|
32
|
+
## The Problem
|
|
33
|
+
|
|
34
|
+
As described in Anthropic's article [Code Execution with MCP](https://www.anthropic.com/engineering/code-execution-with-mcp), current MCP implementations face two critical challenges:
|
|
35
|
+
|
|
36
|
+
1. **Context Window Overload**: When agents connect to many tools, loading all tool definitions upfront consumes excessive tokens. With thousands of connected tools, agents must process hundreds of thousands of tokens before even reading user requests.
|
|
37
|
+
|
|
38
|
+
2. **Intermediate Result Duplication**: Tool outputs repeatedly flow through the model's context. Transferring large documents between services forces the same data through the model between operations, potentially doubling token consumption.
|
|
39
|
+
|
|
40
|
+
The article proposes code execution within MCP as a solution—letting agents discover tools progressively and process data within the execution environment rather than shuttling everything through context.
|
|
41
|
+
|
|
42
|
+
## How slop-mcp Addresses These Issues
|
|
43
|
+
|
|
44
|
+
slop-mcp takes a different but complementary approach: instead of code execution, it provides an **orchestration layer** that aggregates multiple MCP servers while maintaining context efficiency.
|
|
45
|
+
|
|
46
|
+
### Progressive Tool Discovery
|
|
47
|
+
|
|
48
|
+
Rather than loading all tool definitions upfront, slop-mcp exposes just 5 meta-tools:
|
|
49
|
+
|
|
50
|
+
| Tool | Purpose |
|
|
51
|
+
|------|---------|
|
|
52
|
+
| `search_tools` | Find tools across all connected MCPs by name or description |
|
|
53
|
+
| `execute_tool` | Execute a specific tool on a specific MCP |
|
|
54
|
+
| `run_slop` | Execute SLOP scripts with access to all MCPs |
|
|
55
|
+
| `manage_mcps` | Register/unregister MCPs at runtime |
|
|
56
|
+
| `auth_mcp` | Handle OAuth authentication for MCPs that require it |
|
|
57
|
+
|
|
58
|
+
This means an agent connecting to slop-mcp sees **5 tool definitions** regardless of how many MCPs are connected or how many tools they expose. The agent discovers tools on-demand via `search_tools` and executes them via `execute_tool`.
|
|
59
|
+
|
|
60
|
+
### Lazy Connection & Async Startup
|
|
61
|
+
|
|
62
|
+
MCP servers connect asynchronously in the background:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
Server starts → Immediately ready to serve
|
|
66
|
+
↓ (background)
|
|
67
|
+
MCP #1 connecting...
|
|
68
|
+
MCP #2 connecting...
|
|
69
|
+
MCP #N connecting...
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
The server doesn't block waiting for all MCPs to connect. Tools become available progressively as their MCPs come online.
|
|
73
|
+
|
|
74
|
+
### In-Environment Script Execution
|
|
75
|
+
|
|
76
|
+
The `run_slop` tool allows executing structured scripts that can:
|
|
77
|
+
- Call multiple tools across different MCPs
|
|
78
|
+
- Process intermediate results without sending them back through the model
|
|
79
|
+
- Chain operations efficiently
|
|
80
|
+
|
|
81
|
+
This keeps large intermediate data within the execution environment, addressing the token duplication problem.
|
|
82
|
+
|
|
83
|
+
### Efficient Tool Index
|
|
84
|
+
|
|
85
|
+
Tools are indexed locally when MCPs connect:
|
|
86
|
+
- Fuzzy search by name or description
|
|
87
|
+
- Filter by MCP name
|
|
88
|
+
- No network calls during search
|
|
89
|
+
- Thread-safe concurrent access
|
|
90
|
+
|
|
91
|
+
## Architecture
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
┌─────────────────────────────────────────────────────┐
|
|
95
|
+
│ slop-mcp Server │
|
|
96
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
97
|
+
│ │ 5 Meta-Tools (constant context cost) │ │
|
|
98
|
+
│ │ • search_tools • execute_tool │ │
|
|
99
|
+
│ │ • run_slop • manage_mcps │ │
|
|
100
|
+
│ │ • auth_mcp │ │
|
|
101
|
+
│ └───────────────────────────────────────────────┘ │
|
|
102
|
+
│ │ │
|
|
103
|
+
│ ┌────────────────┼────────────────┐ │
|
|
104
|
+
│ ▼ ▼ ▼ │
|
|
105
|
+
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
|
|
106
|
+
│ │ Registry │ │ Tool Index │ │ Auth │ │
|
|
107
|
+
│ │ (async) │ │ (local) │ │ (OAuth) │ │
|
|
108
|
+
│ └─────┬──────┘ └────────────┘ └────────────┘ │
|
|
109
|
+
└────────┼────────────────────────────────────────────┘
|
|
110
|
+
│
|
|
111
|
+
┌────┼────┬─────────────┐
|
|
112
|
+
▼ ▼ ▼ ▼
|
|
113
|
+
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
|
|
114
|
+
│MCP #1│ │MCP #2│ │MCP #3│ │MCP #N│
|
|
115
|
+
│stdio │ │ SSE │ │ HTTP │ │ ... │
|
|
116
|
+
└──────┘ └──────┘ └──────┘ └──────┘
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Configuration
|
|
120
|
+
|
|
121
|
+
slop-mcp uses KDL configuration with three-tier scoping:
|
|
122
|
+
|
|
123
|
+
| Scope | File | Purpose |
|
|
124
|
+
|-------|------|---------|
|
|
125
|
+
| User | `~/.config/slop-mcp/config.kdl` | Cross-project defaults |
|
|
126
|
+
| Project | `.slop-mcp.kdl` | Git-tracked project config |
|
|
127
|
+
| Local | `.slop-mcp.local.kdl` | Git-ignored secrets |
|
|
128
|
+
|
|
129
|
+
Example configuration:
|
|
130
|
+
|
|
131
|
+
```kdl
|
|
132
|
+
mcp "filesystem" {
|
|
133
|
+
command "npx" "-y" "@anthropic/mcp-filesystem"
|
|
134
|
+
args "/path/to/allowed/dir"
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
mcp "github" {
|
|
138
|
+
transport "sse"
|
|
139
|
+
url "https://mcp.github.com/sse"
|
|
140
|
+
// OAuth handled automatically via auth_mcp tool
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Import existing configurations:
|
|
145
|
+
|
|
146
|
+
```kdl
|
|
147
|
+
import "claude-desktop" // Import from Claude Desktop config
|
|
148
|
+
import "claude-code" // Import from Claude Code settings
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Quick Start
|
|
152
|
+
|
|
153
|
+
### npm
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
npx @standardbeagle/slop-mcp
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### PyPI
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
uvx slop-mcp
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Or install globally:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# npm
|
|
169
|
+
npm install -g @standardbeagle/slop-mcp
|
|
170
|
+
|
|
171
|
+
# pip
|
|
172
|
+
pip install slop-mcp
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### From Source
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
go install github.com/standardbeagle/slop-mcp/cmd/slop-mcp@latest
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Usage
|
|
182
|
+
|
|
183
|
+
### As an MCP Server (stdio)
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
slop-mcp serve
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### With HTTP/SSE Transport
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
slop-mcp serve --transport http --port 8080
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Claude Desktop Configuration
|
|
196
|
+
|
|
197
|
+
Add to your Claude Desktop config:
|
|
198
|
+
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"mcpServers": {
|
|
202
|
+
"slop": {
|
|
203
|
+
"command": "slop-mcp",
|
|
204
|
+
"args": ["serve"]
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Comparison with Code Execution Approach
|
|
211
|
+
|
|
212
|
+
| Aspect | Code Execution (Article) | slop-mcp |
|
|
213
|
+
|--------|-------------------------|----------|
|
|
214
|
+
| Tool Discovery | Filesystem exploration | `search_tools` with fuzzy matching |
|
|
215
|
+
| Context Cost | Minimal (code interpreter) | Constant (5 meta-tools) |
|
|
216
|
+
| Data Processing | In-sandbox code | SLOP scripts via `run_slop` |
|
|
217
|
+
| Infrastructure | Secure sandbox required | Standard MCP servers |
|
|
218
|
+
| Flexibility | Full code execution | Structured tool orchestration |
|
|
219
|
+
|
|
220
|
+
Both approaches solve the same core problems. Code execution offers maximum flexibility but requires sandboxing infrastructure. slop-mcp provides a simpler deployment model while still achieving significant context efficiency gains.
|
|
221
|
+
|
|
222
|
+
## Related Projects
|
|
223
|
+
|
|
224
|
+
- [standardbeagle-tools](https://github.com/standardbeagle/standardbeagle-tools) - Claude Code plugin for slop-mcp integration
|
|
225
|
+
|
|
226
|
+
## License
|
|
227
|
+
|
|
228
|
+
MIT
|
slop_mcp-0.1.1/README.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# slop-mcp
|
|
2
|
+
|
|
3
|
+
A Model Context Protocol (MCP) server that orchestrates multiple MCP servers, providing progressive tool discovery and efficient context management.
|
|
4
|
+
|
|
5
|
+
## The Problem
|
|
6
|
+
|
|
7
|
+
As described in Anthropic's article [Code Execution with MCP](https://www.anthropic.com/engineering/code-execution-with-mcp), current MCP implementations face two critical challenges:
|
|
8
|
+
|
|
9
|
+
1. **Context Window Overload**: When agents connect to many tools, loading all tool definitions upfront consumes excessive tokens. With thousands of connected tools, agents must process hundreds of thousands of tokens before even reading user requests.
|
|
10
|
+
|
|
11
|
+
2. **Intermediate Result Duplication**: Tool outputs repeatedly flow through the model's context. Transferring large documents between services forces the same data through the model between operations, potentially doubling token consumption.
|
|
12
|
+
|
|
13
|
+
The article proposes code execution within MCP as a solution—letting agents discover tools progressively and process data within the execution environment rather than shuttling everything through context.
|
|
14
|
+
|
|
15
|
+
## How slop-mcp Addresses These Issues
|
|
16
|
+
|
|
17
|
+
slop-mcp takes a different but complementary approach: instead of code execution, it provides an **orchestration layer** that aggregates multiple MCP servers while maintaining context efficiency.
|
|
18
|
+
|
|
19
|
+
### Progressive Tool Discovery
|
|
20
|
+
|
|
21
|
+
Rather than loading all tool definitions upfront, slop-mcp exposes just 5 meta-tools:
|
|
22
|
+
|
|
23
|
+
| Tool | Purpose |
|
|
24
|
+
|------|---------|
|
|
25
|
+
| `search_tools` | Find tools across all connected MCPs by name or description |
|
|
26
|
+
| `execute_tool` | Execute a specific tool on a specific MCP |
|
|
27
|
+
| `run_slop` | Execute SLOP scripts with access to all MCPs |
|
|
28
|
+
| `manage_mcps` | Register/unregister MCPs at runtime |
|
|
29
|
+
| `auth_mcp` | Handle OAuth authentication for MCPs that require it |
|
|
30
|
+
|
|
31
|
+
This means an agent connecting to slop-mcp sees **5 tool definitions** regardless of how many MCPs are connected or how many tools they expose. The agent discovers tools on-demand via `search_tools` and executes them via `execute_tool`.
|
|
32
|
+
|
|
33
|
+
### Lazy Connection & Async Startup
|
|
34
|
+
|
|
35
|
+
MCP servers connect asynchronously in the background:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
Server starts → Immediately ready to serve
|
|
39
|
+
↓ (background)
|
|
40
|
+
MCP #1 connecting...
|
|
41
|
+
MCP #2 connecting...
|
|
42
|
+
MCP #N connecting...
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The server doesn't block waiting for all MCPs to connect. Tools become available progressively as their MCPs come online.
|
|
46
|
+
|
|
47
|
+
### In-Environment Script Execution
|
|
48
|
+
|
|
49
|
+
The `run_slop` tool allows executing structured scripts that can:
|
|
50
|
+
- Call multiple tools across different MCPs
|
|
51
|
+
- Process intermediate results without sending them back through the model
|
|
52
|
+
- Chain operations efficiently
|
|
53
|
+
|
|
54
|
+
This keeps large intermediate data within the execution environment, addressing the token duplication problem.
|
|
55
|
+
|
|
56
|
+
### Efficient Tool Index
|
|
57
|
+
|
|
58
|
+
Tools are indexed locally when MCPs connect:
|
|
59
|
+
- Fuzzy search by name or description
|
|
60
|
+
- Filter by MCP name
|
|
61
|
+
- No network calls during search
|
|
62
|
+
- Thread-safe concurrent access
|
|
63
|
+
|
|
64
|
+
## Architecture
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
┌─────────────────────────────────────────────────────┐
|
|
68
|
+
│ slop-mcp Server │
|
|
69
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
70
|
+
│ │ 5 Meta-Tools (constant context cost) │ │
|
|
71
|
+
│ │ • search_tools • execute_tool │ │
|
|
72
|
+
│ │ • run_slop • manage_mcps │ │
|
|
73
|
+
│ │ • auth_mcp │ │
|
|
74
|
+
│ └───────────────────────────────────────────────┘ │
|
|
75
|
+
│ │ │
|
|
76
|
+
│ ┌────────────────┼────────────────┐ │
|
|
77
|
+
│ ▼ ▼ ▼ │
|
|
78
|
+
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
|
|
79
|
+
│ │ Registry │ │ Tool Index │ │ Auth │ │
|
|
80
|
+
│ │ (async) │ │ (local) │ │ (OAuth) │ │
|
|
81
|
+
│ └─────┬──────┘ └────────────┘ └────────────┘ │
|
|
82
|
+
└────────┼────────────────────────────────────────────┘
|
|
83
|
+
│
|
|
84
|
+
┌────┼────┬─────────────┐
|
|
85
|
+
▼ ▼ ▼ ▼
|
|
86
|
+
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
|
|
87
|
+
│MCP #1│ │MCP #2│ │MCP #3│ │MCP #N│
|
|
88
|
+
│stdio │ │ SSE │ │ HTTP │ │ ... │
|
|
89
|
+
└──────┘ └──────┘ └──────┘ └──────┘
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Configuration
|
|
93
|
+
|
|
94
|
+
slop-mcp uses KDL configuration with three-tier scoping:
|
|
95
|
+
|
|
96
|
+
| Scope | File | Purpose |
|
|
97
|
+
|-------|------|---------|
|
|
98
|
+
| User | `~/.config/slop-mcp/config.kdl` | Cross-project defaults |
|
|
99
|
+
| Project | `.slop-mcp.kdl` | Git-tracked project config |
|
|
100
|
+
| Local | `.slop-mcp.local.kdl` | Git-ignored secrets |
|
|
101
|
+
|
|
102
|
+
Example configuration:
|
|
103
|
+
|
|
104
|
+
```kdl
|
|
105
|
+
mcp "filesystem" {
|
|
106
|
+
command "npx" "-y" "@anthropic/mcp-filesystem"
|
|
107
|
+
args "/path/to/allowed/dir"
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
mcp "github" {
|
|
111
|
+
transport "sse"
|
|
112
|
+
url "https://mcp.github.com/sse"
|
|
113
|
+
// OAuth handled automatically via auth_mcp tool
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Import existing configurations:
|
|
118
|
+
|
|
119
|
+
```kdl
|
|
120
|
+
import "claude-desktop" // Import from Claude Desktop config
|
|
121
|
+
import "claude-code" // Import from Claude Code settings
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Quick Start
|
|
125
|
+
|
|
126
|
+
### npm
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
npx @standardbeagle/slop-mcp
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### PyPI
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
uvx slop-mcp
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Or install globally:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# npm
|
|
142
|
+
npm install -g @standardbeagle/slop-mcp
|
|
143
|
+
|
|
144
|
+
# pip
|
|
145
|
+
pip install slop-mcp
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### From Source
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
go install github.com/standardbeagle/slop-mcp/cmd/slop-mcp@latest
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Usage
|
|
155
|
+
|
|
156
|
+
### As an MCP Server (stdio)
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
slop-mcp serve
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### With HTTP/SSE Transport
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
slop-mcp serve --transport http --port 8080
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Claude Desktop Configuration
|
|
169
|
+
|
|
170
|
+
Add to your Claude Desktop config:
|
|
171
|
+
|
|
172
|
+
```json
|
|
173
|
+
{
|
|
174
|
+
"mcpServers": {
|
|
175
|
+
"slop": {
|
|
176
|
+
"command": "slop-mcp",
|
|
177
|
+
"args": ["serve"]
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Comparison with Code Execution Approach
|
|
184
|
+
|
|
185
|
+
| Aspect | Code Execution (Article) | slop-mcp |
|
|
186
|
+
|--------|-------------------------|----------|
|
|
187
|
+
| Tool Discovery | Filesystem exploration | `search_tools` with fuzzy matching |
|
|
188
|
+
| Context Cost | Minimal (code interpreter) | Constant (5 meta-tools) |
|
|
189
|
+
| Data Processing | In-sandbox code | SLOP scripts via `run_slop` |
|
|
190
|
+
| Infrastructure | Secure sandbox required | Standard MCP servers |
|
|
191
|
+
| Flexibility | Full code execution | Structured tool orchestration |
|
|
192
|
+
|
|
193
|
+
Both approaches solve the same core problems. Code execution offers maximum flexibility but requires sandboxing infrastructure. slop-mcp provides a simpler deployment model while still achieving significant context efficiency gains.
|
|
194
|
+
|
|
195
|
+
## Related Projects
|
|
196
|
+
|
|
197
|
+
- [standardbeagle-tools](https://github.com/standardbeagle/standardbeagle-tools) - Claude Code plugin for slop-mcp integration
|
|
198
|
+
|
|
199
|
+
## License
|
|
200
|
+
|
|
201
|
+
MIT
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "slop-mcp"
|
|
7
|
+
version = "0.1.1"
|
|
8
|
+
description = "MCP server for orchestrating multiple MCP servers with progressive tool discovery"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
requires-python = ">=3.8"
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "StandardBeagle", email = "dev@standardbeagle.com" }
|
|
14
|
+
]
|
|
15
|
+
keywords = ["mcp", "model-context-protocol", "ai", "llm", "tools"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 4 - Beta",
|
|
18
|
+
"Environment :: Console",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"License :: OSI Approved :: MIT License",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Programming Language :: Python :: 3.8",
|
|
24
|
+
"Programming Language :: Python :: 3.9",
|
|
25
|
+
"Programming Language :: Python :: 3.10",
|
|
26
|
+
"Programming Language :: Python :: 3.11",
|
|
27
|
+
"Programming Language :: Python :: 3.12",
|
|
28
|
+
"Topic :: Software Development :: Libraries",
|
|
29
|
+
]
|
|
30
|
+
dependencies = [
|
|
31
|
+
"httpx>=0.24.0",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[project.urls]
|
|
35
|
+
Homepage = "https://github.com/standardbeagle/slop-mcp"
|
|
36
|
+
Repository = "https://github.com/standardbeagle/slop-mcp"
|
|
37
|
+
Issues = "https://github.com/standardbeagle/slop-mcp/issues"
|
|
38
|
+
|
|
39
|
+
[project.scripts]
|
|
40
|
+
slop-mcp = "slop_mcp:main"
|
|
41
|
+
|
|
42
|
+
[tool.hatch.build.targets.wheel]
|
|
43
|
+
packages = ["src/slop_mcp"]
|
|
44
|
+
|
|
45
|
+
[tool.hatch.build.targets.sdist]
|
|
46
|
+
include = [
|
|
47
|
+
"/src",
|
|
48
|
+
"/README.md",
|
|
49
|
+
"/LICENSE",
|
|
50
|
+
]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""slop-mcp: MCP server for orchestrating multiple MCP servers."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import platform
|
|
5
|
+
import stat
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import httpx
|
|
11
|
+
|
|
12
|
+
__version__ = "0.0.0"
|
|
13
|
+
|
|
14
|
+
REPO = "standardbeagle/slop-mcp"
|
|
15
|
+
BINARY_NAME = "slop-mcp"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_platform_info() -> tuple[str, str]:
|
|
19
|
+
"""Get the current platform and architecture."""
|
|
20
|
+
system = platform.system().lower()
|
|
21
|
+
machine = platform.machine().lower()
|
|
22
|
+
|
|
23
|
+
if system == "darwin":
|
|
24
|
+
goos = "darwin"
|
|
25
|
+
elif system == "linux":
|
|
26
|
+
goos = "linux"
|
|
27
|
+
elif system == "windows":
|
|
28
|
+
goos = "windows"
|
|
29
|
+
else:
|
|
30
|
+
raise RuntimeError(f"Unsupported platform: {system}")
|
|
31
|
+
|
|
32
|
+
if machine in ("x86_64", "amd64"):
|
|
33
|
+
goarch = "amd64"
|
|
34
|
+
elif machine in ("arm64", "aarch64"):
|
|
35
|
+
goarch = "arm64"
|
|
36
|
+
else:
|
|
37
|
+
raise RuntimeError(f"Unsupported architecture: {machine}")
|
|
38
|
+
|
|
39
|
+
return goos, goarch
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def get_binary_path() -> Path:
|
|
43
|
+
"""Get the path where the binary should be stored."""
|
|
44
|
+
cache_dir = Path.home() / ".cache" / "slop-mcp"
|
|
45
|
+
cache_dir.mkdir(parents=True, exist_ok=True)
|
|
46
|
+
|
|
47
|
+
goos, goarch = get_platform_info()
|
|
48
|
+
ext = ".exe" if goos == "windows" else ""
|
|
49
|
+
|
|
50
|
+
return cache_dir / f"{BINARY_NAME}-{__version__}-{goos}-{goarch}{ext}"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def get_download_url() -> str:
|
|
54
|
+
"""Get the download URL for the current platform."""
|
|
55
|
+
goos, goarch = get_platform_info()
|
|
56
|
+
ext = ".exe" if goos == "windows" else ""
|
|
57
|
+
|
|
58
|
+
version = __version__
|
|
59
|
+
if not version.startswith("v"):
|
|
60
|
+
version = f"v{version}"
|
|
61
|
+
|
|
62
|
+
return f"https://github.com/{REPO}/releases/download/{version}/{BINARY_NAME}-{goos}-{goarch}{ext}"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def download_binary(dest: Path) -> None:
|
|
66
|
+
"""Download the binary for the current platform."""
|
|
67
|
+
url = get_download_url()
|
|
68
|
+
|
|
69
|
+
with httpx.Client(follow_redirects=True, timeout=60.0) as client:
|
|
70
|
+
response = client.get(url)
|
|
71
|
+
response.raise_for_status()
|
|
72
|
+
|
|
73
|
+
dest.write_bytes(response.content)
|
|
74
|
+
|
|
75
|
+
# Make executable on Unix
|
|
76
|
+
if platform.system() != "Windows":
|
|
77
|
+
dest.chmod(dest.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def ensure_binary() -> Path:
|
|
81
|
+
"""Ensure the binary exists, downloading if necessary."""
|
|
82
|
+
binary_path = get_binary_path()
|
|
83
|
+
|
|
84
|
+
if not binary_path.exists():
|
|
85
|
+
download_binary(binary_path)
|
|
86
|
+
|
|
87
|
+
return binary_path
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def main() -> int:
|
|
91
|
+
"""Run the slop-mcp binary with the given arguments."""
|
|
92
|
+
try:
|
|
93
|
+
binary_path = ensure_binary()
|
|
94
|
+
except Exception as e:
|
|
95
|
+
print(f"Error downloading slop-mcp binary: {e}", file=sys.stderr)
|
|
96
|
+
return 1
|
|
97
|
+
|
|
98
|
+
result = subprocess.run([str(binary_path)] + sys.argv[1:])
|
|
99
|
+
return result.returncode
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
if __name__ == "__main__":
|
|
103
|
+
sys.exit(main())
|