io.github.kaiser-data/kitsune-mcp

Official registry Cloud and DevOps

Hot-reload for MCP servers + mount any community server mid-session, Docker-caged. No restarts.

Install

Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).

NPM package kitsune-mcp
Claude Code
claude mcp add kitsune-mcp -e 'SMITHERY_API_KEY=<your smithery_api_key>' -- npx -y kitsune-mcp@0.22.4
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "kitsune-mcp": {
            "command": "npx",
            "args": [
                "-y",
                "kitsune-mcp@0.22.4"
            ],
            "env": {
                "SMITHERY_API_KEY": "<your smithery_api_key>"
            }
        }
    }
}

Environment variables

  • SMITHERY_API_KEY secret Smithery API key for accessing 3,000+ verified MCP servers. Get yours at smithery.ai/account/api-keys
PYPI package kitsune-mcp
Claude Code
claude mcp add kitsune-mcp -e 'SMITHERY_API_KEY=<your smithery_api_key>' -- uvx kitsune-mcp==0.22.4
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "kitsune-mcp": {
            "command": "uvx",
            "args": [
                "kitsune-mcp==0.22.4"
            ],
            "env": {
                "SMITHERY_API_KEY": "<your smithery_api_key>"
            }
        }
    }
}

Environment variables

  • SMITHERY_API_KEY secret Smithery API key for accessing 3,000+ verified MCP servers. Get yours at smithery.ai/account/api-keys

Documentation

From the project's README on GitHub, refreshed weekly. Links open on GitHub.

Contents
  1. 🦊 Kitsune MCP
  2. Why
  3. Install
  4. Three things it does
  5. When to use it, when not to
  6. How it works
  7. Tools
  8. Safety, in short
  9. More
  10. Why "Kitsune"?
  11. Contributing

🦊 Kitsune MCP

Let your agent test the MCP server it's building.

Edit a tool, reload("dev"), call it again. No client restart.

⭐ Saved you a restart? Star it on GitHub so others find it.

📖 Documentation · Hot-reload tutorial · Tools reference

One prompt: Claude finds the bug, fixes it, reloads, checks again. Real recording, 31 s.


Why

Your agent edits an MCP tool, but the client still runs the old process. Someone has to restart it before the agent can test the fix.

With Kitsune, connect, call and reload are tools. The agent runs the whole loop itself:

connect("uvx --from . my-mcp-server", name="dev")  # start your server
shapeshift("dev")  # its tools appear in the client
call("summarize", arguments={"url": "https://example.com"})

# … the agent (or you) edits the tool …

reload("dev")  # restart on fresh code, remount
call("summarize", arguments={"url": "https://example.com"})  # new code, same session

It also mounts any of 130,000+ servers from 7 registries mid-session, caged in Docker.

Try it: hot-reload tutorial · examples/demo-hot-reload/

Install

Claude Code

claude mcp add -s user kitsune -- uvx kitsune-mcp

Any other client (Claude Desktop, Cursor, Windsurf, Cline, Zed, …):

{
  "mcpServers": {
    "kitsune": { "command": "uvx", "args": ["kitsune-mcp"] }
  }
}

Also on PyPI (pip install kitsune-mcp, then "command": "kitsune-mcp") and npm (npx kitsune-mcp, delegates to uvx).

Requirements: Python 3.12+ · uv · node/npx for npm-based servers · Docker optional, used to cage community servers.

Three things it does

LoopWhat you get
MCP REPLconnect → shapeshift → edit → reload → callIterate on your own server without restarting the client
Long-tail reachsearch → shapeshift → call → shapeshift()Use a server once without adding it to your config forever
Try before you trustconfirm=True + Docker cage + version pinsRun community npm/PyPI code contained, not as your user
Borrow a server you never configured
search("web scraping")
shapeshift("firecrawl", tools=["scrape_url"])  # mount one tool, not the whole server
call("scrape_url", arguments={"url": "https://example.com"})
shapeshift()  # drop it, session stays up
Try a community package, caged
search("pdf", registry="glama")
shapeshift("mcp-pdf-tools", confirm=True)  # npm/PyPI run in hardened Docker when available
call("extract_text", arguments={"path": "report.pdf"})
shapeshift()
Add credentials mid-session
auth("BRAVE_API_KEY", "sk-...")  # saved to ~/.kitsune/.env, no restart
shapeshift("brave", tools=["brave_web_search"])

Full live walkthrough: docs/demo-realtime.md.

When to use it, when not to

Use Kitsune when…Skip it when…
You're building an MCP server and want an edit/reload loopYou only use 1–3 trusted servers (configure them natively)
A task needs a server that isn't in your configEvery turn hits the same server (keep it always-on)
You want to evaluate community MCP code without installing it for goodYou want lower token use: the base cost is ~1,774 tokens/turn, and modern clients already defer tool schemas
Your MCP config is crowded (GATEWAY)You need a sub-second first call (cold mount takes ~1–15 s)

How it works

shapeshift(server_id) picks a transport (stdio, HTTP+SSE, WebSocket, Docker), connects, reads tools/list, and registers each tool as a native tool with the server's real schema. The client receives notifications/tools/list_changed and sees first-class tools, with no wrapper in between. shapeshift() with no argument removes them and closes the connection.

search() covers the official servers repo, the MCP Registry, Glama, npm, PyPI, GitHub (github:owner/repo) and Smithery (hosted servers, free API key).

Tools

Default profile: 9 tools, ~1,774 tokens/turn (measured with python examples/benchmark.py).

ToolRole
connect(command, name)Start a persistent local server, e.g. the one you're developing
reload(name)Release, restart on fresh code, remount, in one call
release(name)Stop a persistent server
search(query, registry?)Search 7 registries
shapeshift(server_id?, tools=[…])Mount a server's tools (all or a subset); no argument drops them
call(tool_name, arguments)Call a tool; the server is inferred when mounted
auth(var_or_server, value?)Set an env key or run an OAuth 2.1 browser flow
auto(task, server_hint=)Search, mount and call in one step
status()Current form, connection pool, session stats

KITSUNE_TOOLS=all (or the kitsune-forge command) adds developer tools: inspect (schemas, credential check, token cost), test (quality score 0–100), bench (p50/p95 latency), compare, prewarm, craft, setup, and more. See docs/tools.md. Companion skills for Claude Code: kitsune-dev, kitsune-improve.

Safety, in short

  • Community sources need consent. npm, PyPI and GitHub servers require confirm=True. The model can set that flag itself, so real approval belongs in your client's tool-approval UI.
  • connect() runs the command it is given, as your user, with no consent gate and no cage. It is meant for your own code. Approve connect calls in your client before the agent runs them.
  • Community packages run in a Docker cage by default when Docker is installed: no host filesystem, --cap-drop ALL, read-only root, memory and PID limits. Credentials are passed by name, never in argv.
  • Version pins (TOFU). A later malicious publish doesn't silently replace a version you already ran.
  • Opt-in action guard. A ~/.kitsune/policy.json checks every downstream call against allow/ask/deny rules, path roots and a host allowlist. ask goes to you through MCP elicitation.
  • Install commands are validated and launched without a shell. fetch() blocks private hosts and re-checks every redirect.

Don't run it unattended with production admin, billing or security credentials. The full model, including what it does not protect against: docs/safety.md.

More

Why "Kitsune"?

In Japanese folklore the kitsune (狐) is known for what it can become: it borrows a form, uses that power, casts it off and returns to itself. That is the product loop.

I am not Japanese, and I use this name with the highest respect for the mythology and culture it comes from. The parallel felt too precise to ignore.

Contributing

make dev     # install with dev dependencies
make test    # pytest
make lint    # ruff

Issues and PRs welcome: github.com/kaiser-data/kitsune-mcp · CHANGELOG.md


MIT License · Python 3.12+ · Built on FastMCP

Frequently asked questions

What is io.github.kaiser-data/kitsune-mcp?

Hot-reload for MCP servers + mount any community server mid-session, Docker-caged. No restarts.

How do I install io.github.kaiser-data/kitsune-mcp?

It runs on your machine. In Claude Code: claude mcp add kitsune-mcp -e 'SMITHERY_API_KEY=<your smithery_api_key>' -- npx -y kitsune-mcp@0.22.4. For other clients, paste the JSON configuration from this page into their MCP settings.

Does io.github.kaiser-data/kitsune-mcp need an API key?

Yes. It expects SMITHERY_API_KEY, which you set in its configuration.

Is io.github.kaiser-data/kitsune-mcp open source?

Yes. Its code is on GitHub under the MIT license.

Who maintains io.github.kaiser-data/kitsune-mcp?

It is published by kaiser-data. AI.tn lists it but does not maintain or endorse it.

From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.