mcp-config-separation — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mcp-config-separation (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Purpose: Clean architecture for managing MCP servers across global (generic) and project-specific (contextual) scopes.
Version: v1.0-SEAL Authority: Muhammad Arif bin Fazil (888 Judge) Motto: Ditempa bukan diberi — Forged, Not Given
Before: 12 MCPs duplicated across 4 config files
Claude Desktop: ~/.mcp.json → 12 entries
Kimi CLI: ~/.kimi/mcp.json → 12 entries (duplicate)
arifOS/Claude: arifOS/.mcp.json → 12 entries (partially different)
arifOS/Kimi: arifOS/.kimi/mcp.json → 12 entries (partially different)
Total: 48 entries to maintain
Entropy: HIGH — edit github? Update 4 files. Error-prone.After: Separation of concerns
| MCP | ~/.mcp.json (Claude) | ~/.kimi/mcp.json (Kimi) |
|---|---|---|
| memory | ✅ | ✅ |
| sequential-thinking | ✅ | ✅ |
| fetch | ✅ (uvx) | ✅ (uvx) |
| time | ✅ (uvx) | ✅ (uvx) |
| brave-search | ✅ | ✅ |
| github | ✅ | ✅ |
| context7 | ✅ | ✅ |
| perplexity | ✅ | ✅ |
| puppeteer | ✅ | ✅ |
| playwright | ✅ | ✅ |
| python-repl | ✅ | - |
Count: 11 MCPs × 2 files = 22 entries Scope: Shared across ALL projects
| MCP | arifOS/.mcp.json | arifOS/.kimi/mcp.json |
|---|---|---|
| aaa-mcp | ✅ (needs cwd) | ✅ (needs cwd) |
| filesystem | ✅ (scoped path) | ✅ (scoped path) |
| git | ✅ (needs cwd) | ✅ (needs cwd) |
| memory | ✅ (custom path) | ✅ (custom path) |
Count: 4 MCPs × 2 files = 8 entries Scope: arifOS project only
| Floor | How This Pattern Honors It |
|---|---|
| F1 Amanah | Scoped paths contain filesystem access; reversible by design |
| F2 Truth | Single source of truth for each MCP; no drift between configs |
| F4 Clarity | ΔS ≤ 0: Reduced 48 entries → 30 entries (37% entropy reduction) |
| F10 Ontology | Clear type boundaries: generic vs contextual |
| F11 Authority | Project configs need cwd = explicit context declaration |
~/.mcp.json (Claude Desktop){
"mcpServers": {
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"]
},
"sequential-thinking": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
},
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"time": {
"command": "uvx",
"args": ["mcp-server-time"]
},
"brave-search": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "${BRAVE_API_KEY}"
}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"context7": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-context7"]
},
"perplexity": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-perplexity"],
"env": {
"PERPLEXITY_API_KEY": "${PERPLEXITY_API_KEY}"
}
},
"puppeteer": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-puppeteer"]
},
"playwright": {
"command": "npx",
"args": ["-y", "@executeautomation/playwright-mcp-server"]
},
"python-repl": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-python-repl"]
}
}
}~/.kimi/mcp.json (Kimi CLI){
"mcpServers": {
"memory": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-memory"] },
"sequential-thinking": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-sequential-thinking"] },
"fetch": { "command": "uvx", "args": ["mcp-server-fetch"] },
"time": { "command": "uvx", "args": ["mcp-server-time"] },
"brave-search": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-brave-search"], "env": { "BRAVE_API_KEY": "${BRAVE_API_KEY}" } },
"github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" } },
"context7": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-context7"] },
"perplexity": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-perplexity"], "env": { "PERPLEXITY_API_KEY": "${PERPLEXITY_API_KEY}" } },
"puppeteer": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-puppeteer"] },
"playwright": { "command": "npx", "args": ["-y", "@executeautomation/playwright-mcp-server"] }
}
}arifOS/.mcp.json (arifOS-specific, Claude){
"mcpServers": {
"aaa-mcp": {
"command": "python",
"args": ["-m", "aaa_mcp", "stdio"],
"cwd": "${workspaceFolder}"
},
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "C:/Users/User/arif-fazil-sites"]
},
"git": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-git"],
"cwd": "${workspaceFolder}"
},
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"],
"env": {
"MEMORY_FILE_PATH": "C:/Users/User/arif-fazil-sites/.memory.json"
}
}
}
}arifOS/.kimi/mcp.json (arifOS-specific, Kimi){
"mcpServers": {
"aaa-mcp": { "command": "python", "args": ["-m", "aaa_mcp", "stdio"], "cwd": "${workspaceFolder}" },
"filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "C:/Users/User/arif-fazil-sites"] },
"git": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-git"], "cwd": "${workspaceFolder}" },
"memory": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-memory"], "env": { "MEMORY_FILE_PATH": "C:/Users/User/arif-fazil-sites/.memory.json" } }
}
}cwd RequirementMCPs needing cwd (aaa-mcp, git) are context-aware. They behave differently based on project location.
"args": ["-y", "@modelcontextprotocol/server-filesystem", "C:/Users/User/arif-fazil-sites"]Filesystem is bounded to project path (F1 Amanah — reversible containment).
"env": { "MEMORY_FILE_PATH": "C:/Users/User/arif-fazil-sites/.memory.json" }Each project gets its own memory file. No cross-contamination.
| Tool | Runtime | Why |
|---|---|---|
| fetch | uvx | Python-native, lightweight |
| time | uvx | Python-native, no Node bloat |
| Others | npx | Node ecosystem standard |
1. Start Claude Desktop / Kimi CLI
↓
2. Load GLOBAL configs (~/.mcp.json)
→ memory, fetch, time, github... available everywhere
↓
3. Open project folder (arifOS/)
→ Load PROJECT configs (.mcp.json)
→ aaa-mcp, filesystem (scoped), git (cwd-aware), memory (isolated)
↓
4. MCP union: GLOBAL ∪ PROJECT = 15 unique MCPsStep 1: Backup existing configs
cp ~/.mcp.json ~/.mcp.json.backup
cp ~/.kimi/mcp.json ~/.kimi/mcp.json.backupStep 2: Identify generic vs contextual MCPs
Step 3: Move generic to global
# Edit ~/.mcp.json and ~/.kimi/mcp.json
# Keep only generic MCPsStep 4: Create project-specific configs
# Create arifOS/.mcp.json
# Create arifOS/.kimi/mcp.json
# Add only contextual MCPsStep 5: Verify union
# Count unique MCPs across both layers
# Should be: GLOBAL.count + PROJECT.count (no overlap)cwd-dependent MCPs have correct working directoryWith this separation, you unlock:
| Pattern | Capability |
|---|---|
| Global + Project | Contextual MCP Union — Tools adapt to project |
| Scoped filesystem | F1 Amanah Enforcement — No escape from project bounds |
| Isolated memory | Project-Specific Knowledge Graph — Clean data separation |
| cwd-aware tools | Implicit Context Loading — Tools know where they are |
SEALED BY: 888_JUDGE DATE: 2026-02-06 VERSION: v1.0 STATUS: ARCHITECTURE_PATTERN
Ditempa bukan diberi 💎🔥🧠
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.