@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.
Maintainers
Keywords
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
- Generate a personal Skedulo API token in Pulse Web.
- Put your token in this project's
.claude/settings.local.json(gitignored — never commit it), underenv:{ "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'senvblock (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 inheritsMEMORY_HUB_MCP_TOKENfrom Claude Code's own ambient environment instead — which is exactly whatsettings.local.json'senvblock populates.MEMORY_HUB_FUNCTION_URLdefaults to the team's one deployed tenant (https://dev-api.test.skl.io/function/memory-hub/memory-hub, hardcoded insrc/index.ts) and does not need to be set. It's not a secret either way — only set it in.mcp.json'senvblock if you need to point at a different tenant (e.g. a localsked function devinstance). yarn install && yarn build- The server is already registered for this project via the repo's committed
.mcp.json(pointed atnode dist/index.js) — nothing to add there. After editingsettings.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. - To use
memory-hubfrom any project (not just this one), it's also registered globally in~/.claude.jsonundermcpServers, pointed at this repo's builtmemory-hub-mcp/dist/index.jsby absolute path. Keep the two in sync manually — the global entry isn't generated from.mcp.jsonand won't pick up changes to it. Either way, a staledist/means a stale server: runyarn buildhere 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_sessionContexttool plus the server'sinstructions, 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.shshells out toclaude -p --resume, which is CLI-only. Anything worth keeping must be saved withmemory_savebefore 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 setupsetup 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.
