second-opinion-mcp 0.3.2__tar.gz → 0.3.4__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.
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/PKG-INFO +69 -5
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/README.md +68 -4
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/pyproject.toml +1 -1
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/src/second_opinion_mcp/__init__.py +1 -1
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/src/second_opinion_mcp/cli.py +2 -2
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/.gitignore +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/LICENSE +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/src/second_opinion_mcp/__main__.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/src/second_opinion_mcp/server.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/__init__.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/conftest.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/test_configuration.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/test_connection_pool.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/test_error_isolation.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/test_input_validation.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/test_keyring_security.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/test_path_security.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/test_rate_limiting.py +0 -0
- {second_opinion_mcp-0.3.2 → second_opinion_mcp-0.3.4}/tests/test_streaming_limits.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: second-opinion-mcp
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: Multi-model AI analysis for Claude - get second opinions from DeepSeek, Kimi, and OpenRouter
|
|
5
5
|
Project-URL: Homepage, https://github.com/MarvinFS/second-opinion-mcp
|
|
6
6
|
Project-URL: Repository, https://github.com/MarvinFS/second-opinion-mcp
|
|
@@ -143,6 +143,56 @@ Full workflow: parallel reviews from both models, debate, then synthesis instruc
|
|
|
143
143
|
Perform a comprehensive code review of ./myproject using review_synthesis
|
|
144
144
|
```
|
|
145
145
|
|
|
146
|
+
## Usage Examples
|
|
147
|
+
|
|
148
|
+
### Thorough Code Review Workflow
|
|
149
|
+
|
|
150
|
+
For comprehensive code reviews, use this prompt pattern with Claude Code:
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
MyProject: perform a comprehensive deep parallel code review with deepseek and kimi
|
|
154
|
+
using mcp server second-opinion - save resulting md files to the project folder
|
|
155
|
+
to the docs subfolder in md format.
|
|
156
|
+
|
|
157
|
+
After that perform Consensus debate + arbiter synthesis using same mcp server tools
|
|
158
|
+
with opus 4.5 compiling a final document for the final review.
|
|
159
|
+
|
|
160
|
+
First 2 tasks can be run in parallel.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
This triggers parallel code_review calls to DeepSeek and Moonshot, then a consensus debate on findings, and finally Claude synthesizes the final review document.
|
|
164
|
+
|
|
165
|
+
### Quick Second Opinion
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
Use second_opinion to review this database schema:
|
|
169
|
+
CREATE TABLE users (
|
|
170
|
+
id SERIAL PRIMARY KEY,
|
|
171
|
+
email VARCHAR(255),
|
|
172
|
+
password VARCHAR(255)
|
|
173
|
+
);
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Critical Challenge
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
Use challenge to critique this proposal: "We should use a global singleton for
|
|
180
|
+
database connections because it's simpler"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Consensus Debate
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
Use consensus to debate: "GraphQL vs REST for our internal microservices API"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Code Review with Focus Areas
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
Use code_review on directory="./src" with focus_areas=["security", "error-handling"]
|
|
193
|
+
and save_to="./docs/reviews"
|
|
194
|
+
```
|
|
195
|
+
|
|
146
196
|
## Configuration
|
|
147
197
|
|
|
148
198
|
### Changing Providers
|
|
@@ -179,10 +229,23 @@ To update keys:
|
|
|
179
229
|
second-opinion-mcp setup
|
|
180
230
|
```
|
|
181
231
|
|
|
182
|
-
Or manually:
|
|
232
|
+
Or manually set each provider's key:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
# DeepSeek (key starts with sk-)
|
|
236
|
+
python3 -c "import keyring; keyring.set_password('second-opinion', 'deepseek', 'sk-YOUR_DEEPSEEK_KEY')"
|
|
237
|
+
|
|
238
|
+
# Moonshot/Kimi
|
|
239
|
+
python3 -c "import keyring; keyring.set_password('second-opinion', 'moonshot', 'YOUR_MOONSHOT_KEY')"
|
|
240
|
+
|
|
241
|
+
# OpenRouter (key starts with sk-or-)
|
|
242
|
+
python3 -c "import keyring; keyring.set_password('second-opinion', 'openrouter', 'sk-or-YOUR_OPENROUTER_KEY')"
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Verify keys are configured:
|
|
183
246
|
|
|
184
247
|
```bash
|
|
185
|
-
|
|
248
|
+
python3 -c "import keyring; print('deepseek:', bool(keyring.get_password('second-opinion', 'deepseek'))); print('moonshot:', bool(keyring.get_password('second-opinion', 'moonshot'))); print('openrouter:', bool(keyring.get_password('second-opinion', 'openrouter')))"
|
|
186
249
|
```
|
|
187
250
|
|
|
188
251
|
### Claude Desktop Configuration
|
|
@@ -308,8 +371,9 @@ claude mcp remove second-opinion
|
|
|
308
371
|
pipx uninstall second-opinion-mcp
|
|
309
372
|
|
|
310
373
|
# Optional: remove stored API keys
|
|
311
|
-
|
|
312
|
-
|
|
374
|
+
python3 -c "import keyring; keyring.delete_password('second-opinion', 'deepseek')"
|
|
375
|
+
python3 -c "import keyring; keyring.delete_password('second-opinion', 'moonshot')"
|
|
376
|
+
python3 -c "import keyring; keyring.delete_password('second-opinion', 'openrouter')"
|
|
313
377
|
```
|
|
314
378
|
|
|
315
379
|
## Security
|
|
@@ -105,6 +105,56 @@ Full workflow: parallel reviews from both models, debate, then synthesis instruc
|
|
|
105
105
|
Perform a comprehensive code review of ./myproject using review_synthesis
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
+
## Usage Examples
|
|
109
|
+
|
|
110
|
+
### Thorough Code Review Workflow
|
|
111
|
+
|
|
112
|
+
For comprehensive code reviews, use this prompt pattern with Claude Code:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
MyProject: perform a comprehensive deep parallel code review with deepseek and kimi
|
|
116
|
+
using mcp server second-opinion - save resulting md files to the project folder
|
|
117
|
+
to the docs subfolder in md format.
|
|
118
|
+
|
|
119
|
+
After that perform Consensus debate + arbiter synthesis using same mcp server tools
|
|
120
|
+
with opus 4.5 compiling a final document for the final review.
|
|
121
|
+
|
|
122
|
+
First 2 tasks can be run in parallel.
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
This triggers parallel code_review calls to DeepSeek and Moonshot, then a consensus debate on findings, and finally Claude synthesizes the final review document.
|
|
126
|
+
|
|
127
|
+
### Quick Second Opinion
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Use second_opinion to review this database schema:
|
|
131
|
+
CREATE TABLE users (
|
|
132
|
+
id SERIAL PRIMARY KEY,
|
|
133
|
+
email VARCHAR(255),
|
|
134
|
+
password VARCHAR(255)
|
|
135
|
+
);
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Critical Challenge
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Use challenge to critique this proposal: "We should use a global singleton for
|
|
142
|
+
database connections because it's simpler"
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Consensus Debate
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
Use consensus to debate: "GraphQL vs REST for our internal microservices API"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Code Review with Focus Areas
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
Use code_review on directory="./src" with focus_areas=["security", "error-handling"]
|
|
155
|
+
and save_to="./docs/reviews"
|
|
156
|
+
```
|
|
157
|
+
|
|
108
158
|
## Configuration
|
|
109
159
|
|
|
110
160
|
### Changing Providers
|
|
@@ -141,10 +191,23 @@ To update keys:
|
|
|
141
191
|
second-opinion-mcp setup
|
|
142
192
|
```
|
|
143
193
|
|
|
144
|
-
Or manually:
|
|
194
|
+
Or manually set each provider's key:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# DeepSeek (key starts with sk-)
|
|
198
|
+
python3 -c "import keyring; keyring.set_password('second-opinion', 'deepseek', 'sk-YOUR_DEEPSEEK_KEY')"
|
|
199
|
+
|
|
200
|
+
# Moonshot/Kimi
|
|
201
|
+
python3 -c "import keyring; keyring.set_password('second-opinion', 'moonshot', 'YOUR_MOONSHOT_KEY')"
|
|
202
|
+
|
|
203
|
+
# OpenRouter (key starts with sk-or-)
|
|
204
|
+
python3 -c "import keyring; keyring.set_password('second-opinion', 'openrouter', 'sk-or-YOUR_OPENROUTER_KEY')"
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Verify keys are configured:
|
|
145
208
|
|
|
146
209
|
```bash
|
|
147
|
-
|
|
210
|
+
python3 -c "import keyring; print('deepseek:', bool(keyring.get_password('second-opinion', 'deepseek'))); print('moonshot:', bool(keyring.get_password('second-opinion', 'moonshot'))); print('openrouter:', bool(keyring.get_password('second-opinion', 'openrouter')))"
|
|
148
211
|
```
|
|
149
212
|
|
|
150
213
|
### Claude Desktop Configuration
|
|
@@ -270,8 +333,9 @@ claude mcp remove second-opinion
|
|
|
270
333
|
pipx uninstall second-opinion-mcp
|
|
271
334
|
|
|
272
335
|
# Optional: remove stored API keys
|
|
273
|
-
|
|
274
|
-
|
|
336
|
+
python3 -c "import keyring; keyring.delete_password('second-opinion', 'deepseek')"
|
|
337
|
+
python3 -c "import keyring; keyring.delete_password('second-opinion', 'moonshot')"
|
|
338
|
+
python3 -c "import keyring; keyring.delete_password('second-opinion', 'openrouter')"
|
|
275
339
|
```
|
|
276
340
|
|
|
277
341
|
## Security
|
|
@@ -149,12 +149,12 @@ def print_manual_setup_instructions(providers: list[str] | None = None):
|
|
|
149
149
|
for provider in target_providers:
|
|
150
150
|
config = PROVIDERS[provider]
|
|
151
151
|
print(f" # {config['name']} - Get key at {config['key_hint']}")
|
|
152
|
-
print(f"
|
|
152
|
+
print(f" python3 -c \"import keyring; keyring.set_password('{config['keyring_service']}', '{config['keyring_name']}', 'YOUR_API_KEY')\"")
|
|
153
153
|
print()
|
|
154
154
|
|
|
155
155
|
print("To verify your keys are stored:")
|
|
156
156
|
print()
|
|
157
|
-
print("
|
|
157
|
+
print(" python3 -c \"import keyring; print('deepseek:', bool(keyring.get_password('second-opinion', 'deepseek'))); print('moonshot:', bool(keyring.get_password('second-opinion', 'moonshot')))\"")
|
|
158
158
|
print()
|
|
159
159
|
print("After configuring keys, register with Claude Code:")
|
|
160
160
|
print()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|