Atlas / MCP servers / kagura-ai / memory-cloud

memory-cloudBLOCK

mcp/kagura-ai/memory-cloud

Adaptive memory for AI agents & teams — beyond RAG. Self-hosted MCP server that gets smarter every time you search: hybrid search + a neural memory graph that learns. Works with Claude, ChatGPT & any MCP client.

Verdict
BLOCK
Grade
F
Trust score
33 /100
Exposed tools
—
Transport
streamable-http
License
Apache-2.0
Stars
12
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

English · 日本語

Adaptive memory for AI agents and teams — self-hosted, beyond RAG. An MCP server that gets smarter every time you search: hybrid search + a neural memory graph that learns which memories belong together.

Works with Claude, ChatGPT, Gemini, and any MCP-compatible client. Python SDK (KaguraClient, REST clients & FileIngestor)

Read from source at commit df623e5c1124OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add kagura-web --env API_KEY_SECRET=${API_KEY_SECRET} --env AUTH_PROVIDERS=${AUTH_PROVIDERS} --env E2E_ADMIN_PASSWORD=${E2E_ADMIN_PASSWORD} --env GB_TEST_KEY=${GB_TEST_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "kagura-web": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "API_KEY_SECRET": "${API_KEY_SECRET}",
        "AUTH_PROVIDERS": "${AUTH_PROVIDERS}",
        "E2E_ADMIN_PASSWORD": "${E2E_ADMIN_PASSWORD}",
        "GB_TEST_KEY": "${GB_TEST_KEY}"
      }
    }
  }
}
03

Trust audit

BLOCKgrade F · trust 33/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (12 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
Makefile:165
@echo "Running live retrieval-quality eval (needs the stack: make up)..."
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
Makefile:171
@echo "Running live cold→replay→warm compounding eval (Issue #969, needs the stack: make up)..."
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
Makefile:183
@echo "Running live update-correctness eval (H4 update-slice, needs the stack: make up)..."
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.env.example:20
DATABASE_URL=postgresql://kagura:kagura_dev_password@localhost:5432/kagura
HIGHPrompt injection · prompt.credential_read · CWE-94, CWE-1427
.claude/commands/release.md:218
Requires `CODECOV_TOKEN` (read from `.env.local`, or export it).
Why it matters. asks the agent to read credentials
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
backend/src/api/routes/api_keys.py:502
logger.info("api_key_stats_retrieved", key_id=api_key.id, public_id=key_id, days=days)
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
backend/src/api/routes/member_credentials.py:870
logger.info("api_key_deleted", key_id=api_key.id, public_id=api_key.public_id, user_id=user_id)
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
backend/src/auth/dependencies.py:404
logger.warning("invalid_api_key_attempt", key_prefix=api_key[:16] if api_key else None)
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
backend/src/auth/dependencies.py:549
logger.warning("invalid_oauth_bearer_attempt", token_prefix=api_key[:8])
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
backend/src/auth/dependencies.py:609
logger.warning("invalid_api_key_attempt", key_prefix=api_key[:16])
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
backend/alembic/versions/e10_624_seed_kagura_cli_client.py:96
_REDIRECT_URIS_JSON = '["urn:ietf:wg:oauth:2.0:oob", "http://127.0.0.1:0/"]'
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
backend/scripts/verify_remote_oauth.py:446
"callback", f"http://127.0.0.1:{self.server.server_address[1]}{self.path}"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
backend/scripts/verify_remote_oauth.py:1302
self.redirect_uri = f"http://127.0.0.1:{self.callback.port}/callback"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
backend/scripts/verify_remote_oauth.py:1444
unregistered = f"http://127.0.0.1:{self.callback.port}/unregistered"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
backend/scripts/verify_remote_oauth.py:2088
unregistered = f"http://127.0.0.1:{self.callback.port}/unregistered"
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
backend/src/neural/config.py:213
gradient_clipping: float = 0.5  # Max total Δw per node per update
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
backend/src/neural/decay.py:104
f"(Δt={delta_seconds:.0f}s)"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backend/tests/cli/test_reset_password_revocation_cli.py:200
"redis://user:s3cret@store:6379/0",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backend/tests/mcp_server/test_error_envelopes.py:439
_LEAKY = "connection to postgresql://svc:[email protected]/kagura failed; see /srv/app/db.py"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backend/tests/mcp_server/test_sleep_tools.py:981
ConnectionError("postgresql://svc:[email protected]/kagura via /srv/app/db.py"),
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backend/tests/mcp_server/test_tool_errors.py:50
_LEAKY = "connection to postgresql://svc:[email protected]/kagura failed; see /srv/app/db.py"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
backend/tests/api/test_billing_handoff_route.py:79
token="eyJhbGciOiJFZERTQSJ9.fake.sig",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
backend/tests/api/test_workspace_connector_channels.py:787
token = "xoxb-super-secret-token-value"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
backend/tests/mcp_server/test_transport_oauth.py:962
token="bearer-value-sentinel",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
backend/tests/services/email_providers/test_resend.py:447
token = "raw-invite-token-DO-NOT-LEAK-7f"  # noqa: S105

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha df623e5c1124full audit observations/trust-audit/mcp-server/kagura-ai__memory-cloud.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10df623e5c1124BLOCKF33first audit
05

Questions

What is the memory-cloud MCP server?

Adaptive memory for AI agents & teams — beyond RAG. Self-hosted MCP server that gets smarter every time you search: hybrid search + a neural memory graph that learns. Works with Claude, ChatGPT & any MCP client.

Is memory-cloud safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (33/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does memory-cloud need?

It reads API_KEY_SECRET, AUTH_PROVIDERS, E2E_ADMIN_PASSWORD, GB_TEST_KEY, GITHUB_CLIENT_SECRET, GOOGLE_CLIENT_SECRET, MINIO_TEST_ACCESS_KEY, MINIO_TEST_SECRET_KEY, NEXT_PUBLIC_ENABLE_MOCK_AUTH, OPENAI_API_KEY, PW_OAUTH_IDP and R2_ACCESS_KEY_ID from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does memory-cloud run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as kagura-web at 0.99.0.

How current is this page?

The grade is for one exact copy of the source (df623e5c1124), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement