Skip to content

Feature Request: Allow local mcp command when cloud mode is enabled #517

@mikrub

Description

@mikrub

Summary

In v0.16+, the mcp CLI command is hidden when cloud mode is enabled. This prevents using Basic-Memory across the full Anthropic ecosystem (Claude Code, Claude Desktop, claude.ai, Mobile) — each has different MCP capabilities. Request: restore v0.15 behavior where local MCP and cloud mode coexist.

Environment

  • basic-memory versions tested: 0.17.7, 0.16.x
  • Working version: 0.15.0 (both mcp and cloud commands available)
  • OS: macOS
  • Python: 3.12 via pyenv

The Anthropic MCP Landscape

Through testing, I discovered that different Claude surfaces have different MCP connector capabilities:

Claude Surface Local MCP (stdio) Remote MCP (cloud) Config Source
Claude Code (terminal) ~/.claude.json only
Claude Code (in Desktop) ~/.claude.json only
Claude Desktop (chat) JSON + account sync
Cowork (Desktop agentic) JSON + account sync
claude.ai (web) Account connectors only
Mobile (iOS/Android) Inherited from account

Key findings from Anthropic docs:

  • Remote connectors (custom connectors) sync across account — add in claude.ai, appears in Desktop/Mobile
  • Local connectors (JSON config) do NOT sync — per-installation only
  • Claude Desktop will NOT connect to remote servers configured directly in claude_desktop_config.json

The implication: To cover all Claude surfaces, you need BOTH local MCP (for Code terminal) AND cloud MCP (for web/mobile).

The Problem

Basic-Memory v0.16+ assumes these are mutually exclusive:

# From src/basic_memory/cli/commands/mcp.py
if not config.cloud_mode_enabled:
    @app.command()
    def mcp(...)

This breaks my workflow:

Surface What I need Status with v0.17
Claude Code Local stdio MCP (fast, offline) mcp command hidden
Claude Desktop Local stdio MCP (faster than cloud) mcp command hidden
claude.ai Cloud MCP (only option) ✅ Works
Mobile Cloud MCP (inherited) ✅ Works

Why mcp-remote doesn't help: Claude Desktop can use mcp-remote as a bridge to remote servers, but mcp-remote cannot handle OAuth authentication. Basic-Memory Cloud's endpoint returns 404 without OAuth.

My Desired Setup (local-first)

┌─────────────────────────────────────────────────────────────────────────┐
│                         CORPUS (markdown files)                          │
│                    ~/corpus/ (local, Git-versioned)                      │
└─────────────────────────────────────────────────────────────────────────┘
                                    │
            ┌───────────────────────┼───────────────────────┐
            │                       │                       │
            ▼                       ▼                       │
    ┌───────────────┐      ┌───────────────┐               │
    │ Claude Code   │      │ Desktop/Cowork │               │
    │ (terminal)    │      │                │               │
    │               │      │                │               │
    │ Local MCP     │      │ Local MCP      │               │
    │ (stdio)       │      │ (stdio, fast)  │               │
    └───────┬───────┘      └───────┬───────┘               │
            │                       │                       │
            └───────────┬───────────┘                       │
                        │                                   │
                        ▼                                   │
                   bisync daily                             │
                        │                                   │
                        ▼                                   │
              ┌───────────────────┐                         │
              │ Basic-Memory Cloud │◄────────────────────────┘
              │ (backup + mobile  │
              │  access)          │        ┌───────────────┐
              │                   │◄───────│ claude.ai/    │
              └───────────────────┘        │ Mobile        │
                                           │               │
                                           │ Cloud MCP     │
                                           │ (account)     │
                                           └───────────────┘

Benefits:

  • Local MCP is faster (no network round-trip)
  • Works offline
  • Cloud is backup + enables web/mobile access
  • Sync when convenient, not required for every query

Current Workaround

Pin to v0.15.0:

{
  "mcpServers": {
    "basic-memory": {
      "command": "uvx",
      "args": ["basic-memory@0.15.0", "mcp", "--project", "corpus"]
    }
  }
}

And toggle cloud mode only when syncing:

uvx basic-memory@0.15.0 cloud login && \
uvx basic-memory@0.15.0 project bisync --name mikrub-corpus && \
uvx basic-memory@0.15.0 cloud logout

This works but:

  • Stuck on old version (missing fixes/features)
  • Awkward login/logout dance for sync
  • Easy to forget logout and break local MCP

Proposed Solutions

Option A: Always register mcp command (simplest)

Remove the conditional guard. Let users choose which transport they want.

# Always available, regardless of cloud mode
@app.command()
def mcp(...)

Option B: Add --local flag

Keep the guard but provide escape hatch:

bm mcp --local --project corpus  # Force local even with cloud mode

Option C: Separate "cloud sync" from "cloud MCP"

The real need is:

  • Cloud SYNC: bisync files to cloud for backup/multi-device
  • Cloud MCP: route MCP queries through cloud

These don't have to be coupled. Could have:

  • bm cloud sync enable — just syncing
  • bm cloud mcp enable — route MCP through cloud (disables local)

Why This Matters

The Anthropic ecosystem is fragmented — Claude Code, Desktop, web, and mobile all have different MCP capabilities. Users shouldn't have to choose between "cloud features" and "local MCP" when both are needed to cover all surfaces.

Basic-Memory is one of the few tools that can bridge this gap with both local and cloud MCP. v0.16+ accidentally breaks that capability.

Related

  • The tool subcommand remains available in cloud mode, suggesting MCP protocol itself isn't the issue
  • This may be an oversight in the API v2 migration

For others hitting this: Pin to basic-memory@0.15.0 until resolved.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions