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

@skedulo/se-memory-hub-mcp

v0.3.0

Published

MCP server for the SE AI Memory Hub: recall and save developer memory from Claude Code and Claude Desktop.

Readme

memory-hub-mcp

Local stdio MCP server wrapping memory-hub.

memory_getSkillGuide serves skill-guide.md (this package's own file, read fresh on every call) as the current usage guide for the se-ai-memory-hub skill. The skill's own SKILL.md is a thin stub that just tells Claude to call this tool — the actual guidance lives here so it updates on the next yarn build, not via a manual cp into ~/.claude/skills/. Edit skill-guide.md directly; never hand-copy its content elsewhere.

Setup

  1. Generate a personal Skedulo API token in Pulse Web.
  2. Put your token in this project's .claude/settings.local.json (gitignored — never commit it), under env:
    { "env": { "MEMORY_HUB_MCP_TOKEN": "<your personal token>" } }
    .mcp.json (committed) intentionally does NOT reference this token — Claude Code does not substitute arbitrary ${VAR} placeholders inside a project-scoped .mcp.json's env block (it only substitutes ${CLAUDE_PLUGIN_ROOT}/${CLAUDE_PLUGIN_DATA}/${CLAUDE_PROJECT_DIR}); an earlier version of this config tried "MEMORY_HUB_MCP_TOKEN": "${MEMORY_HUB_TOKEN}" and it was passed through as that literal, unresolved string, causing every call to 401. The MCP server process inherits MEMORY_HUB_MCP_TOKEN from Claude Code's own ambient environment instead — which is exactly what settings.local.json's env block populates. MEMORY_HUB_FUNCTION_URL defaults to the team's one deployed tenant (https://dev-api.test.skl.io/function/memory-hub/memory-hub, hardcoded in src/index.ts) and does not need to be set. It's not a secret either way — only set it in .mcp.json's env block if you need to point at a different tenant (e.g. a local sked function dev instance).
  3. yarn install && yarn build
  4. The server is already registered for this project via the repo's committed .mcp.json (pointed at node dist/index.js) — nothing to add there. After editing settings.local.json, restart the MCP server (or the whole session) so it picks up the token — a running server process keeps whatever environment it was spawned with; editing the file doesn't hot-reload it.
  5. To use memory-hub from any project (not just this one), it's also registered globally in ~/.claude.json under mcpServers, pointed at this repo's built memory-hub-mcp/dist/index.js by absolute path. Keep the two in sync manually — the global entry isn't generated from .mcp.json and won't pick up changes to it. Either way, a stale dist/ means a stale server: run yarn build here after pulling source changes, then restart the MCP connection (both entries run the same built file, so one rebuild covers both).

Claude Desktop

The MCP server is plain stdio, so Claude Desktop can run it. The memory-hub-hook package cannot — Claude Desktop has no hook system — so startup recall and end-of-session auto-save have no equivalent there. Two consequences, both permanent until Desktop grows hooks:

  • Recall is covered by the memory_sessionContext tool plus the server's instructions, which ask Claude to call it once at the start of a conversation. Nothing fires it automatically; if a conversation starts cold, ask for it.
  • Auto-save has no substitute. Desktop emits no end-of-conversation event, and session-stop.sh shells out to claude -p --resume, which is CLI-only. Anything worth keeping must be saved with memory_save before the conversation ends.

Install and set up

Two commands, no config file to edit. No GitHub access, no git clone, no build step, no npm account:

npm install -g @skedulo/se-memory-hub-mcp
memory-hub-mcp setup

setup asks which host you use — Claude Code, Claude Desktop, or both (--code / --desktop / --both skip the prompt) — then logs you in with the same browser OAuth sked itself uses and mints a personal token from that session. For Claude Code it does everything scripts/setup-dev.sh does for contributors: registers the MCP server in ~/.claude.json, puts the token in ~/.claude/settings.json, installs the SessionStart hook into ~/.claude/memory-hub-hook/ and registers it (appending, never stacking duplicates), and syncs SKILL.md into ~/.claude/skills/se-ai-memory-hub/. For Claude Desktop it writes claude_desktop_config.json — no hook, because Desktop has none. Every file is merged, never clobbered, and a .bak is left behind. Then it makes one real call to confirm the token works before it says done.

If sked isn't installed it falls back to pasting a token you generated at Pulse Web → Settings → Developer tools → API tokens. It never mints a token you didn't ask for.

Then restart Claude Code, or quit Claude Desktop completely and reopen it.

Installing the package is not the same as having access: every call is authorised by your personal Skedulo API token, and the package is useless without one.

Re-run memory-hub-mcp setup anytime — it keeps a token that's already configured.

Add to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "memory-hub": {
      "command": "/absolute/path/to/memory-hub-mcp",
      "env": { "MEMORY_HUB_MCP_TOKEN": "<your personal token>" }
    }
  }
}

The path must be absolute — which memory-hub-mcp. Desktop launches the server with a minimal PATH and does not source your shell profile, so a bare command name fails under nvm or Homebrew. For the same reason the token has to live in the env block; Desktop won't inherit it from your shell.

Working on this repo instead of just using it? Follow Setup above and point the config at dist/cli.js; the npm package is for consumers.

Desktop starts the server with no project directory, so repo detection returns nothing: memory_sessionContext comes back with repoScoped: false and no repo-scoped facts, wiki or skills, and memory_save defaults to Private visibility. That is a supported shape, not a degraded one — it is the right default for work that isn't tied to a Skedulo repo (estimation, design, discovery). memory_linkRepoTeam and memory_checkRepoStatus will not work from Desktop.

Tags

memory_save/memory_recall's tags parameter is a fixed picklist matching the AgentFacts/AgentSkills custom objects' Tags field exactly: ConnectedFunction, HorizonComponent, TriggeredAction, ObjectModel, MobileExtension, Deployment, Auth, Testing, Other. The tool's Zod schema enforces this — any other value fails validation before the request reaches the connected function (which otherwise 400s with no indication of what went wrong). If the underlying Picklist's allowedValues ever changes, update TAG_VALUES in src/index.ts to match.