Reverts the removal in 2a61fe1a. That commit dropped app_id, includes and
excludes from Add because docs/openapi.json does not declare them on
POST /v3/memories/add/. The schema is incomplete: probing the live endpoint
shows all three are accepted and honoured.
- app_id is persisted and is queryable via /v3/memories/search/ and
/v3/memories/, so the entity-id guard accepts it again as a valid scope
- includes/excludes demonstrably steer extraction. The same message stored
three memories unfiltered and one under
includes: "only record food and diet preferences"
Search and Get Many gain an App ID filter alongside User/Agent/Run. Writing
an app-scoped memory was otherwise unreadable from this node, and app_id is
how the OpenCode and Pi Agent plugins express project scope.
buildEntityFilters now takes the ids as an object rather than four adjacent
positional strings, so a fifth entity is a one-key change.
101 lines
4.6 KiB
Plaintext
101 lines
4.6 KiB
Plaintext
---
|
|
title: n8n
|
|
description: "Add long-term memory to n8n workflows and AI Agents with the Mem0 community node, no code required."
|
|
---
|
|
|
|
The [`@mem0/n8n-nodes-mem0`](https://www.npmjs.com/package/@mem0/n8n-nodes-mem0) community node brings [Mem0](https://mem0.ai) memory to [n8n](https://n8n.io). Add, search, and manage long-term memories inside any workflow, and use it as a tool for the n8n AI Agent.
|
|
|
|
## Overview
|
|
|
|
The node wraps the hosted Mem0 REST API and supports six operations on the **Memory** resource:
|
|
|
|
| Operation | Endpoint |
|
|
| --- | --- |
|
|
| **Add** | `POST /v3/memories/add/` |
|
|
| **Search** | `POST /v3/memories/search/` |
|
|
| **Get** | `GET /v1/memories/{id}/` |
|
|
| **Get Many** | `POST /v3/memories/` |
|
|
| **Update** | `PUT /v1/memories/{id}/` |
|
|
| **Delete** | `DELETE /v1/memories/{id}/` |
|
|
|
|
It is marked `usableAsTool`, so the n8n AI Agent (Tools Agent) can call it directly to remember and recall information.
|
|
|
|
## Installation
|
|
|
|
Install it like any n8n community node:
|
|
|
|
1. In n8n, go to **Settings → Community Nodes → Install**.
|
|
2. Enter `@mem0/n8n-nodes-mem0` and confirm.
|
|
|
|
The node then appears in the nodes panel under the AI category.
|
|
|
|
## Authentication
|
|
|
|
Create a **Mem0 API** credential in n8n:
|
|
|
|
- **API Key**: from the <a href="https://app.mem0.ai/dashboard/api-keys?utm_source=oss&utm_medium=integration-n8n" rel="nofollow">Mem0 API Key dashboard</a>. Sent as `Authorization: Token <key>`.
|
|
- **Base URL**: defaults to `https://api.mem0.ai`.
|
|
|
|
## Operations
|
|
|
|
### Add
|
|
|
|
Extracts and stores memories from one or more messages. Provide at least one entity id (**User ID**, or **Agent ID** / **App ID** / **Run ID** in Additional Fields); the node validates this before calling the API.
|
|
|
|
Additional Fields also expose:
|
|
|
|
| Field | Purpose |
|
|
| --- | --- |
|
|
| **Agent ID** | Scopes the memory to an agent |
|
|
| **App ID** | Scopes the memory to an app or project |
|
|
| **Run ID** | Scopes the memory to a single session or run |
|
|
| **Metadata (JSON)** | Arbitrary JSON attached to each extracted memory |
|
|
| **Infer** | On by default. Turn off to store messages verbatim instead of running LLM extraction |
|
|
| **Custom Instructions** | Free-text guidance steering what the extractor keeps or ignores, for this call |
|
|
| **Custom Categories** | JSON array of `{category: description}` objects, replacing the project-level catalog for this call |
|
|
| **Includes** | Only extract memories matching this description |
|
|
| **Excludes** | Skip memories matching this description |
|
|
|
|
**Includes** and **Excludes** filter what extraction keeps. Sending *"I am vegetarian and I never eat mushrooms. I drive a blue Toyota Corolla and my parking spot is B12"* stores three memories by default; with `Includes: "only record food and diet preferences"` it stores only the dietary one.
|
|
|
|
Extraction is asynchronous. **Wait for Completion** (on by default) polls the event until it finishes and returns the resulting memories; turn it off to return immediately with the event ID.
|
|
|
|
### Search
|
|
|
|
Semantic search over stored memories. Provide a **Query**, at least one entity id, and an optional **Limit**.
|
|
|
|
### Get Many
|
|
|
|
Lists stored memories for the entity ids you supply. Turn on **Return All** to page through every memory automatically; leave it off to fetch a single **Page**. **Page Size** applies either way.
|
|
|
|
### Entity filters on Search and Get Many
|
|
|
|
Both operations take **User ID**, **Agent ID**, **App ID**, and **Run ID**. At least one is required (the API rejects a query with no entity scope), and the node fails with a clear message before making the call if you leave all four empty.
|
|
|
|
Supply several and they are combined with **OR**, so the result set is the union of those scopes:
|
|
|
|
```json
|
|
{ "OR": [{ "user_id": "alice" }, { "agent_id": "support-bot" }] }
|
|
```
|
|
|
|
This is deliberate. Mem0 indexes each entity separately, so an `AND` across `user_id` and `agent_id` matches nothing even when a memory was written with both. To narrow rather than widen, run one operation per entity id.
|
|
|
|
### Get / Update / Delete
|
|
|
|
Operate on a single memory by **Memory ID**. Update accepts new **Text** and/or **Metadata (JSON)**.
|
|
|
|
## Choosing a `userId`
|
|
|
|
The `userId` is a stable string you choose to identify whose memories these are. It is not looked up in the dashboard. Common choices are your app's internal user ID, an email, or a UUID. Use the same value across Add, Search, and Get Many so recall works.
|
|
|
|
<CardGroup cols={2}>
|
|
<Card title="Zapier Integration" icon="bolt" href="/integrations/zapier">
|
|
Add memory to Zaps across thousands of apps
|
|
</Card>
|
|
<Card title="Flowise Integration" icon="blocks" href="/integrations/flowise">
|
|
Add memory to Flowise chatflows
|
|
</Card>
|
|
</CardGroup>
|
|
|
|
<Snippet file="star-on-github.mdx" />
|