kitsune-mcp 0.8.3 → 0.9.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.
Files changed (2) hide show
  1. package/README.md +24 -7
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -8,6 +8,7 @@
8
8
  [![PyPI](https://img.shields.io/pypi/v/kitsune-mcp?color=blue)](https://pypi.org/project/kitsune-mcp/)
9
9
  [![Python](https://img.shields.io/pypi/pyversions/kitsune-mcp)](https://pypi.org/project/kitsune-mcp/)
10
10
  [![CI](https://github.com/kaiser-data/kitsune-mcp/actions/workflows/test.yml/badge.svg)](https://github.com/kaiser-data/kitsune-mcp/actions)
11
+ [![Coverage](https://codecov.io/gh/kaiser-data/kitsune-mcp/branch/main/graph/badge.svg)](https://codecov.io/gh/kaiser-data/kitsune-mcp)
11
12
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
12
13
  [![Smithery](https://smithery.ai/badge/@kaiser-data/kitsune-mcp)](https://smithery.ai/server/@kaiser-data/kitsune-mcp)
13
14
  [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/EYgcf7EX)
@@ -262,6 +263,8 @@ Every `shapeshift()`, `call()`, and `connect()` result shows where the server co
262
263
  | Medium | `mcpregistry`, `glama`, `smithery` | `✓ Source: smithery` |
263
264
  | Community | `npm`, `pypi`, `github` | `⚠️ Source: npm (community — not verified)` |
264
265
 
266
+ Community servers and `source="local"` installs require `confirm=True` — you're explicitly acknowledging you've reviewed the server before running arbitrary code. To bypass this for servers you already trust, set `KITSUNE_TRUST=community` (via `key("KITSUNE_TRUST", "community")` or your `.env`). This persists across sessions so power users and agents never see the gate again.
267
+
265
268
  ### Install command validation
266
269
 
267
270
  Before spawning any subprocess, Kitsune MCP validates the executable name:
@@ -322,7 +325,7 @@ call("create_issue", arguments={"owner": "…", "repo": "…", "title": "…"})
322
325
  Kitsune MCP re-reads `.env` on every call — which means adding a key instantly activates it. That convenience comes with a responsibility: **`.env` is the single place all your API keys live**. A few practices worth following:
323
326
 
324
327
  - Add `.env` to `.gitignore` — never commit real keys
325
- - Use project-level `.env` for project-specific keys; `~/.chameleon/.env` for personal global keys
328
+ - Use project-level `.env` for project-specific keys; `~/.kitsune/.env` for personal global keys
326
329
  - Prefer minimal OAuth scopes and fine-grained tokens (e.g. GitHub fine-grained tokens with per-repo permissions)
327
330
  - Rotate keys that get exposed; Kitsune MCP picks up the new value immediately without restart
328
331
 
@@ -334,7 +337,7 @@ Kitsune MCP re-reads `.env` on every call — which means adding a key instantly
334
337
 
335
338
  **"What about MCP Inspector?"** — MCP Inspector is a standalone web UI that connects to one server and lets you inspect schemas and call tools manually. It's useful for basic debugging but isolated from real AI workflows. Kitsune MCP tests servers inside actual Claude or Cursor sessions — how an AI really uses them. It adds `test()` scoring, `bench()` latency numbers, side-by-side server comparison, and `craft()` for live endpoint prototyping. It also discovers and installs servers on demand; Inspector requires you to already have one running.
336
339
 
337
- **"What about `mcp-dynamic-proxy`?"** — It hides tools behind `call_tool("brave", "web_search", {...})` — always a wrapper. After `receive("mcp-server-brave-search")`, Kitsune MCP gives you a real native `brave_web_search` with the actual schema. It also can't discover or install packages at runtime.
340
+ **"What about `mcp-dynamic-proxy`?"** — It hides tools behind `call_tool("brave", "web_search", {...})` — always a wrapper. After `shapeshift("mcp-server-brave-search")`, Kitsune MCP gives you a real native `brave_web_search` with the actual schema. It also can't discover or install packages at runtime.
338
341
 
339
342
  **"Can FastMCP do this natively?"**
340
343
 
@@ -380,7 +383,7 @@ Get a free key at [smithery.ai/account/api-keys](https://smithery.ai/account/api
380
383
  **Frictionless credentials** — Kitsune MCP re-reads `.env` on every `inspect()`, `shapeshift()`, and `call()`. Add a key mid-session and it takes effect immediately — no restart:
381
384
 
382
385
  ```
383
- # .env (CWD, ~/.env, or ~/.chameleon/.env — all checked, CWD wins)
386
+ # .env (CWD, ~/.env, or ~/.kitsune/.env — all checked, CWD wins)
384
387
  BRAVE_API_KEY=your-key
385
388
  GITHUB_TOKEN=ghp_...
386
389
  ```
@@ -399,8 +402,8 @@ key("BRAVE_API_KEY", "your-key") # writes to .env, active immediately
399
402
 
400
403
  | Tool | Description |
401
404
  |---|---|
402
- | `shapeshift(server_id, tools)` | Load a server's tools live. `tools=[...]` for lean shapeshift. |
403
- | `shiftback(kill)` | Remove shapeshifted tools. `kill=True` terminates the process immediately. |
405
+ | `shapeshift(server_id, tools, source, confirm)` | Load a server's tools live. `tools=[...]` for lean load. `source="local"` forces npx/uvx install; `source="smithery"` forces HTTP. |
406
+ | `shiftback(kill, uninstall)` | Remove shapeshifted tools. `kill=True` terminates the process. `uninstall=True` also removes a locally installed package. |
404
407
  | `search(query, registry)` | Search MCP servers across registries. |
405
408
  | `inspect(server_id)` | Show tools, schemas, and live credential status (✓/✗ per key). |
406
409
  | `call(tool_name, server_id, args)` | Call a tool. `server_id` optional when shapeshifted — current form used. |
@@ -491,6 +494,16 @@ call("brave_web_search", arguments={"query": "MCP protocol 2025"})
491
494
  shiftback()
492
495
  ```
493
496
 
497
+ ### Local install — no API key needed
498
+
499
+ ```
500
+ # Force local install via npx/uvx — no Smithery key required
501
+ shapeshift("brave", source="local", confirm=True)
502
+ # → spawns npx locally, tools appear natively
503
+ call("brave_web_search", arguments={"query": "MCP 2026"})
504
+ shiftback(uninstall=True) # remove tools AND uninstall the package
505
+ ```
506
+
494
507
  ### Persistent server with setup guidance
495
508
 
496
509
  ```
@@ -508,13 +521,17 @@ shiftback(kill=True) # terminates process, frees RAM
508
521
  ## Installation
509
522
 
510
523
  ```bash
511
- pip install kitsune-mcp # from PyPI
524
+ uvx kitsune-mcp # recommended — uv manages the env automatically
525
+ # or
526
+ pip install kitsune-mcp # classic pip
512
527
  # or
513
- git clone https://github.com/kaiser-data/kitsune-mcp && pip install -e .
528
+ npx kitsune-mcp # if you prefer npm (delegates to uvx internally)
514
529
  ```
515
530
 
516
531
  **Requirements:** Python 3.12+ · `node`/`npx` (for npm servers) · `uvx` from [uv](https://github.com/astral-sh/uv) (for pip servers)
517
532
 
533
+ > **Tip:** `uvx kitsune-mcp` is the easiest way — uv installs into an isolated env automatically. No venv setup needed.
534
+
518
535
  ---
519
536
 
520
537
  ## Contributing
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kitsune-mcp",
3
- "version": "0.8.3",
3
+ "version": "0.9.0",
4
4
  "description": "The shape-shifting MCP hub — shapeshift() into 10,000+ MCP servers at runtime. One entry point, no restarts, 7 registries.",
5
5
  "mcpName": "io.github.kaiser-data/kitsune-mcp",
6
6
  "bin": {