How Team Memory Sharing Works in AgentMemory with TEAM_ID and USER_ID
AgentMemory isolates collaborative memories using TEAM_ID and USER_ID environment variables to create per-team KV namespaces, enabling multi-user sharing through the mem::team-share, mem::team-feed, and mem::team-profile functions.
AgentMemory is an open-source memory layer for AI agents that supports collaborative workflows through team-based memory isolation. When configured with TEAM_ID and USER_ID environment variables, the system creates isolated namespaces where multiple users can share observations, memories, and patterns within a common team boundary. This article examines the implementation details based on the rohitg00/agentmemory source code.
Configuring Team Mode with Environment Variables
Team functionality activates through environment-based configuration. The loadTeamConfig() function in [src/config.ts](https://github.com/rohitg00/agentmemory/blob/main/src/config.ts#L16-L23) reads TEAM_ID, USER_ID, and optional TEAM_MODE variables to instantiate a TeamConfig object.
When these variables are present, AgentMemory initializes internal team functions via registerTeamFunction(). The configuration propagates to all team-scoped operations, ensuring that every shared item carries the originating userId and belongs to the specified teamId.
The Team KV Namespace and Key Structure
The data layer uses a hierarchical key pattern to isolate team data. According to [src/state/schema.ts](https://github.com/rohitg00/agentmemory/blob/main/src/state/schema.ts#L20-L23), shared items reside under the namespace:
mem:team:{teamId}:shared
This convention ensures that team A cannot access team B's memories. The KV.teamShared(teamId) utility generates this key pattern, providing a consistent interface for the sharing functions.
Sharing Memories Across Team Members
The core sharing mechanism lives in [src/functions/team.ts](https://github.com/rohitg00/agentmemory/blob/main/src/functions/team.ts). When a client invokes mem::team-share (exposed as POST /agentmemory/team/share), the function executes the following workflow:
- Payload validation: Validates
itemId,itemType(memory or observation), optionalsessionId, andproject. - Item retrieval: If
itemTypeis"observation", fetches fromKV.observations(sessionId); otherwise retrieves fromKV.memories(lines 45-48). - Metadata wrapping: Constructs a
TeamSharedItemwith:id: Generated viagenerateId("ts")sharedBy: TheuserIdfromTeamConfigsharedAt: Current ISO timestamp- Original content,
project, andvisibilityfields
- Storage: Persists to
KV.teamShared(teamId)(line 63). - Audit: Records the action via
recordAuditwithteamIdanduserId(lines 65-69).
// Example: Sharing a memory via the internal function
const result = await memTeamShare({
itemId: "mem_123",
itemType: "memory",
project: "agent-research",
visibility: "shared"
});
Retrieving Team Data: Feed and Profile
AgentMemory provides two distinct access patterns for shared team data.
Accessing the Team Feed with mem::team-feed
The mem::team-feed function reads all items from KV.teamShared(teamId) (line 82) and returns a chronological list. It filters for items where visibility === "shared" and sorts by sharedAt descending (lines 84-89). The default limit is 20 items, configurable via the limit parameter.
// Fetching recent team shares
const feed = await memTeamFeed({ limit: 10 });
Generating Team Insights with mem::team-profile
The mem::team-profile function aggregates shared items into a unified TeamProfile (lines 96-141). It extracts:
- Distinct team members from
sharedByfields - Top concepts and files referenced across memories
- Shared patterns inventory
The resulting profile stores at KV.teamProfile(teamId) (line 44) and provides a high-level view of collective agent knowledge.
REST API Endpoints for Team Collaboration
The three internal functions map to HTTP endpoints in [src/triggers/api.ts](https://github.com/rohitg00/agentmemory/blob/main/src/triggers/api.ts#L1144-L1205):
- POST /agentmemory/team/share – Invokes
mem::team-shareto publish an item - GET /agentmemory/team/feed – Invokes
mem::team-feedwith optionallimitquery parameter - GET /agentmemory/team/profile – Invokes
mem::team-profileto retrieve aggregated team data
# Example: Sharing a memory via REST API
curl -X POST /agentmemory/team/share \
-H "Content-Type: application/json" \
-d '{"itemId":"mem_123","itemType":"memory","project":"demo"}'
Summary
- Environment-based activation: Set
TEAM_IDandUSER_IDto enable team mode vialoadTeamConfig()insrc/config.ts. - Namespace isolation: Team data resides under
mem:team:{teamId}:shared, preventing cross-team leakage. - Three core functions:
mem::team-sharewrites items,mem::team-feedlists recent shares, andmem::team-profilegenerates aggregated insights. - Audit trail: Every share operation records the
userIdandteamIdfor accountability. - REST exposure: All functions are accessible via
/agentmemory/team/*endpoints insrc/triggers/api.ts.
Frequently Asked Questions
What environment variables are required to enable team memory sharing in AgentMemory?
You must define TEAM_ID and USER_ID in your environment. Optionally set TEAM_MODE for additional configuration. The loadTeamConfig() function in src/config.ts validates these variables and constructs the runtime TeamConfig object that drives all team-scoped operations.
How does AgentMemory isolate data between different teams?
AgentMemory uses a hierarchical KV key pattern mem:team:{teamId}:shared defined in src/state/schema.ts. Each team’s shared items live under their unique keyspace, and the KV.teamShared(teamId) accessor ensures queries only return data matching the configured TEAM_ID.
What is the difference between mem::team-feed and mem::team-profile?
mem::team-feed returns a chronological list of individual shared items filtered by visibility, useful for displaying recent activity. mem::team-profile aggregates across all shared items to compute distinct members, top concepts, and file references, producing a summary useful for understanding collective agent knowledge.
Can you share individual observations or only full memories with the team?
Both types are supported. When calling mem::team-share, set itemType to "observation" to share from KV.observations(sessionId), or "memory" to share from KV.memories. The function handles retrieval and wrapping automatically based on this parameter.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →