Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "zep-memory",
"owner": {
"name": "Zep",
"url": "https://www.getzep.com"
},
"metadata": {
"description": "Cursor marketplace for the Zep Memory plugin. The plugin package lives in this same repository.",
"pluginRoot": "plugins"
},
"plugins": [
{
"name": "zep-memory",
"source": "zep-memory",
"description": "Long-term memory for knowledge work via the Zep Memory MCP server.",
"category": "productivity",
"keywords": [
"zep",
"agent-memory",
"mcp",
"knowledge-work"
]
}
]
}
38 changes: 33 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

This repository hosts marketplace catalogs at the root and **one plugin
package** at `plugins/zep-memory/`. That directory is the plugin root for
Agent Plugins 1.0.0, Claude Desktop Chat / Cowork, and ChatGPT Work.
Agent Plugins 1.0.0 (including Cursor), Claude Desktop Chat / Cowork, and
ChatGPT Work.

## Package architecture

Expand All @@ -27,11 +28,16 @@ Agent Plugins 1.0.0, Claude Desktop Chat / Cowork, and ChatGPT Work.
positioned for Codex coding workflows.
- Keep every `.mcp.json` and `mcp.json` pointed at the production Zep Memory MCP
endpoint `https://api.getzep.com/mcp` (HTTP / `streamable-http` as required).
- Do not add Cursor packaging unless the product scope explicitly expands.
- Cursor loads the Agent Plugins package as-is. Do not add
`plugins/zep-memory/.cursor-plugin/` unless we need Cursor-only components
(rules, agents, commands, hooks, or variables). Auth stays client-managed
OAuth; do not put API keys or `${VAR}` headers in `mcp.json`.
- This repository hosts its own marketplace catalogs
(`.claude-plugin/marketplace.json` and `.agents/plugins/marketplace.json`).
Plugin `source` entries must stay same-repo paths so install does not require
a second GitHub clone. Both catalogs point at `./plugins/zep-memory`.
(`.claude-plugin/marketplace.json`, `.agents/plugins/marketplace.json`,
and `.cursor-plugin/marketplace.json`). Plugin `source` entries must stay
same-repo paths so install does not require a second GitHub clone. Claude
and ChatGPT catalogs point at `./plugins/zep-memory`; the Cursor catalog
uses `metadata.pluginRoot` `plugins` and `source` `zep-memory`.

## Releasing

Expand Down Expand Up @@ -121,3 +127,25 @@ Official public listing. Submit through the OpenAI plugin submission portal
GitHub does not update the live directory listing by itself. Skills may be
snapshotted at review time; live MCP tool calls still hit the production
Memory MCP endpoint.

#### Cursor — local install and team marketplace

Cursor loads Agent Plugins from `plugins/zep-memory/` with no extra per-plugin
manifest. Local development:

```bash
mkdir -p ~/.cursor/plugins/local
ln -s "$(pwd)/plugins/zep-memory" ~/.cursor/plugins/local/zep-memory
```

Reload the Cursor window, then confirm the skill and MCP server under
**Customize**. The Memory MCP server uses OAuth; the first tool call should
open Zep sign-in.

- **Team marketplace:** import this GitHub repository. Cursor reads
`.cursor-plugin/marketplace.json` and resolves `source` `zep-memory` under
`pluginRoot` `plugins`.
- **Official Cursor Marketplace (later):** submit the repository at
[cursor.com/marketplace/publish](https://cursor.com/marketplace/publish).
Inclusion and updates are a Cursor review process, not "merge this repo and
it ships."
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ All notable changes to the Zep Memory plugin.
same-repo plugin sources. Install with
`claude plugin marketplace add getzep/zep-memory-plugin` then
`claude plugin install zep-memory@zep-memory`.
- Document Cursor as an Agent Plugins host (no extra per-plugin Cursor
manifest). Add `.cursor-plugin/marketplace.json` so this repo can be
imported as a Cursor team marketplace pointing at `plugins/zep-memory`.

## 0.2.10 — 2026-08-14

Expand Down
38 changes: 28 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Zep Memory

Knowledge-work plugin for **Claude Desktop Chat**, **Claude Cowork**, and
**ChatGPT Work**. Not positioned for Claude Code, Codex, Cursor, or other
developer-tool surfaces.
Knowledge-work plugin for **Claude Desktop Chat**, **Claude Cowork**,
**ChatGPT Work**, and **Cursor**. Not positioned for Claude Code, Codex, or
other coding-agent CLIs.

Bundles:

Expand All @@ -15,8 +15,9 @@ Bundles:
- Teach knowledge-work assistants to use Zep as durable memory
- LLM-written memories via MCP tools are the v1 write path (hooks /
auto-ingest of every message are out of scope)
- Internal rollout first via Claude Team / Enterprise and ChatGPT workspace
distribution; public marketplace later
- Internal rollout first via Claude Team / Enterprise, ChatGPT workspace
distribution, and Cursor local / team-marketplace install; public
marketplace later
- Docs follow-up: install instructions on the Memory MCP docs page

## Packaging note
Expand All @@ -27,23 +28,40 @@ marketplace `source.path` of `"./"`). That directory conforms to
portable package, `skills/` contains the skill, and `mcp.json` declares
the Memory MCP server using the standard `streamable-http` transport.

Claude and OpenAI compatibility does not depend on either vendor adopting that
standard. The same folder also holds `.claude-plugin/`, `.codex-plugin/`, and
`.mcp.json`.
Cursor loads that Agent Plugins package as-is. Claude and OpenAI compatibility
does not depend on either vendor adopting the standard. The same folder also
holds `.claude-plugin/`, `.codex-plugin/`, and `.mcp.json`.

`.codex-plugin/` is the ChatGPT Work package format. Keeping that manifest does
not mean this plugin targets Codex as a coding product.

## Repository and distribution

This repository is the catalog plus that one package. Both marketplace
entries point at `./plugins/zep-memory`.
This repository is the catalog plus that one package. Marketplace entries
point at `./plugins/zep-memory` (Claude and ChatGPT Work) or `plugins/zep-memory`
(Cursor, via `pluginRoot`).

```bash
claude plugin marketplace add getzep/zep-memory-plugin
claude plugin install zep-memory@zep-memory
```

### Cursor (local test)

Symlink the plugin root — not this repository root — into Cursor's local
plugin directory, then reload:

```bash
mkdir -p ~/.cursor/plugins/local
ln -s /absolute/path/to/zep-memory-plugin/plugins/zep-memory ~/.cursor/plugins/local/zep-memory
```

Then in Cursor: **Developer: Reload Window**. Open **Customize** and confirm
the `zep-memory` skill and MCP server are present. The first Memory MCP call
should prompt for Zep OAuth (work email → IdP → project).

You can also import this GitHub repository as a Cursor team marketplace;
`.cursor-plugin/marketplace.json` points at the same plugin root.

## Releasing

Expand Down
18 changes: 17 additions & 1 deletion scripts/plugin_manifests.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Keep Zep Memory's Claude and ChatGPT Work manifests synchronized.
"""Keep Zep Memory's Claude, ChatGPT Work, and Cursor catalogs synchronized.

Usage:
python3 scripts/plugin_manifests.py --check
Expand Down Expand Up @@ -82,6 +82,11 @@ class PluginSpec:
"entry",
"marketplace entries must not declare version",
),
(
".cursor-plugin/marketplace.json",
"entry",
"marketplace entries must not declare version",
),
]

MARKETPLACE_SITES: list[tuple[str, str, object]] = [
Expand All @@ -91,6 +96,7 @@ class PluginSpec:
"zep-memory",
{"source": "local", "path": "./plugins/zep-memory"},
),
(".cursor-plugin/marketplace.json", "zep-memory", "zep-memory"),
]

# Repo-root leftovers from when the Agent Plugins / Claude package lived at ./
Expand Down Expand Up @@ -299,6 +305,16 @@ def check_marketplaces(problems: list[str]) -> None:
f"{rel_path}: plugins[{plugin_name}].source must be "
f"{expected_source!r}, got {source!r}"
)
if rel_path == ".cursor-plugin/marketplace.json":
metadata = data.get("metadata")
plugin_root = (
metadata.get("pluginRoot") if isinstance(metadata, dict) else None
)
if plugin_root != "plugins":
problems.append(
f"{rel_path}: metadata.pluginRoot must be 'plugins', "
f"got {plugin_root!r}"
)


def check() -> int:
Expand Down
Loading