Atlas / MCP servers / hraness / wordcell

wordcellCAUTION

mcp/hraness/wordcell

Wordcell keeps decisions, plans, and sources as Markdown beside your code, so coding agents can find them from the file they are about to change.

Verdict
CAUTION
Grade
D
Trust score
60 /100
Exposed tools
14 7r · 6w · 1d
Transport
streamable-http
License
MIT
Stars
16
01

Overview

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

🧠 Wordcell hands the next agent session what this one learned. Decisions, plans, and sources live as Markdown files beside your code. Tie a note to the paths it explains, and an agent about to change that code gets the note first. Search matches exact words or meaning, with an optional local model, and every index rebuilds from files you can read in any editor. Ask your agent to set it up: https://wordcell.io

[](https://github.com/hraness/wordcell/tree/main/skills/wordcell)

Wordcell is a Markdown knowledge base and local MCP memory server for coding agents such as Claude Code, Codex, and Cursor. It keeps decisions, plans, and sources as Markdown files beside your code, and agents find them by exact words, by meaning with an optional local model, or from the file they are about to change.

A new coding-agent session needs the reasons behind the code it is changing. Wordcell keeps the decision, its supporting sources, and the plan that puts it into practice in a connected set of Markdown files. Tie a note to a repository path, and the next agent can recover that context before it edits the file. When an assumption changes, update the decision and keep its earlier reasoning in Git.

Captured sources preserve what you read, maintained notes explain what you currently understand, and plans record the work and its results. Named relationships such as evidenced-by and supersedes make those connections available to the embedded Oh graph engine, whose results point back to the supporting files. Optional local semantic search helps when the words in a question differ from the note; Git history connects the explanation to its commits and accompanying code changes.

Use the CLI, local MCP server, or TypeScript SDK from your existing agent and editor. The public Agent Skill teaches agents to recover context, maintai

Read from source at commit 30d765618f5dOBSERVED · 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 story-film --env KB_TLS_FIXTURE_KEY=${KB_TLS_FIXTURE_KEY} --env NEXT_PUBLIC_POSTHOG_KEY=${NEXT_PUBLIC_POSTHOG_KEY} --env WORDCELL_OBJECTS_SECRET=${WORDCELL_OBJECTS_SECRET} -- npx -y story-film
claude-desktop
{
  "mcpServers": {
    "story-film": {
      "command": "npx",
      "args": [
        "-y",
        "story-film"
      ],
      "env": {
        "KB_TLS_FIXTURE_KEY": "${KB_TLS_FIXTURE_KEY}",
        "NEXT_PUBLIC_POSTHOG_KEY": "${NEXT_PUBLIC_POSTHOG_KEY}",
        "WORDCELL_OBJECTS_SECRET": "${WORDCELL_OBJECTS_SECRET}"
      }
    }
  }
}
03

Exposed tools (14)

7 read · 6 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
add_relationwriteAdd a typed relation from one note to another in the source note
backlinksreadNotes that link to this note, with the linking edges and authored relations.
contextwriteAgent guides, context notes, and repository memory records that apply to a file or directory
create_notewriteCreate a new Markdown note with frontmatter. Never overwrites: an existing note is an error.
create_tokenwriteMint a wc_pub_ capability token (self-serve, IP-limited). The token is
delete_sitedestructiveUnpublish a site conditionally and retain a deletion receipt. Shared artifact bytes remain stored.
get_notereadRead one note as frontmatter, body, and revision. Pass revision as expected_revision to
get_sitereadRead the current site revision, or reconcile an operation ID after an uncertain write. Requires Bearer wc_pub_ authorization.
linksreadNotes linked from or to this note, with the edges and authored relations between them.
list_notesreadList notes with their frontmatter, filtered by frontmatter fields, tags, and repository scopes.
list_sitesreadList the token
publish_sitewritePublish a bounded Markdown vault as a public site. files maps vault
searchreadSearch the vault. Hybrid mode joins exact matches with local semantic search (QMD); each hit keeps
update_note_bodywriteReplace the Markdown after a note
04

Trust audit

CAUTIONgrade D · trust 60/100 Install with care. The audit found things worth knowing before you trust its output.

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

What the source does

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

Findings (25)

MEDIUMInventory / provenance · inv.binary · CWE-1104
src/publish-graph.ts
publish-graph.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
dist/index-w2zc0vwa.js:551
url: `http://127.0.0.1:${address.port}`,
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
src/clip/metadata-search-tool/src/duckduckgo.rs:532
let encoded = "1f8b08000000000002ffedc13101000000c2a0da8b6f0c1fa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/clip/media.test.ts:351
const secret = "super-secret-cookie-value";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/clip/media.test.ts:411
const secret = "do-not-leak-this-value";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/note-lock.test.ts:156
token: "11111111-1111-4111-8111-111111111111",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/note-lock.test.ts:199
token: "22222222-2222-4222-8222-222222222222",
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_site
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.binary · CWE-1104
site/lib/hosted/publish.ts
publish.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/npm-package-identity.ts:111
return createHash("sha1").update(bytes).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/npm-release-workflow.test.ts:38
return createHash("sha1").update(bytes).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/package-smoke.ts:280
const actualShasum = createHash("sha1").update(archiveBytes).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/prepare-npm-package.ts:235
const actualShasum = createHash("sha1").update(archiveBytes).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
site/tests/hosted-operations.test.ts:36
this.objects.set(key, { bytes, etag: `"${createHash("md5").update(bytes).digest("hex")}"`, contentType });
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
site/app/api/v1/health/route.ts:1
import { apiOk, apiUnavailable } from "../../../../lib/hosted/errors";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
site/app/api/v1/health/route.ts:2
import { hostedConfig } from "../../../../lib/hosted/config";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
site/app/api/v1/health/route.ts:3
import { ObjectStore } from "../../../../lib/hosted/store";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
site/app/api/v1/health/route.ts:4
import { HOSTED_PACKAGE_VERSION } from "../../../../lib/hosted/reader.generated";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
site/app/api/v1/mcp/route.ts:1
import { apiError } from "../../../../lib/hosted/errors";
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/clip/network.test.ts:1143
resolveHostname: () => Promise.resolve([publicAddress, { address: "169.254.169.254", family: 4 }]),
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:258
Open `http://127.0.0.1:8080`. You get readable pages, linked notes, and search
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/getting-started.md:124
Open `http://127.0.0.1:8080` to read the two pages and search them in the
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/publish.md:37
Open `http://127.0.0.1:8080` to inspect the pages. Nothing is publicly hosted
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
site/scripts/owned-browser.test.ts:210
for (const origin of ["http://127.0.0.1:1","http://127.0.0.1:12345","http://127.0.0.1:65535"]) {
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
site/app/social-icon.ts:8
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3MjAgNDcxIiB3aWR0aD0iNzIwIiBoZWlnaHQ9IjQ3MSI+CiAgPHBhdGggZD0iTTAgMCBDMS4wMDUxIC0wLjAwNTQgMi4wMTAzIC0wL

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha 30d765618f5dfull audit observations/trust-audit/mcp-server/hraness__wordcell.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-1030d765618f5dCAUTIOND60first audit
06

Questions

What is the wordcell MCP server?

Wordcell keeps decisions, plans, and sources as Markdown beside your code, so coding agents can find them from the file they are about to change.

What tools does wordcell expose?

14 in total: 7 read-only, 6 that write, and 1 that can delete or overwrite (delete_site). Every one is listed on this page with its risk.

Is wordcell safe to connect to an agent?

With care. The audit graded it D (60/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found 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 wordcell need?

It reads KB_TLS_FIXTURE_KEY, NEXT_PUBLIC_POSTHOG_KEY and WORDCELL_OBJECTS_SECRET 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 wordcell run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as story-film.

How current is this page?

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

Advertisement