second-opinion-mcp 0.3.3__tar.gz → 0.3.5__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.
Files changed (20) hide show
  1. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/PKG-INFO +34 -13
  2. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/README.md +33 -12
  3. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/pyproject.toml +1 -1
  4. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/src/second_opinion_mcp/__init__.py +1 -1
  5. second_opinion_mcp-0.3.5/src/second_opinion_mcp/cli.py +742 -0
  6. second_opinion_mcp-0.3.3/src/second_opinion_mcp/cli.py +0 -465
  7. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/.gitignore +0 -0
  8. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/LICENSE +0 -0
  9. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/src/second_opinion_mcp/__main__.py +0 -0
  10. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/src/second_opinion_mcp/server.py +0 -0
  11. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/__init__.py +0 -0
  12. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/conftest.py +0 -0
  13. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/test_configuration.py +0 -0
  14. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/test_connection_pool.py +0 -0
  15. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/test_error_isolation.py +0 -0
  16. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/test_input_validation.py +0 -0
  17. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/test_keyring_security.py +0 -0
  18. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/test_path_security.py +0 -0
  19. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/tests/test_rate_limiting.py +0 -0
  20. {second_opinion_mcp-0.3.3 → second_opinion_mcp-0.3.5}/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
3
+ Version: 0.3.5
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
@@ -229,23 +229,26 @@ To update keys:
229
229
  second-opinion-mcp setup
230
230
  ```
231
231
 
232
- Or manually set each provider's key:
232
+ Or manually set each provider's key using the pipx environment Python:
233
233
 
234
234
  ```bash
235
+ # Use the pipx venv Python (required for pipx installations)
236
+ SOPYTHON=~/.local/share/pipx/venvs/second-opinion-mcp/bin/python3
237
+
235
238
  # DeepSeek (key starts with sk-)
236
- python -c "import keyring; keyring.set_password('second-opinion', 'deepseek', 'sk-YOUR_DEEPSEEK_KEY')"
239
+ $SOPYTHON -c "import keyring; keyring.set_password('second-opinion', 'deepseek', 'sk-YOUR_DEEPSEEK_KEY')"
237
240
 
238
241
  # Moonshot/Kimi
239
- python -c "import keyring; keyring.set_password('second-opinion', 'moonshot', 'YOUR_MOONSHOT_KEY')"
242
+ $SOPYTHON -c "import keyring; keyring.set_password('second-opinion', 'moonshot', 'YOUR_MOONSHOT_KEY')"
240
243
 
241
244
  # OpenRouter (key starts with sk-or-)
242
- python -c "import keyring; keyring.set_password('second-opinion', 'openrouter', 'sk-or-YOUR_OPENROUTER_KEY')"
245
+ $SOPYTHON -c "import keyring; keyring.set_password('second-opinion', 'openrouter', 'sk-or-YOUR_OPENROUTER_KEY')"
243
246
  ```
244
247
 
245
248
  Verify keys are configured:
246
249
 
247
250
  ```bash
248
- python -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')))"
251
+ $SOPYTHON -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')))"
249
252
  ```
250
253
 
251
254
  ### Claude Desktop Configuration
@@ -268,6 +271,15 @@ For Claude Desktop (the standalone app), add to `claude_desktop_config.json`:
268
271
  }
269
272
  ```
270
273
 
274
+ ### OpenClaw / Other MCP Clients
275
+
276
+ For OpenClaw or other MCP-compatible clients, add the server with these settings:
277
+
278
+ - Server command: `second-opinion-mcp`
279
+ - Environment variable: `SECOND_OPINION_PROVIDERS=deepseek,moonshot`
280
+
281
+ The setup wizard (`second-opinion-mcp setup`) will show specific instructions for your chosen client.
282
+
271
283
  ## Troubleshooting
272
284
 
273
285
  ### "No API key configured" Error
@@ -283,11 +295,19 @@ second-opinion-mcp setup
283
295
  Linux without a desktop environment needs a keyring backend configured:
284
296
 
285
297
  ```bash
286
- pip install keyrings.alt
298
+ # Install keyrings.alt into the pipx environment
299
+ pipx inject second-opinion-mcp keyrings.alt
300
+
301
+ # Create the keyring config
287
302
  mkdir -p ~/.local/share/python_keyring
288
- echo -e "[backend]\ndefault-keyring=keyrings.alt.file.EncryptedKeyring" > ~/.local/share/python_keyring/keyringrc.cfg
303
+ cat > ~/.local/share/python_keyring/keyringrc.cfg << 'EOF'
304
+ [backend]
305
+ default-keyring=keyrings.alt.file.EncryptedKeyring
306
+ EOF
289
307
  ```
290
308
 
309
+ Then run `second-opinion-mcp setup` again.
310
+
291
311
  ### Connection Timeout
292
312
 
293
313
  Check firewall, VPN, or proxy settings. Both DeepSeek (api.deepseek.com) and Moonshot (api.moonshot.ai) must be accessible.
@@ -367,13 +387,14 @@ Your API keys are preserved in the system keyring across updates.
367
387
  # Remove from Claude
368
388
  claude mcp remove second-opinion
369
389
 
390
+ # Optional: remove stored API keys BEFORE uninstalling (requires pipx venv Python)
391
+ SOPYTHON=~/.local/share/pipx/venvs/second-opinion-mcp/bin/python3
392
+ $SOPYTHON -c "import keyring; keyring.delete_password('second-opinion', 'deepseek')"
393
+ $SOPYTHON -c "import keyring; keyring.delete_password('second-opinion', 'moonshot')"
394
+ $SOPYTHON -c "import keyring; keyring.delete_password('second-opinion', 'openrouter')"
395
+
370
396
  # Uninstall package
371
397
  pipx uninstall second-opinion-mcp
372
-
373
- # Optional: remove stored API keys
374
- python -c "import keyring; keyring.delete_password('second-opinion', 'deepseek')"
375
- python -c "import keyring; keyring.delete_password('second-opinion', 'moonshot')"
376
- python -c "import keyring; keyring.delete_password('second-opinion', 'openrouter')"
377
398
  ```
378
399
 
379
400
  ## Security
@@ -191,23 +191,26 @@ To update keys:
191
191
  second-opinion-mcp setup
192
192
  ```
193
193
 
194
- Or manually set each provider's key:
194
+ Or manually set each provider's key using the pipx environment Python:
195
195
 
196
196
  ```bash
197
+ # Use the pipx venv Python (required for pipx installations)
198
+ SOPYTHON=~/.local/share/pipx/venvs/second-opinion-mcp/bin/python3
199
+
197
200
  # DeepSeek (key starts with sk-)
198
- python -c "import keyring; keyring.set_password('second-opinion', 'deepseek', 'sk-YOUR_DEEPSEEK_KEY')"
201
+ $SOPYTHON -c "import keyring; keyring.set_password('second-opinion', 'deepseek', 'sk-YOUR_DEEPSEEK_KEY')"
199
202
 
200
203
  # Moonshot/Kimi
201
- python -c "import keyring; keyring.set_password('second-opinion', 'moonshot', 'YOUR_MOONSHOT_KEY')"
204
+ $SOPYTHON -c "import keyring; keyring.set_password('second-opinion', 'moonshot', 'YOUR_MOONSHOT_KEY')"
202
205
 
203
206
  # OpenRouter (key starts with sk-or-)
204
- python -c "import keyring; keyring.set_password('second-opinion', 'openrouter', 'sk-or-YOUR_OPENROUTER_KEY')"
207
+ $SOPYTHON -c "import keyring; keyring.set_password('second-opinion', 'openrouter', 'sk-or-YOUR_OPENROUTER_KEY')"
205
208
  ```
206
209
 
207
210
  Verify keys are configured:
208
211
 
209
212
  ```bash
210
- python -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')))"
213
+ $SOPYTHON -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')))"
211
214
  ```
212
215
 
213
216
  ### Claude Desktop Configuration
@@ -230,6 +233,15 @@ For Claude Desktop (the standalone app), add to `claude_desktop_config.json`:
230
233
  }
231
234
  ```
232
235
 
236
+ ### OpenClaw / Other MCP Clients
237
+
238
+ For OpenClaw or other MCP-compatible clients, add the server with these settings:
239
+
240
+ - Server command: `second-opinion-mcp`
241
+ - Environment variable: `SECOND_OPINION_PROVIDERS=deepseek,moonshot`
242
+
243
+ The setup wizard (`second-opinion-mcp setup`) will show specific instructions for your chosen client.
244
+
233
245
  ## Troubleshooting
234
246
 
235
247
  ### "No API key configured" Error
@@ -245,11 +257,19 @@ second-opinion-mcp setup
245
257
  Linux without a desktop environment needs a keyring backend configured:
246
258
 
247
259
  ```bash
248
- pip install keyrings.alt
260
+ # Install keyrings.alt into the pipx environment
261
+ pipx inject second-opinion-mcp keyrings.alt
262
+
263
+ # Create the keyring config
249
264
  mkdir -p ~/.local/share/python_keyring
250
- echo -e "[backend]\ndefault-keyring=keyrings.alt.file.EncryptedKeyring" > ~/.local/share/python_keyring/keyringrc.cfg
265
+ cat > ~/.local/share/python_keyring/keyringrc.cfg << 'EOF'
266
+ [backend]
267
+ default-keyring=keyrings.alt.file.EncryptedKeyring
268
+ EOF
251
269
  ```
252
270
 
271
+ Then run `second-opinion-mcp setup` again.
272
+
253
273
  ### Connection Timeout
254
274
 
255
275
  Check firewall, VPN, or proxy settings. Both DeepSeek (api.deepseek.com) and Moonshot (api.moonshot.ai) must be accessible.
@@ -329,13 +349,14 @@ Your API keys are preserved in the system keyring across updates.
329
349
  # Remove from Claude
330
350
  claude mcp remove second-opinion
331
351
 
352
+ # Optional: remove stored API keys BEFORE uninstalling (requires pipx venv Python)
353
+ SOPYTHON=~/.local/share/pipx/venvs/second-opinion-mcp/bin/python3
354
+ $SOPYTHON -c "import keyring; keyring.delete_password('second-opinion', 'deepseek')"
355
+ $SOPYTHON -c "import keyring; keyring.delete_password('second-opinion', 'moonshot')"
356
+ $SOPYTHON -c "import keyring; keyring.delete_password('second-opinion', 'openrouter')"
357
+
332
358
  # Uninstall package
333
359
  pipx uninstall second-opinion-mcp
334
-
335
- # Optional: remove stored API keys
336
- python -c "import keyring; keyring.delete_password('second-opinion', 'deepseek')"
337
- python -c "import keyring; keyring.delete_password('second-opinion', 'moonshot')"
338
- python -c "import keyring; keyring.delete_password('second-opinion', 'openrouter')"
339
360
  ```
340
361
 
341
362
  ## Security
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "second-opinion-mcp"
3
- version = "0.3.3"
3
+ version = "0.3.5"
4
4
  description = "Multi-model AI analysis for Claude - get second opinions from DeepSeek, Kimi, and OpenRouter"
5
5
  requires-python = ">=3.10"
6
6
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  """Second Opinion MCP Server - Multi-model AI analysis for Claude."""
2
2
 
3
- __version__ = "0.3.3"
3
+ __version__ = "0.3.5"
4
4
  __author__ = "MarvinFS"
5
5
 
6
6
  from second_opinion_mcp.server import mcp, second_opinion, challenge, code_review, consensus, review_synthesis