Atlas / MCP servers / gctrl-tech / platform

platformBLOCK

mcp/gctrl-tech/platform

Governed graph-native agent memory: knowledge extraction, fusion, hybrid RAG, scoped access tokens. A push for data sovereignty.

Verdict
BLOCK
Grade
F
Trust score
45 /100
Exposed tools
6 6r · 0w · 0d
Transport
stdio · streamable-http
License
AGPL-3.0
Stars
7
01

Overview

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

The knowledge-infrastructure layer for enterprise AI.

Ground your data. Command your AI.

[](https://github.com/GCTRL-TECH/platform/actions/workflows/build-push.yml) [](./LICENSE) [](#-quick-start) [](#-access-control--compliance) [](#-quick-start)

GCTRL turns your scattered documents, databases, and code into one governed knowledge graph — then grounds your LLMs and agents on it, with enterprise-grade access control, entirely on your own infrastructure.

Most "AI memory" is a pile of vector chunks: fuzzy recall, no structure, no provenance, no permissions. GCTRL is graph-native — entities, typed relations, dossiers, and hybrid retrieval — and it runs 100% locally, so nothing leaves your building.

The pitch in one line: point GCTRL at your data, get a governed knowledge graph, and let any agent (Claude Code, Cursor, Codex...) read and write it as durable, access-controlled memory.

✨ Why GCTRL

  • 🕸️ Graph-native, not a vector blob. Entities, typed relations, entity dossiers, and hybrid retrieval (dense + keyword + graph traversal) — with provenance on every fact. Ask "how does X connect to Y?" and get a real answer, not a fuzzy guess.
  • 🔒 100% self-hosted, local inference. Runs on your hardware with local Ollama. DSGVO/GDPR by design — RAG sessions live in browser memor
Read from source at commit 408df86eb0fdOBSERVED · 2026-10-10
Advertisement
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 (npm)
claude mcp add gctrl-mcp --env GCTRL_API_TOKEN=${GCTRL_API_TOKEN} -- npx -y [email protected]
03

Exposed tools (6)

6 read · 0 write · 0 destructive.

ToolRiskDescription
CRMreadCustomer Relationship Management
FinancereadFinancial services
GitHubreadConnect GitHub repos, issues, PRs
HealthcarereadHealthcare and medical
LegalreadLegal and compliance
SlackreadConnect Slack workspace channels
04

Trust audit

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

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

What the source does

Filesystem
declared (12 observation(s))
Network
declared (22 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
deploy/install.sh:241
/.env" ... curl
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
deploy/rollback.sh:81
/.env" ... curl
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
deploy/uninstall.sh:105
/.env" ... curl
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
deploy/update.sh:116
/.env" ... curl
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
pip/src/gctrl/installer.py:88
".env" ... urllib.request
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
services/api-rs/src/routes/crawler.rs:205
|| (o[0] == 169 && o[1] == 254)                // link-local (incl. 169.254.169.254 metadata)
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
services/api-rs/src/routes/llm_gateway.rs:1564
assert!(upstream_base_from(up, Some("http://169.254.169.254"), false).is_err());
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
services/api-rs/src/services/llm.rs:546
if host == "169.254.169.254" || host == "100.100.100.200" {
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
services/api-rs/src/services/llm.rs:1641
assert!(validate_llm_base("openai", Some("http://169.254.169.254")).is_err());
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
services/api-rs/src/services/llm.rs:1729
validate_llm_base("openai_compatible", Some("http://169.254.169.254")).is_err(),
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
services/api/src/connectors/database.ts:42
ssl: config.ssl ? { rejectUnauthorized: false } : false,
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
services/api/src/connectors/database.ts:74
ssl: config.ssl ? { rejectUnauthorized: false } : false,
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
docker-compose.yml:15
- DATABASE_URL=postgresql://GCTRL:GCTRL@postgres:5432/GCTRL
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
docker-compose.yml:124
- PG_URL=postgresql://GCTRL:GCTRL@postgres:5432/GCTRL
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
docker-compose.yml:164
- PG_URL=postgresql://GCTRL:GCTRL@postgres:5432/GCTRL
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
services/api/src/config.ts:15
'postgresql://GCTRL:GCTRL@localhost:5433/GCTRL'
MEDIUMInventory / provenance · inv.binary · CWE-1104
services/fusion-engine/limes.jar
limes.jar
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
services/api/src/connectors/token-manager.ts:78
console.log(`[TokenManager] Refreshed token for connector ${connectorId}`);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
services/agent-rs/src/docker.rs:350
"Healthcheck": { "Test": ["CMD", "wget", "-q", "http://127.0.0.1/health"] }
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
services/api-rs/migrations/023_obsidian_connector.sql:7
vault_url    TEXT         NOT NULL DEFAULT 'https://127.0.0.1:27124',
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
services/api-rs/src/routes/agent.rs:1497
let api_base = format!("http://127.0.0.1:{}/api", state.cfg.port);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
services/api-rs/src/routes/infra.rs:2471
let result = validate_runtime_input("ollama", Some("http://10.0.0.5:11434"));
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
services/api-rs/src/routes/infra.rs:2512
let result = validate_runtime_input("openai_compatible", Some("http://10.0.0.5:8080"));
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
services/fuse/tests/test_netutil.py:31
msg = "Error connecting to redis://default:pw@gctrl-redis:6379. Connection refused."
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
services/api-rs/src/services/crypto.rs:234
let secret = "ya29.super-secret-oauth-token-value";

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha 408df86eb0fdfull audit observations/trust-audit/mcp-server/gctrl-tech__platform.json · Report an issue / request a re-scan
05

Audit history

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

DateSourceVerdictGradeScoreChange
2026-10-10408df86eb0fdBLOCKF45first audit
06

Questions

What is the platform MCP server?

Governed graph-native agent memory: knowledge extraction, fusion, hybrid RAG, scoped access tokens. A push for data sovereignty.

What tools does platform expose?

6 in total: 6 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is platform safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (45/100) and found 16 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 platform need?

It reads EMBEDDING_API_KEY, GCTRL_API_KEY, GCTRL_API_TOKEN, GCTRL_LICENSE_PUBLIC_KEY, GHCR_READ_TOKEN, GHCR_TOKEN, INTERNAL_API_SECRET, JWT_SECRET, LICENSE_HMAC_SECRET, LICENSE_PRIVATE_KEY_PATH, LICENSE_PUBLIC_KEY_PATH and NEO4J_PASSWORD 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 platform run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as gctrl-web at 0.1.0.

How current is this page?

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

Advertisement