Skip to main content
Glama

firm-memory

우리 AI 코딩 에이전트가 이 회사가 소프트웨어를 어떻게 구축하는지 기억하도록 해 주는 메모리 레이어입니다. 그래서 에이전트는 매 호출 때마다 같은 것을 다시 배우지 않습니다.

CodeGraph는 *"코드가 무엇을 하고 있는가?"*에 답을 합니다.
Firm Memory는 *"왜 이렇게 구축하는가?"*에 답을 합니다.

CodeGraph는 현재 코드 동작에 대한 권위 있는 출처로 남아 있습니다. Memory는 맥락적 엔지니어링 지식을 담으며, 그 과정에서 정보지할 수 있습니다. 그래서 메모리와 현재 코드가 일치하지 않으면 코드가 우선합니다.


구조

  OpenCode        On-call        Future agent
      └───────────────┼───────────────┘
                      │  MCP
             ┌────────▼─────────┐
             │  Firm Memory MCP │   thin transport adapter
             └────────┬─────────┘
                      │
             ┌────────▼─────────┐
             │   Firm Memory    │   taxonomy · scope · provenance · lifecycle
             └────────┬─────────┘
                      │  MemoryProvider
             ┌────────▼─────────┐
             │      mem0        │   embeddings · vector search · ranking
             └──────────────────┘

플랫폼은 Firm Memory가 의미하는 것이 무엇인지을 소유합니다. 프로바이더는 그것을 어떻게 저장하고 검색하는지를 소유합니다. MCP는 에이전트가 그것을 어떻게 접근하는지를 소유합니다. 이 구분이 핵심입니다. OpenCode나 MCP 계약을 바꾸지 않고 두 번째 프로바이더를 도입할 수 있습니다.


Related MCP server: AgentBase

빠른 시작

pip install -e '.[mem0,pgvector,rerank,mcp,dev]'
export FIRM_MEM0_PG_DSN='postgresql://mem0:pw@db.internal:5432/mem0'
export FIRM_MEMORY_DOMAINS='execution,mcx'      # this repo's domains
export FIRM_MEMORY_CANDIDATES_PATH='.firm-memory/candidates.json'
from firm_memory import FirmMemory, MemoryScope, MemoryType

memory = FirmMemory.from_env()          # scoped to this checkout + its domains + the firm

for hit in memory.search("why does OMS reject orders after 15:20"):
    print(hit.id, hit.content, hit.provenance.reference)

proposal = memory.propose(
    "Cash strategies stop sending at 15:20 because the exchange rejects after that.",
    type=MemoryType.BUSINESS_RULE,
    scope=MemoryScope(domains=("execution",), repos=("oms", "gateway")),
    reference="mr-4821",
)
# Not stored as knowledge yet — it is queued for a human:
print(proposal.accepted, proposal.candidate_id, proposal.decision.reason)

memory.approvals.approve(proposal.candidate_id, approver="ashish")

에이전트를 위해 MCP 서버를 실행하세요:

firm-memory-mcp        # stdio; exposes memory_search / memory_get / memory_propose / memory_correct

이 패키지가 담당하는 다섯 가지

1. 분류체계

프로바이더의 기본 추출은 소비자용 어시스턴트(음식, 취미, 음악)에 맞춰져 있습니다. 우리의 것은 트레이딩 시스템에 맞춰져 있습니다. 총 13가지 유형이며, 각각 추출을 이끄는 설명이 있습니다:

ARCHITECTURE_DECISION · REJECTED_APPROACH · CONVENTION · REVIEW_PATTERN · BUG_FIX · TASK_LEARNING · TOOLING_SETUP · DEPENDENCY_DECISION · PERFORMANCE_FINDING · BUSINESS_RULE · PRODUCTION_ISSUE · OWNERSHIP · TERMINOLOGY

어떤 것이든 프로바이더에 도달하기 전에 강제됩니다. 두 표기 모두 동일하게 처리됩니다 — 멤버 이름(BUSINESS_RULE)과 안정적인 와이어 슬러그(business_rules)가 그렇습니다.

그만큼 중요한 것은 제외 대상입니다: 소스 코드, diff 또는 스택 트레이스는 없고, 비밀은 없고, 개별 엔지니어에 대한 사실도 없으며, 일시적인 상태도 없습니다.

2. 범위

독립적인 속성이지, 계층 구조가 아닙니다. 회사의 지식은 트리 구조를 따르지 않기 때문입니다.

{"firm": true, "domains": ["execution"], "repos": ["oms", "gateway"]}

세 저장소에 걸친 메모리는 있는 한 번만 저장되고 각 저장소에서 접근할 수 있습니다. 의도적으로 엔지니어 수준 범위도 팀 수준 범위도 없습니다. 같은 질문에 누가 물어보더라도 동일한 회사 컨텍스트가 반환되어야 하며, 정체성 축이 있으면 하나의 사실이 여러 개의 사본으로 분리되어 서로 어긋나게 됩니다.

3. 등급

수명을 나타내는 축이며, 승인 상태와는 직교합니다.

EPISODIC

MR별 작업 기억 — 발견 내용과 the 처리 결과

예, 필수

티어

무엇을 담는가

태스크 한정인가?

EPISODIC

MR별 작업 기억 — 발견 사항과 처리 결과

예, 필수

DURABLE

승인 게이트를 통과해 기록되는 정제된 지식

절대 아님

INDEX

닫힌 issue/MR마다 보이는 하나의 카드, 종항 형태 유지

절대 아님

검색은 기본적으로 EPISODIC을 제외합니다. 이 기본값은 무겁습니다. 벡터 저장소에는 태스크 필터가 없으면 '설정 안 됨'이 아니라 '무관함'을 듯이하지, 그래서 이 기본값이 없다면 모든 MR의 작업 상태가 일반 검색에 포함됩니다. 이에 대한 계약 테스트가 있습니다.

4. 근원과 생애주기

모든 메모리는 그 근원을 함께 지니고 있어서, 엔지니어가 인용을 따라 그 뒤의 MR, isue 또는 인터뷰까지 추적하고 이를 교정할 수 있습니다.

Candidate ─► taxonomy / scope / provenance checks ─► human approval ─► provider.insert()

V1은 완전한 인간 승인을 받습니다. 신뢰도는 처음부터 기록되어 나머에 마이그레이션없이 자동화를 켤 수 있습니다. 비즈니스 규칙, 아키텍처 결정, 회사 관례, 프로덕션에 중요한 지식은 신뢰도와관계없이 항상 사람의 승인을 필요합니다.

아무 것도 삭제되지 않습니다. 교정은 등급을 낮추고 플래그를 남깁니다. 대체는 대체 대상을 명시합니다. 의사결정이 있었다는 기록 — 그리고 이후 취소되었던 기록 — 역시 살아남습니다.

5. 신뢰성

메모리는 best effort 즉 최선의 노력 방식이 덧붙니다. 읽기는 절대 예외를 일으키지 않습니다. 프로바이더 장애나 한정된 타임아이 아웃 초과 시에는 빈 결과와 기록된 메트릭만 남으므로, 회상 실패가 코드 리뷰를 시작시키지는 않습니다. 쓰기는 예외를 만듭니다 — 엔지니어가 방금 승인한 메모리를 조용히 버리는 것은 오류보다 더 나쁠을 것입니다.


설정

플랫폼 설정은 프로바이더에 의존하지 않으며, 프로바이더 설정은 그 프로바이더 자신이읽습니다. 이 구분이 프로바이더 교체를 단순한 변경으로 만들어줍니다.

변수

기본값

의미

FIRM_MEMORY_PROVIDER

mem0

사용할 프로바이더

FIR_MEMORY_LIMIT

5

검색당 결과 수

FIRM_MEMORY_MIN_SCORE

0.3

관련성의 최소 기준점

FIRM_MEMORY_TIMEOUT_SECONDS

2.0

기다리기 전에 포기하는 시간 제한

FIRM_MEMORY_DOMAINS

이 ‘작업 복사본’이 속하는 도메인

FIRM_MEMORY_REPO

(git remote)

저장소 슬러그를 변경할 때 사용

FIRM_MEMORY_ENTRIES_PATH

(in-process)

후보 memory가 사람인의 승인 기다리는 경로

FIRM_MEMORY_AUTO_APPROVE

off

신뢰도 기반 자동 승인

FIRM_MEM0_PG_DSN

필수

pgvector로의 연결 문자열

FIRM_MEM0_COLLECTION

mem0_firm

컬렉션 이름

FIRM_MEM0_POOL_OWNER

firm

user_id에서, 풀을 식별하는 값

FIRM_MEM0_RERANK

on

로컬 크로스 인코더 재순위 사용

FIRM_MEM0_REPO, FIRM_MEM0_TOP_K, FIRM_MEM0_THRESHOLDFIRM_MEM0_FIRM_OWNER는 여전히 존중됩니다. 따라서 기존 배포는 업그레이드할 때 동작이 바뀌지 않습니다.

이 설치는 셀프호스팅이며 외부로 나가는 통신이 없습니다. *"MCX 주문은 항상 Risk Engine A로 라우팅된다"*와 같은 개발(비즈니스) 규칙은 코드 주석보다는 전략적 자산(IP)에 가깝습니다. 그리고 그 풀을 드나드는 모든 저장소의 접근 제어 유니언을 이 풀이 물려받습니다.


배치

src/firm_memory/
├── models.py          canonical Memory · status · tier
├── taxonomy.py        the firm's vocabulary and its exclusions
├── scope.py           firm / domains / repos
├── provenance.py      where a memory came from
├── lifecycle.py       approval policy and status transitions
├── memory.py          the API agents and applications import
├── config.py          platform settings
├── metrics.py         failure and latency counters
├── repo.py            deterministic repo identity
├── providers/
│   ├── base.py        the interface: insert · search · get · update
│   ├── registry.py    configuration-driven selection
│   ├── inmemory.py    dependency-free provider for tests and local use
│   └── mem0/          namespace · filters · mapping · settings · provider
├── ingestion/
│   ├── approval.py    the human gate
│   └── store.py       where candidates wait
└── mcp/
    ├── tools.py       the four tools (no SDK dependency)
    └── server.py      thin transport adapter

tests/
├── unit/          modules in isolation
├── integration/   the API across layers, incl. provider swap
├── contract/      against the real mem0 filter pipeline
└── mcp/           the agent-facing surface

개발

.venv/bin/python -m pytest -q                       # 261 tests (1 skipped without the mcp extra)
.venv/bin/python -m pytest --cov --cov-report=term   # 94% coverage
.venv/bin/python -m ruff check src tests

중시해야 하는 것은 계약 테스트입니다. 그 테스트는 우리 필터를 mem0의 실제 전처리 및 pgvector의 SQL 빌더로 실행하며, 그리고 코드 예제의 소스를 읽어서 얻은 제약들 — 단일한 OR 분기, 단일한 메타데이터 키, *“그 중 하나”*를 듯하는 목록 값, Memory.search가 필요로 하는 최상위 엔티티 키 — 을 고정합니다. mem0 업그레이드로 이 중 하나라도 깨지면, 풀이 조용히 비워내지 않고 테스트가 분명히 실패합니다.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to capture, store, and retrieve durable learnings from projects via MCP tools, providing a queryable memory of product and technical lessons across repos.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to persistently store and semantically search shared knowledge via MCP tools.
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides coding agents with governed semantic memory and code-graph context via MCP, enabling code-linked recall, blast-radius impact analysis, and lifecycle-aware memory management.
    2
    Apache 2.0

View all related MCP servers

Related MCP Connectors

  • Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.

  • Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.

  • Shared, peer-validated knowledge archive for AI agents — search, contribute, and validate via MCP

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ashish-ty/firm-memory'

If you have feedback or need assistance with the MCP directory API, please join our Discord server