agent-kit
The agent-kit server is a read-only MCP server that provides access to a personal knowledge base, platform skills, agents, shared references, context guides, and private personal memory. You can:
Browse and retrieve skills, agents, references, and context guides with content chunking (full, sections, or TOC) for efficient token use.
Manage local, private memory: list entries, fetch by name, and full-text search.
Perform full-text search across all platform knowledge (skills, agents, references, guides, CLAUDE.md) and personal memory.
Get diagnostic token usage statistics (summary or detailed).
All operations are read-only and served over stdio.
Projects the knowledge base content into an Obsidian vault (symlinks on POSIX, copies on Windows) for browsing and use within the Obsidian note-taking app.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@agent-kit list skills related to deployment"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
agent-kit
A provider-neutral agent kit and a local artifact-memory substrate for a personal multi-repo workspace.
Two things live here:
A knowledge kit — skills, agents, entrypoints and references maintained once, compiled into per-provider packs (Claude Code, Codex CLI, OpenCode) by generators, and served to a Claude Code session over MCP.
An artifact-memory substrate — a local pipeline that catalogs the workspace's canonical Markdown, chunks it into an immutable outbox, embeds it locally, and serves semantic search from a loopback Qdrant behind a resident Unix-socket service. Nothing leaves the machine.
Design rules
Canonical Markdown is the source of truth. The search index is derived — a discovery hint, never an authority. Retrieve the real file before acting.
Derived state is rebuildable; canonical state is never rewritten to fix an index.
Fail closed. A hash mismatch, a missing build manifest, an incomplete backup: each stops the pipeline and says so rather than shipping something unverified.
Local embeddings only. A pinned ONNX model (
all-MiniLM-L6-v2, 384-dim) loaded from a digest-checked local snapshot; runtime downloads are refused.
Related MCP server: mcp-service
⚠️ The rebuild rule — read before editing src/
The registered server command runs the compiled output (node dist/index.js), not
the TypeScript source. An edit under src/ is invisible until you npm run build and
restart the Claude Code session (the MCP server is spawned per session). npm run dev
runs the source directly, but that is not what Claude Code launches.
Content under data/ is loaded once at server startup — no hot reload, but no
rebuild needed either. Restart the session after editing it.
Architecture
canonical Markdown
├─────────────► artifact_catalog.py ──► catalog (sqlite, exact sha256)
│ │
skills │ emit receipts ▼
│ artifact_ingestion.py ──► immutable gzip-JSONL outbox
▼ │
skill-events/ ──► artifact_event_consumer.py ────┤ (checkpointed, dead-lettered)
▼
Qdrant (loopback, API-keyed)
│
artifact_memory_service.py (resident, UDS)
│
MCP tools ──┘ search_artifacts / get_artifactSupport plane: an external watchdog (a dead consumer cannot announce its own death),
a composite health watermark, an age-encrypted off-device backup with a fail-closed
--verify, a reversible quarantine, and a retention classifier that defaults to RETAIN.
MCP tools (17)
Group | Tools |
Skills / agents |
|
References |
|
Context guides |
|
Memory (local, private) |
|
Search |
|
Artifact memory |
|
Diagnostics |
|
All are read-only. The server exposes exactly one transport (stdio); a static tripwire test fails if an HTTP/SSE transport is ever imported.
What the default profile writes to disk. Under the default
SERVER_PROFILE=personal, the token log keeps a 120-character raw preview of every tool call's arguments (summarizeArgs), and the response-cache snapshot keeps rawargsKeys. Both default to$WORKSPACE_ROOT/.claude/mcp-token-log.jsonland$WORKSPACE_ROOT/.claude/mcp-cache-snapshot.jsonl.SERVER_PROFILE=sharedswitches the log tohashArgsand writes to distinct*.shared.jsonlfiles. Both patterns are gitignored, but if you pointTOKEN_LOG_PATHorCACHE_SNAPSHOT_PATHsomewhere else, that is on you. Set either to""to disable it.
Under SERVER_PROFILE=shared the personal-memory tier is excluded from both the search
index and the memory tools, and the artifact-memory tools are not registered at all.
Quick start
git clone https://github.com/chris-dare-dev/agent-kit
cd agent-kit
npm ci && npm run build
claude mcp add agent-kit -- node "$PWD/dist/index.js"No environment variables are required: with none set, the server serves the
content bundled in data/ and resolves everything else relative to the package
root. PLATFORM_ROOT (extra content root), WORKSPACE_ROOT, MEMORY_ROOT,
CONTEXT_GUIDES_DIR and CLAUDE_MD_GLOBS are optional overrides — see the
header of src/config.ts.
That block is executed by node scripts/verify-quickstart.mjs, so if it drifts
from what actually works, the check fails.
Optionally, plant the bundled skills, agents, commands and hooks into a
workspace's .claude/, and check your machine:
node scripts/cli.mjs init # symlink on POSIX, copy on Windows
node scripts/cli.mjs doctor # one PASS/FAIL/SKIP row per prerequisiteinit refuses to touch anything it did not create unless you pass --force,
never writes outside the clone without --install-to, and records every path it
touched in .agent-kit/install-receipt.json. Run init --dry-run to see the
plan first.
The substrate is separate and optional — see
workspace-tooling/README.md for provisioning
(Docker + Qdrant + a Python 3.12 venv from the pinned lockfile).
Supported platforms
This table is what is measured today, not what is intended. Every entry was run on Windows 11 and on Linux; macOS entries are marked as inferred where no host was available to check them.
native — runs here, no workaround. WSL2 — Windows users run it inside a WSL2 guest. partial — runs and reports, with known residue that is tracked. unsupported — declines by name; see the linked milestone.
Component | macOS | Linux | Windows |
MCP server ( | native (17 tools) | native (17 tools) | native (13 tools) |
Artifact-memory tool group (4 tools, Unix socket) | native | native | unsupported — no AF_UNIX (M5); WSL2 meanwhile |
Generators + the seven gates | native | native | native |
TypeScript suite ( | native | native | native |
Python substrate — imports and collects | native | native | native |
Python substrate — passes | partial | partial | partial (#70) |
Resident memory service ( | native | native | unsupported (M5); WSL2 meanwhile |
Shell hooks ( | native | native | unsupported — fail open (M3) |
Obsidian vault projection (symlinks, | native | native | unsupported (M5) |
Service supervision (launchd | native | unsupported (M5) | unsupported (M5) |
Substrate suite, measured. The suite used to be un-importable off POSIX;
M2 routed fcntl, os.geteuid and the resource/AF_UNIX dependencies through
workspace-tooling/platform_compat.py, so it now collects everywhere. It does
not yet pass everywhere:
collected | failures | errors | |
Linux (no venv) | 627 | 1 | 30 |
Windows 11 | 625 | 31 | 337 |
workspace-tooling/run-substrate-tests.py records these as baselines and tells
you whether a run is at, above or below them — so "did I break something" is
answerable without a clean tree to diff against. On POSIX, ~30 of the errors are
cases that import qdrant_client at call time and clear once the provisioned
venv is used. The Windows residue (SQLite handles held across tempdir teardown,
macOS-only launchd fixtures) is #70.
macOS is inferred, not measured. No macOS host was available. Its rows assume POSIX parity with Linux, which is what the code implies but not something anyone has run.
Unsupported means it says so. artifact_memory_service.py on Windows exits
2 in under a second naming the platform, the missing AF_UNIX support, and the
WSL2 alternative — rather than emitting a cascade of import errors that read like
substrate defects.
On Windows the MCP server starts and serves the 13 non-substrate tools, and says on stderr exactly which group is unavailable and why.
Testing
npm run test:all # everything below that runs without a provisioned substrate
npm run test:unit # all 10 TypeScript suites (globbed) + init + uninstall
npm run gates # every generator gate, consistency check and shell harness
npm run verify:quickstart
# substrate suite — runs on every OS and reports against a recorded baseline
# (Linux 627 collected / 1 fail / 30 error; Windows 625 / 31 / 337). Exits
# non-zero whenever anything failed, matching baseline or not.
npm run test:substrate
# The substrate suite needs the provisioned venv to clear ~30 of those errors:
# they are cases that import qdrant_client at call time. It is NOT part of
# test:all for that reason. Windows residue is tracked as #70.
# `npm run gates` above runs all of these and prints one named line per gate;
# reach for them individually only when you want one gate's own diagnostics.
# No PYTHONUTF8 needed: every text I/O in data/scripts names its encoding, and
# catalog provenance is POSIX-separated, so these are byte-identical on Windows,
# macOS and Linux. Both were verified on Windows AND Linux.
python3 data/scripts/catalog-generate.py --check
python3 data/scripts/generate-adapter-packs.py --check
python3 data/scripts/generate-root-contract.py --check
python3 data/scripts/model-policy-apply.py --check
python3 data/scripts/mcp-server-name-check.py --check
python3 data/scripts/denylist-check.py --check
python3 data/scripts/template-settings-check.py --checkThe last one is why a rename is survivable: every mcp__<server>__ tool grant in
data/**/*.md must name a server that all three shipped registration templates
register. Change the server name and it tells you every file still carrying the
old grant.
agent-kit doctor runs all of the above prerequisite checks in one pass, with
the right encoding, and prints a fix command per failure.
AGENTS.md and CONTEXT.md are generated — edit the coverage map, then regenerate.
Layout
Path | What |
| MCP server (TypeScript → |
| the knowledge base |
| generators, validators, pipeline tooling |
| PreToolUse guards (incl. the plaintext-credential blocker) |
| the artifact-memory substrate + its tests |
Provenance
This kit began as a personal fork of an internal tool I built at work, then was genericized: the employer-specific integrations, infrastructure facts, and operational tooling were removed, and the remaining machinery renamed. What is left is the general architecture — the generators, the guard, the memory substrate — plus content I use on my own projects.
src/security/aidefence-rules.ts transcribes detection patterns from
ruflo (MIT) as data; see that file's header for the
attribution and the one deliberate deviation.
Requirements
Server: Node ≥ 20. Nothing else — macOS, Linux and Windows alike.
Substrate (optional): Python 3.12 · Docker (Qdrant). The Python modules and
their test suite import and run on macOS, Linux and Windows; the resident
memory service needs a Unix-domain socket, so on Windows it runs inside WSL2 —
see Supported platforms and
docs/platforms/windows-wsl.md.
Available Tools
13 toolsget_agentA
Get the definition for one named platform agent. Supports section chunking: omit section for full content (small agents) or auto-summary (large agents); pass section: "list" for headings, section: "<slug>" for one section, or section: "all" for full content.
Inputs: name (required), section.
get_context_guideA
Get a topical context guide. Topic supports partial matching (e.g., 'mesh' -> 'service-mesh'). Large guides default to a chunked summary (intro + TOC); pass section: "<slug>" for one section, section: "list" for TOC only, or section: "all" for full content. Use chunking to save tokens when you only need part of the guide.
Inputs: topic (required), section.
get_memoryA
Get the full content of one personal-memory file by name (the on-disk filename stem, e.g. reference_pqc_envoyfilter_constraints). Accepts a unique substring. LOCAL/PRIVATE tier.
Inputs: name (required).
get_referenceB
Get the full content of a shared reference file
Inputs: name (required).
get_skillA
Get a skill's SKILL.md content. Supports section chunking: omit section for full content (small skills) or auto-summary (large skills); pass section: "list" for a TOC of headings; pass section: "<slug>" for one section; pass section: "all" to force full content.
Inputs: name (required), section.
get_token_statsA
Show estimated MCP token usage. Default mode: "summary" returns per-tool counts, session totals, and top-5 historical large calls (~250-400 tok). mode: "detail" adds hot queries, content-hash dupes, chunking adoption, and cache-bypass rate (~1-1.5K tok). Itself cache-exempt and not token-logged.
Inputs: mode.
list_agentsA
List all available platform agents with name, description, and model. Use this first; then call get_agent for full details on a specific agent.
Inputs: no named parameters.
list_context_guidesA
List all topical context guides (service-mesh, monitoring, networking, etc.)
Inputs: no named parameters.
list_memoryA
List this engineer's LOCAL/PRIVATE personal-memory entries (name + category + one-line summary). Memory is machine-specific and gitignored — never shared. Use get_memory to fetch one, search_memory to find by keyword.
Inputs: no named parameters.
list_referencesA
List all shared reference files (cluster contexts, environment map, port conventions, etc.)
Inputs: no named parameters.
list_skillsB
List all available platform skills with name and description
Inputs: no named parameters.
search_memoryA
Full-text search restricted to this engineer's LOCAL/PRIVATE personal-memory tree (project/feedback/reference/user notes). Use when you recall having a personal lesson but not its exact name. For shared platform knowledge use search_platform_knowledge instead.
Inputs: query (required), max_results.
search_platform_knowledgeB
Full-text search across all platform knowledge: skills, agents, references, context guides, and CLAUDE.md files
Inputs: query (required), max_results.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Each tool targets a distinct resource and action (list vs. get vs. search) with no overlapping purposes. For example, list_skills and get_skill are clearly separated, and search_memory is distinct from search_platform_knowledge.
All tool names follow a consistent verb_noun pattern using snake_case (e.g., list_skills, get_reference, search_memory). The only minor deviation is get_token_stats, but token_stats is a noun phrase, so it still fits the pattern.
With 13 tools covering skills, references, memory, context guides, agents, search, and token statistics, the count is well-scoped for a platform knowledge agent. Each tool serves a specific purpose without unnecessary redundancy.
The tool set provides comprehensive read access to all documented knowledge types (skills, references, memory, context guides, agents) and includes both listing and detailed retrieval, plus cross-cutting search and token usage stats. No obvious gaps for the stated purpose of exploring platform knowledge.
Maintenance
Related MCP Connectors
Hosted MCP server and Agent Skills for specs, engineering threads, and project memory.
Skills, agents and memory in the cloud, plus a gateway to your other MCP servers.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceA standalone MCP server that enables research (web search, URL fetch, news), workspace management (file operations, command execution), and self-extension via markdown-based skills.21MIT
- AlicenseNot gradedqualityCmaintenanceDual-interface MCP server that exposes declarative tools and reusable skills via standard MCP protocol and provides a REST API for authoring them.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceAn MCP server that enables AI agents to interact with the SkillShare registry, including searching, reading, creating, and managing resources like skills, MCP configurations, and notes.MIT
- AlicenseNot gradedqualityDmaintenanceA local MCP server that provides shared, real-time context across multiple AI agents via WebSocket and MCP resource notifications, enabling collaborative workspaces, memory, tasks, and messaging.26 npm2MIT