Atlas / MCP servers / projectaj14 / eklavya

eklavyaBLOCK

mcp/projectaj14/eklavya

Learn while your agent works. A Claude Code plugin that quizzes you on the concepts behind the code it just wrote — local knowledge graph, spaced repetition, optional commit gate.

Verdict
BLOCK
Grade
F
Trust score
43 /100
Exposed tools
22 18r · 3w · 1d
Transport
stdio
License
MIT
Stars
10
01

Overview

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

Learn while your agent works — and carry project context forward.

[Visit the website →](https://eklavya-run.web.app/)

Watch a short example session.

Named for Ekalavya, who mastered archery practicing before a silent statue of his guru. Here, the statue talks back.

[](https://www.npmjs.com/package/eklavya) [](LICENSE) [](https://nodejs.org)

Eklavya is a plugin for Claude Code. It does two jobs:

  1. It helps you understand the code Claude writes. It asks you short

questions about the work, while the work happens.

  1. It remembers what happened in your project. The next time you open

Claude, it can recall what you did last time.

Your learning history and memory are stored on your computer. There is no Eklavya account. Eklavya sends anonymous daily usage counts, never code, paths, names or text. Every field is listed, and eklavya telemetry off stops them. New installs use claude-sonnet-5 through your Claude Code login for memory summaries and prompt feedback, so captured session evidence goes to that model. [Memory and data](https://eklav

Read from source at commit bd0788d18163OBSERVED · 2026-10-11
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
claude mcp add eklavya-site --env OPENAI_API_KEY=${OPENAI_API_KEY} -- npx -y eklavya-site
claude-desktop
{
  "mcpServers": {
    "eklavya-site": {
      "command": "npx",
      "args": [
        "-y",
        "eklavya-site"
      ],
      "env": {
        "OPENAI_API_KEY": "${OPENAI_API_KEY}"
      }
    }
  }
}
03

Exposed tools (22)

18 read · 3 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
EklavyareadYour Eklavya learning progress, project memory, artifacts and settings.
authreadauth work
creadagain
code_find_symbolreadWhere a name is DECLARED across this repository, with the file, the line and the declaration itself. Declarations only, not every mention — a list of call sites answers a different question. Scoped to this project. ${CEILING}
code_outlinereadThe declarations in one file, with line numbers — classes, functions, types, tables — so you can choose what to read instead of reading all of it. Pass
eklavya-panelreadOpen the Eklavya quiz panel
get_concept_graphwriteConcepts and edges for a domain in prerequisite order — the order to teach them in. Optionally annotated with this learner\
get_configreadThe effective Eklavya config: global ~/.eklavya/config.json merged with this project\
memory_collectionsreadNamed, saved views over this project
memory_correctreadReplace a wrong or outdated entry. The original is never edited: the stale claim keeps its evidence links and its place in the audit trail, and only the replacement is returned by retrieval. ${OWN_RULE}
memory_deletedestructiveRemove an entry from retrieval. Soft by default — the row stays in the timeline as a deletion, its search index and vector do not.
memory_file_historyreadEvery remembered entry that touched a file, newest first — what this file has already been through before you change it. Matches on a path fragment, so
memory_getreadRead the full entries behind ids from memory_search or memory_timeline: narrative, facts, files, tags and the evidence events each claim came from. Pass the receipt_id a recall block carried (its receipt=
memory_searchreadFind past work by meaning or keyword. Returns identifiers and titles only — call memory_get with the ids that look relevant to read the narrative. ${SCOPE_RULE} ${EVIDENCE_RULE}
memory_statusreadCapture and processing health: how much is remembered, how much evidence is still waiting, the job queue, the reuse saving, and which summarizer is running. Answer
memory_timelinereadWhat happened in this project, newest first — compact rows, stable under paging with offset. Includes superseded entries, so it is the audit trail rather than the retrieval view. ${SCOPE_RULE} ${EVIDENCE_RULE}
memory_writewriteRecord something worth remembering that no tool call would have captured — a decision, a constraint, a dead end. Secrets are redacted before it is stored. ${SCOPE_RULE}
panel_answerreadCalled only by the Eklavya panel, never by the model. Grades and records one answer exactly once: kind
present_questionreadHand one multiple-choice question to the Eklavya side panel and return at once. Use it instead of AskUserQuestion only when the plan says presentation
record_attemptreadGrade one answer on the 0-5 SM-2 scale and persist it, returning its attempt_id. Updates mastery, the next review date, the session gate and this project\
set_configwriteUpdate Eklavya config. Scope
upsert_conceptsreadGrow the knowledge graph when work touches a concept that has no slug yet. Slugs are normalized and near-duplicates are folded into the existing concept, so check the returned canonical slug before using it.
04

Trust audit

BLOCKgrade F · trust 43/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)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

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

Findings (25)

HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp/src/memory/privacy.ts:29
'/.ssh/',
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp/src/memory/privacy.ts:30
'id_rsa',
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp/src/memory/privacy.ts:31
'id_ed25519',
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp/src/memory/privacy.ts:36
'.netrc',
Why it matters. touches a credential store
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
eval/dashboard.mjs:148
.listen(port, '127.0.0.1', () => process.stdout.write(`eval dashboard: http://127.0.0.1:${port}  (scanning ${root})\n`));
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
mcp/test/memory-privacy.test.ts:51
['postgres://app:[email protected]:5432/app', 'pa55word'],
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
mcp/test/memory-privacy.test.ts:54
['MONGO=mongodb+srv://u:[email protected]', 'm0ng0pw'],
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
mcp/test/memory-capture.test.ts:17
const SECRET = 'ghp_abcdefghijklmnopqrstuvwxyz0123';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
mcp/test/memory-hardening.test.ts:161
const SECRET = 'ghp_abcdefghijklmnopqrstuvwxyz0123';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
mcp/test/memory-privacy.test.ts:293
const SECRET = 'ghp_abcdefghijklmnopqrstuvwxyz0123';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
mcp/test/memory-tools.test.ts:270
const token = 'ghp_abcdefghijklmnopqrstuvwxyz012345';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
mcp/test/telemetry.test.ts:48
const secret = '/Users/someone/private-repo';
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
mcp/test/memory-capture.test.ts:17
const SECRET = 'ghp_abcdefghijklmnopqrstuvwxyz0123';
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
mcp/test/memory-hardening.test.ts:161
const SECRET = 'ghp_abcdefghijklmnopqrstuvwxyz0123';
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
mcp/test/memory-notify.test.ts:87
body: 'deploy failed with GITHUB_TOKEN=ghp_abcdefghijklmnopqrstuvwxyz0123',
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
mcp/test/memory-notify.test.ts:90
expect(raw).not.toContain('ghp_abcdefghijklmnopqrstuvwxyz0123');
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
mcp/test/memory-privacy.test.ts:293
const SECRET = 'ghp_abcdefghijklmnopqrstuvwxyz0123';
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
mcp/test/memory-privacy.test.ts:147
const out = redact('-----BEGIN PRIVATE KEY-----\nabc\n-----END PRIVATE KEY-----\nafter');
MEDIUMHard-coded secrets · secret.stripe · CWE-798, CWE-321
mcp/test/memory-privacy.test.ts:45
['stripe sk_live_51HxAbCdEfGhIjKlMnOp', 'sk_live_51HxAbCdEfGhIjKlMnOp'],
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
memory_delete
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.firebaserc
.firebaserc
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.releaserc.json
.releaserc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
mcp/.c8rc.json
.c8rc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
mcp/test/feedback-issue.test.ts:16
const parseForm = (text: string) => yaml.load(text) as { name: string; title: string; body: Field[] };
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
mcp/test/feedback-issue.test.ts:39
expect(yaml.load(read('.github/ISSUE_TEMPLATE/config.yml'))).toEqual({ blank_issues_enabled: true });
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha bd0788d18163full audit observations/trust-audit/mcp-server/projectaj14__eklavya.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-11bd0788d18163BLOCKF43first audit
06

Questions

What is the eklavya MCP server?

Learn while your agent works. A Claude Code plugin that quizzes you on the concepts behind the code it just wrote — local knowledge graph, spaced repetition, optional commit gate.

What tools does eklavya expose?

22 in total: 18 read-only, 3 that write, and 1 that can delete or overwrite (memory_delete). Every one is listed on this page with its risk.

Is eklavya safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (43/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does eklavya need?

It reads OPENAI_API_KEY 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 eklavya run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as eklavya-site.

How current is this page?

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

Advertisement