Skip to content

Kimi ↔ Claude mcp version conflict blocks co-installation #29

Description

@pofallon

Summary

The kimi and claude extras cannot be installed in the same environment because their transitive mcp pins are mutually exclusive. Users who want both Kimi and Claude must split into separate virtualenvs.

The conflict chain

  • kimi extra → kimi-agent-sdkkimi-cli 1.12.0 → fastmcp 2.12.5 → mcp<1.17
  • claude extra → claude-agent-sdk 0.2.x → mcp>=1.23

mcp<1.17 and mcp>=1.23 have no overlapping solution, so a single resolution can't satisfy both.

Current handling (workaround, not a fix)

  • [tool.uv].conflicts in pyproject.toml declares kimi as mutually exclusive with claude, all, and the test/dev groups, so uv sync --all-extras succeeds by picking one side and the lockfile splits the environments.
  • kimi-agent-sdk is deliberately excluded from the [all] extra.
  • CI installs with --no-extra kimi and exercises the Kimi adapter against a mocked SDK surface, so unit coverage isn't blocked.
  • Consequence: KimiRuntime is auto-hidden from list_providers() in [all]-only environments (its REQUIRES_PACKAGE check finds kimi_agent_sdk missing), and anyone wanting Kimi + Claude together needs two venvs.

What would resolve it

Any one of:

  1. Upstream Moonshot publishes a kimi-agent-sdk / kimi-cli that widens the fastmcp (and therefore mcp) range to admit mcp>=1.23.
  2. Upstream claude-agent-sdk relaxes its mcp>=1.23 floor to overlap with <1.17 (unlikely — it moves forward, not back).
  3. fastmcp ships a release Kimi adopts that supports mcp>=1.23.

Acceptance criteria

  • A single environment can uv sync with both kimi and claude extras (no conflict declaration needed).
  • Remove the kimiclaude/all/test/dev entries from [tool.uv].conflicts once the upstream pins overlap.
  • Add kimi-agent-sdk back into the [all] extra.
  • list_providers() surfaces kimi in an [all] install.
  • An integration smoke (e.g. examples/smoke_providers.py) can exercise Kimi alongside Claude in one venv.

Notes

  • This is upstream-gated — nothing in airframe can fix the version math today; the task is to monitor the upstream pins and unwind the workarounds when they overlap.
  • Related: Wire Kimi $web_search native tool (TOOLS_NATIVE) #17 (wire Kimi $web_search native tool) — separate work, but both touch the Kimi adapter.
  • Context for the floor alignment that motivated filing this: the repo just raised its own minimum to Python 3.12 (matching Kimi's), which removed the Python-version half of the Kimi-install friction. The mcp conflict tracked here is the remaining, independent half.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions