npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@emergent-wisdom/understanding-graph-mcp-server

v0.1.15

Published

MCP server for persistent, revisable understanding graphs

Readme

@emergent-wisdom/understanding-graph-mcp-server

MCP server for Understanding Graphs: persistent, typed state that preserves how an agent's attention, questions, hypotheses, decisions, and models evolve—not only the facts it encountered.

Quick start

Add the server to an MCP client:

{
  "mcpServers": {
    "understanding-graph": {
      "command": "npx",
      "args": ["-y", "@emergent-wisdom/understanding-graph-mcp-server"],
      "env": {
        "PROJECT_DIR": "/absolute/path/to/projects",
        "TOOL_MODE": "general"
      }
    }
  }
}

PROJECT_DIR contains one SQLite-backed graph per project. A fresh directory stays empty until project_switch creates a deliberately named project. Set DEFAULT_PROJECT only when the host explicitly wants to load or create that named project at startup.

ANI (graph_chaos and the blind graph_discover path) reads a word list installed on the host machine. The server autodetects conventional paths such as /usr/share/dict/words; set UG_ANI_DICTIONARY_PATH to an absolute newline-delimited word-list file on other machines. No dictionary corpus or reduced fallback is bundled with the package.

Understanding, not transcription

The graph is a cognitive autobiography composed for future continuation. At self-selected Thought Moments, an agent may preserve a rich, user-visible account of what became salient: surprise, hesitation, association, ethical or emotional weight, alternatives, predictions, experiments, unresolved questions, and later revisions. It should not create notes by quota or pretend that every encounter caused a neat belief shift.

This testimony is not represented as access to hidden model computation. Its value is behavioral: a later model can re-enter it, test it against new evidence, and make different work because of it.

The thinking trigger has a narrower meaning. It is reserved for reconstructed synthetic Reader/CMP pretraining blocks and is available only in TOOL_MODE=synthetic_reader. Those blocks and their incident relations are hidden from and immutable to ordinary modes; ordinary reading, writing, and coding use the other typed cognitive nodes.

Understanding mode

The graph is the working medium, not a log. Preserve communicable, material understanding that could matter to the work or a future inquiry: questions, interpretations, alternatives, relations, evidence, reasons, uncertainty, decisions, revisions, and artifact intent—not only conclusions. This is authored, user-visible testimony, never hidden token-level chain-of-thought.

Models may work directly with graph_understand, graph_batch, and the other tools, or optionally call graph_suggest_next({ task, workflow, focusNodeIds? }) when graph-specific pointers could deepen or diversify understanding, recover neglected material, test the current view, or expose a useful connection. The server computes state- and workflow-dependent pressure, down-weights recently suggested action kinds, samples a small set without replacement, and returns only those concrete routes with weights and reasons. The model judges task fit and may choose, combine, modify, reject, replace, or skip every route. Set UG_GUIDANCE_MODE=direct to suppress automatic next-move prompts while keeping the endpoint callable. Pass creativity: false to keep ordinary guidance while omitting bisociation, grounded random comparison, ANI, disruption, and temporary forcing from that particular roll. The creativity tools remain directly callable.

There is no required cognitive state machine. The model may read, search, make, test, connect, disrupt, re-enter, revise, preserve, or pause in whatever order the work warrants.

Local clients may call project_list and project_switch before orientation when a different graph is needed. Hosted graph connections are already bound to one authorized graph and do not expose project switching.

graph_understand.workflow supports reading, research, coding, collaborative_coding, writing, and general (plus explicit auto inference).

Mutation contract

Direct concept and edge mutations are operations inside graph_batch; they are not separate top-level MCP tools. Relevant workflow modes also expose document helpers at the top level. Use graph_batch whenever related document, concept, and edge changes must land together: every batch requires a commit_message and the actual committing agent_name, and runs atomically.

graph_batch({
  commit_message: "The failing boundary test changed the interval model",
  agent_name: "coding-agent",
  operations: [
    {
      tool: "graph_add_concept",
      params: {
        title: "Adjacent windows need half-open intervals",
        trigger: "decision",
        understanding:
          "Use start <= event < end so an event belongs to one window.",
        why: "The generated test double-counted a boundary event"
      }
    },
    {
      tool: "graph_connect",
      params: {
        from: "$0.id",
        to: "n_test_evidence",
        type: "learned_from",
        why: "This exact failing test caused the revision"
      }
    }
  ]
})

Use exact parameter names: title, trigger, understanding, why for a concept; from, to, type, why for an edge. New concepts must be connected to the graph. Workflow tools such as source_read manage their own atomic updates.

Tool modes

TOOL_MODE is an enforced allow-list, not merely a display filter:

| Mode | Intended work | |---|---| | general | Safe cross-domain understanding, sources, and artifacts (default) | | reading | Chronological sources and passage-grounded understanding | | research | Reading plus solver coordination | | coding | Graph-native code documents, generation, and tests | | collaborative_coding | Coding plus ownership, locks, and handoffs | | writing | Graph-backed manuscripts and editorial revision | | full | Explicit broad access, including administrative tools | | synthetic_reader | Reserved production/signing/translation of Reader/CMP thinking blocks |

Ordinary modes—including full—reject hidden or nested attempts to create a reserved thinking block.

Important tools

| Tool | Purpose | |---|---| | graph_suggest_next | Optional aid that samples state-dependent concrete provocations for the model to judge | | graph_understand | Build a deterministic task-conditioned re-entry packet | | graph_batch | Apply a committed, atomic set of graph mutations | | graph_skeleton / graph_context | Inspect graph structure and local state | | graph_semantic_search | Find relevant prior state; lexical fallback works without embeddings | | graph_bisociate | Use spreading activation and information gain to surface candidate cross-context connections | | graph_discover_grounded | Compare distant graph material; an honest no-connection result is valid | | graph_discover / graph_chaos | Optional blind ANI using a machine-local dictionary | | graph_random | Sample concrete provocations or run a temporary Physics What-If; preserve only what survives scrutiny | | graph_evaluate_variations | Rank alternatives with the experimental Novelty Score | | graph_thermostat | Advisory entropy-style pulse for choosing convergence, continuation, or divergence | | graph_history | Inspect commits, agents, and mutation events | | source_load / source_read | Encounter a source chronologically and persist exact passages | | doc_read / doc_get_tree | Navigate graph-native artifacts | | doc_generate / doc_generate_all | Project document nodes into executable or readable files | | graph_score | Check structural integrity; not semantic correctness |

source_load.filePath is limited to UG_SOURCE_ROOT, which defaults to the server working directory. Pass text as content or set that host-controlled root explicitly when sources live elsewhere.

Synthesis is normally an operation, not a catch-all node type. Store its result as what it became: analysis for a stabilized integration, model for a general mechanism, hypothesis for a provisional unification, decision for a choice, evaluation for a judgment, or leave the tension/question open. The mutating synthesis helpers graph_serendipity, graph_validate, and graph_decide are nested graph_batch operations, never top-level calls; the outer batch owns their transaction and commit.

License and repository

MIT — see LICENSE. Repository: https://github.com/emergent-wisdom/understanding-graph