context MCP server
2026년 11월 5일 커밋대화 간의 최근 트렌드와 이벤트를 검색하여 LLM에 개인화된 단기 컨텍스트를 제공하는 MCP 레이어를 제공합니다.
다른 이름 Runtime-Roost/context-server
- 스타
- 1
- Tools
- 46
- 다운로드, 30일
- —
- 최신 버전
- —
- 마지막 커밋
- 2026년 11월 5일
- 라이선스
- MIT
context MCP란?
context은(는) MCP server입니다. 대화 간의 최근 트렌드와 이벤트를 검색하여 LLM에 개인화된 단기 컨텍스트를 제공하는 MCP 레이어를 제공합니다. 46개 도구를 제공합니다. 예: ping, identify_actor, save_context.
프로젝트 README에서 생성된 요약
context MCP server 정보
context-server는 AI 클라이언트가 대화 사이에 개인화된 단기 메모리 레이어를 가질 수 있도록 지원합니다. 일반적인 LLM은 장기적인 선호도나 즉각적인 대화 기록을 유지하는 경우가 많지만, 이 서버는 서로 다른 채팅 세션 전반에 걸쳐 지속되는 최근 트렌드와 이벤트를 검색하는 가교 역할을 합니다. 이를 통해 AI는 사용자가 매번 새로운 프롬프트에 상세 내용을 반복하지 않아도 최근에 하드웨어를 교체했거나 특정 프로젝트를 진행 중이었다는 사실을 기억할 수 있습니다.
개발자는 PostgreSQL 데이터베이스를 사용하여 로컬에 이를 구축할 수 있습니다. 서버는 로컬 mcp.json 파일을 통해 구성되며, 이 파일은 npm run mcp:config 명령어로 생성할 수 있습니다. PGHOST 및 PGDATABASE와 같은 데이터베이스 관리를 위한 다양한 환경 변수를 지원하며, 스크립트를 통해 데이터베이스 스키마를 관리하는 도구도 포함되어 있습니다. 또한 공유된 컨텍스트 레코드를 확인하기 위한 인스펙션 도구를 제공하며, 정보가 사람에 의해 생성되었는지 또는 특정 AI 모델에 의해 합성되었는지 추적하기 위한 액터 속성 부여 기능을 지원합니다.
활용 사례
- 1최근 프로젝트 트렌드 검색지난 몇 주 동안 진행했던 특정 기술 작업이나 하드웨어 변경 사항을 AI가 회상하도록 요청합니다.
- 2세션 간 연속성 유지현재 대화창 외부의 컨텍스트를 LLM에 제공하여 상호작용이 더욱 개인화된 느낌을 주도록 합니다.
- 3공유 메모리 감사 및 검사에이전트에게 도구 제어권을 주지 않고도 별도의 인터페이스를 통해 화이트보드 기록과 속성 정보를 확인합니다.
- 4정보 출처 추적저장된 모든 컨텍스트가 사람이나 특정 모델 버전과 같은 특정 액터와 연결되도록 보장합니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
context MCP 도구 46
README에서 감지됨pingidentify_actorsave_contextsearch_contextget_user_profilelist_recent_contextget_contextacknowledge_contextrequest_actor_sessionget_actor_session_request_statusclaim_actor_sessionrenew_actor_session
| ping | — | |
| identify_actor | — | |
| save_context | — | |
| search_context | — | |
| get_user_profile | — | |
| list_recent_context | — | |
| get_context | — | |
| acknowledge_context | — | |
| request_actor_session | — | |
| get_actor_session_request_status | — | |
| claim_actor_session | — | |
| renew_actor_session | — |
도구 46개 모두 보기도구 수 줄이기
create_channeladd_channel_memberremove_channel_memberlist_channelssave_channel_contextsearch_channel_contextlist_channel_contextget_channel_contextupdate_channel_contextdelete_channel_contextcreate_access_groupadd_access_group_memberremove_access_group_memberlist_access_groupssave_group_contextsearch_group_contextlist_group_contextget_group_contextupdate_group_contextdelete_group_contextsave_personal_contextsearch_personal_contextlist_personal_contextget_personal_contextupdate_personal_contextdelete_personal_contextdatabase_metadatadelete_contextupdate_contextcontext_purge_previewcontext_purge_confirmactor_purge_previewactor_purge_confirmvacuum_database
| create_channel | — | |
| add_channel_member | — | |
| remove_channel_member | — | |
| list_channels | — | |
| save_channel_context | — | |
| search_channel_context | — | |
| list_channel_context | — | |
| get_channel_context | — | |
| update_channel_context | — | |
| delete_channel_context | — | |
| create_access_group | — | |
| add_access_group_member | — | |
| remove_access_group_member | — | |
| list_access_groups | — | |
| save_group_context | — | |
| search_group_context | — | |
| list_group_context | — | |
| get_group_context | — | |
| update_group_context | — | |
| delete_group_context | — | |
| save_personal_context | — | |
| search_personal_context | — | |
| list_personal_context | — | |
| get_personal_context | — | |
| update_personal_context | — | |
| delete_personal_context | — | |
| database_metadata | — | |
| delete_context | — | |
| update_context | — | |
| context_purge_preview | — | |
| context_purge_confirm | — | |
| actor_purge_preview | — | |
| actor_purge_confirm | — | |
| vacuum_database | — |
구성
EMBEDDINGS_AUTO_PULLEMBEDDINGS_ENABLEDEMBEDDINGS_MODELEMBEDDINGS_PROVIDEROLLAMA_HOST
| 이름 | 설명 | 유형 |
|---|---|---|
| EMBEDDINGS_AUTO_PULL | — | |
| EMBEDDINGS_ENABLED | — | |
| EMBEDDINGS_MODEL | — | |
| EMBEDDINGS_PROVIDER | — | |
| OLLAMA_HOST | — |
자동 검사
2026년 11월 14일에 실행됨전체 보고서 →아직 인증되지 않았습니다. 서버는 80점 이상의 점수, 심각한 결함 없음, 그리고 검사에 충분한 데이터를 갖추어야 합니다. 검사 방식 · 점수를 높이기 위해 수정할 항목
- 소스 저장소 연결 및 접근 가능runtime-roost/context-server is public and reachablegithub.com/runtime-roost/context-server ↗통과
- 패키지가 이 저장소를 소스로 명시검사되지 않음
- 빌드 출처(Sigstore 증명)검사되지 않음
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-05github.com/runtime-roost/context-server ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음검사되지 않음
- 패키지 및 해당 종속성에 중요한 보안 권고 없음검사되지 않음
- 모델에 대한 숨겨진 지침 없음46 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기context-server
A personalized context-driven MCP archive server.
ChatGPT, and many others have long-term memories for static facts and user preferences. Obviously, they also have context of the current conversation.
But what if we had a custom layer sit between the two, referencing the user's recent trends and events regardless of the conversation? It would feel more like talking to a friend, rather than a machine we brute forced into learning English and following directions.
This is that layer.
Example
Long-term memory might know:
- User prefers TypeScript
- User owns a homelab
- User enjoys automation projects
This MCP layer might retrieve:
- User has been building an MCP server this week
- User recently migrated to an RX 7800 XT
- User spent the last month building an Elite Dangerous database
Together, the LLM gains both long-term preferences and recent context between conversations.
The full LLM runtime situation should look something like this:
AI doesn't need to remember everything. It just needs to know where its memories are.
Note: Your mileage may vary significantly depending on the instructions given to the model. This MCP server can provide relevant context, but it is ultimately up to the LLM to decide when to retrieve it, how to interpret it, and how much weight to give it.
Configuring
The tracked mcp.example.json shows the portable MCP client
configuration. Generate the ignored, machine-specific mcp.json with an
absolute path to this checkout and the current OS username:
npm run mcp:config
The same command is available in VS Code under Tasks: Run Task as
MCP: Generate config.
The generated file is local machine configuration and is automatically added
to .gitignore. Standard PGHOST, PGDATABASE, PGUSER, AUTO_MANAGE_DB,
REQUIRE_ACTOR_IDENTIFICATION, TRUST_OPENAI_TUNNEL_IDENTITY, and
EMBEDDINGS_ENABLED, ATTACHMENT_STORAGE_DIR,
ATTACHMENT_PERSONAL_QUOTA_BYTES, and ATTACHMENT_GROUP_QUOTA_BYTES
environment variables
override the generated defaults.
Automatic database management is disabled by default.
The generated file uses this shape:
{
"mcpServers": {
"personal_context": {
"active": true,
"args": [
"/PATH/TO/personal-context-server/dist/index.js"
],
"command": "node",
"env": {
"PGHOST": "/var/run/postgresql",
"PGDATABASE": "personal_context",
"PGUSER": "USERNAME"
},
"type": "stdio"
}
}
}
Create a local .env from the example if you want to run the server directly:
cp .env.example .env
Create and manage the local PostgreSQL database with the included helper:
scripts/db.sh create
scripts/db.sh status
scripts/db.sh shell
The helper always manages a database named personal_context. It also supports
drop and reset (with confirmation), and honors the standard PostgreSQL
connection environment variables. The same commands are available from VS Code
under Tasks: Run Task as the Database: ... tasks.
Set AUTO_MANAGE_DB=true to have the server run the helper's status check
before connecting its MCP transport and run create when the database is
missing. Startup fails instead of creating anything when PostgreSQL is
unreachable or the required PostgreSQL command-line tools are unavailable.
Inspection tool
The repository includes a separate operator surface for inspecting shared context without exposing agent controls:
npm run inspection:start
It listens only on http://127.0.0.1:4180 by default. The browser receives
Whiteboard records, attribution, and actor acknowledgements. It may edit only
the body of an existing Whiteboard note, using optimistic concurrency. Source,
tags, visibility, and actor attribution remain server-owned. Notes carrying a
message-to-* inbox tag are read-only because changing or deleting them could
alter agent delivery. New notes are plain Whiteboard records attributed to
actor:human:blake, with no tags and the fixed source inspection-tool.
Deletion is version-checked and uses the same inbox guard. There are no wake,
submit, approve, or agent-control routes.
Ordinary notes may also be archived with a required reason. Archiving moves the
record out of every general Whiteboard read by changing its server-owned
visibility to archived; it does not merely hide a card. The archive preserves
the note's content, original author, source, and acknowledgements, and records
the reason, time, and actor:human:blake as the archiving actor. Restoring a
note returns it to the Whiteboard while retaining the archive/restore history.
Agent inbox notes cannot be archived.
Private channel and direct-message bodies are excluded in SQL, not merely
hidden by the UI. The Inspection API returns only an envelope: channel,
participants, sender, timestamps, acknowledgement count, and record ID. Its
response includes private_message_contents_exposed: false as an explicit
privacy contract.
The standalone native Android inspection companion is obsolete and retained temporarily for compatibility testing. Agent Companion is the active phone UI. The obsolete client uses a separate TLS gateway on one exact RFC1918 address:
npm run inspection:mobile
Set the INSPECTION_MOBILE_* values shown in .env.example. The TLS private
key and per-phone bearer token must be regular mode-0600 files outside the
repository. The gateway exposes only GET /api/inspection and the bounded
Whiteboard create/body-update/delete/archive/restore routes; it holds no MCP,
runtime, or agent credential.
The installed user service reads those non-secret paths and bind settings from
the mode-0600 %h/.config/personal-context/inspection-mobile.env; the token
itself remains in the separate file named by INSPECTION_MOBILE_TOKEN_PATH.
Actor attribution
Actor attribution records who synthesized a memory, while source continues to
describe where the information came from. Durable actor IDs represent
operational categories rather than conversations or model versions, for
example actor:openai:codex, actor:openai:chatgpt, and
actor:human:blake.
For clients with persistent MCP sessions, call identify_actor once before
saving. The resolved actor becomes active for that server instance, and
subsequent save_context calls automatically attach it. Calling
identify_actor again switches actors.
Clients that may reconnect or launch a fresh stdio process between calls, such as some LM Studio configurations, should include actor identity directly in every save:
{
"text": "Tested actor attribution successfully.",
"tags": ["tool_testing"],
"source": "LM Studio actor-attribution test, 2026-07-19",
"actor": {
"external_id": "actor:eden",
"name": "Eden",
"kind": "ai"
},
"subject": {
"external_id": "subject:project:context-server",
"name": "Context Server",
"kind": "project",
"aliases": ["personal context server"]
}
}
An explicit actor requires a stable external_id, takes precedence over the
session-active actor, and becomes active when the session does persist. Actor
resolution and context insertion share one database transaction. The standalone
identify_actor tool still permits intentionally anonymous actors, but display
names are never used to merge actors.
For compatibility, an unidentified save succeeds with actor: null and an
ACTOR_NOT_IDENTIFIED warning. Set REQUIRE_ACTOR_IDENTIFICATION=true for
clients such as LM Studio to reject the write before it happens. The structured
ACTOR_IDENTIFICATION_REQUIRED error tells the model to retry the same
save_context call with an actor object. Strict mode is disabled by default and
requires attribution without choosing the actor for the model.
Existing databases upgrade through the transactional schema_migrations
ledger. Existing contexts are not backfilled and remain actor: null.
Knowledge subjects
Contexts may optionally reference a canonical subject describing what the
knowledge is about. Subject IDs use a separate lowercase subject: namespace,
for example subject:project:context-server. A subject has a stable external
ID, canonical name, optional kind, and optional retrieval aliases.
Subjects are classification metadata, not principals: they never grant
ownership, authentication, visibility, or access. The actor remains who
created or owns a record under the applicable visibility contract. OpenAI
tunnel subject values are authentication-local metadata and must not be copied
into knowledge-subject IDs.
Migration 19 adds subjects and nullable contexts.subject_id. Existing rows
intentionally remain unclassified (subject: null); no subject is inferred
from actor, content, tags, or tunnel identity. New records can supply subject
when saved, and existing Whiteboard or personal records can be explicitly
backfilled through their existing update tools. Text retrieval matches the
subject ID, canonical name, kind, and aliases while preserving the original
visibility and actor-ownership predicates.
Immutable context payloads
Migration 20 creates versioned context_payloads rows for every context. Each
payload has a stable pointer, type (text), media type, byte size, version, and
immutable body. Existing text becomes payload version 1. Replacing context text
creates a new version; previous versions remain, direct payload updates are
rejected, and deleting the context cascades all payload versions.
Context envelopes return payload_ref metadata. Search and list responses carry
at most a 500-character preview so an agent can decide whether an exact read is
worthwhile; exact get_* operations hydrate the complete text behind the same
visibility and actor-authorization checks. contexts.content remains a
compatibility mirror in this migration slice. These payload records provide the
indirection point for later image, document, OCR, transcript, and embedding
storage without changing context-envelope identity.
Context connections
Migration 21 adds directed, typed connections between context envelopes. A
connection records a normalized relationship such as led_to, supports,
contradicts, or supersedes, an optional bounded rationale explaining why the
edge exists, and the authenticated actor that created it. Exact reads and
search/list envelopes expose connections from both directions with the other
context ID; they do not hydrate the other payload automatically.
Connections are semantic metadata, not capabilities. Both endpoints must be in
the same visibility scope: Whiteboard with Whiteboard, the same personal owner,
the same channel, or the same access group. The creator must have write access
to that scope. Direct, system, archived, cross-owner, and cross-scope edges are
rejected in this slice, and unauthorized callers receive the same not-found
boundary as missing contexts. The full administrative MCP surface exposes
connect_contexts and disconnect_contexts; the bounded conversation catalog
does not add new tool definitions in this slice.
Relevance and lifecycle metadata
Migration 22 gives every context an explicit lifecycle envelope: active,
warm, cold, or archive_candidate; bounded importance from 0–100; retrieval
count and last-retrieved time; optional completion time; and an optional
same-scope successor. Existing records start active at neutral importance 50.
These fields are signals rather than authority and do not themselves archive,
delete, pin, expose, or hydrate anything.
The authenticated full-surface update_context_lifecycle tool may change these
signals only when the actor has write access to the context. Supersession must
point to a context in the same visibility/ownership scope, so lifecycle metadata
cannot reveal or bridge into a hidden journal, channel, or group.
Reviewed auto-archive
Migration 23 adds durable, expiring archive previews and per-record evaluation
receipts. preview_auto_archive evaluates only cold/candidate Whiteboard notes;
it never archives by itself. Eligibility conservatively requires explicit
archive_candidate state, low importance, minimum age, completion or a
same-scope successor, no active inbound reference, no bridge position, no agent
inbox tag, and no protected tag. Protected tags default to archive:never,
reference, canonical, and active-project and are configurable through
AUTO_ARCHIVE_PROTECTED_TAGS.
confirm_auto_archive consumes one actor-bound 15-minute preview and archives
only an explicitly selected eligible subset. It rechecks candidate state inside
the transaction, writes ordinary reversible archive history, and never deletes
payloads or graph edges. A changed, expired, replayed, foreign, or expanded
selection fails closed.
Bounded retrieval assembly
assemble_context authenticates the active OpenAI tunnel actor, finds lexical
seed envelopes only inside that actor's readable Whiteboard, personal, channel,
and group scopes, and restores one hop of authorized graph topology. Archived
Whiteboard records are excluded from ordinary seed search and may surface only
as connected nodes. Direct and system records are never assembled.
Assembly ranks lifecycle importance, returns at most 20 envelopes, hydrates at
most five payload bodies, limits all remaining nodes to 500-character previews,
and enforces a total content-character budget. Results explain whether each node
was a seed or graph expansion and update retrieval counters/timestamps. To keep
the conversation catalog below 25,000 serialized characters, this tool replaces
ordinary Whiteboard acknowledgement on that surface; acknowledge_context
remains available on the full administrative surface.
Actor-only context boundary
Context-bearing MCP operations now require an authenticated actor by default,
including Whiteboard save/search/exact reads, recent/profile reads, database
metadata, acknowledgement, update/delete, and purge operations. Authentication
bootstrap (request_actor_session, status/claim/binding flows) remains separate
and does not read protected context. The trusted OpenAI path derives the author
from the bound local actor session; any caller-supplied actor object is ignored
for authority and cannot replace the authenticated principal.
REQUIRE_CONTEXT_AUTHENTICATION=false exists only for isolated legacy test
fixtures and should not be set in deployed services. Subjects, mentions,
connections, lifecycle fields, payload references, and tags remain inert
metadata: none can authenticate, grant membership, or widen visibility.
Whiteboard visibility
Every context now has a first-class visibility classification. Existing rows
are migrated to whiteboard, and new saves default to whiteboard. Whiteboard
records are shared context discoverable through search_context,
list_recent_context, get_context, and get_user_profile.
The general context tools intentionally accept only whiteboard.
Non-whiteboard rows fail closed: current whiteboard reads, updates, deletes,
and context purges do not expose or mutate them. This avoids presenting
self-asserted actor identity as real access control.
Private notebook
Authenticated actors can keep Tier 2 private notebook records with the
*_personal_context tools. A personal record is always attributed to and owned
by the authenticated actor. The server applies that ownership predicate before
text search, semantic ranking, limiting, serialization, exact-ID lookup,
updates, and deletion.
Personal records are invisible to Whiteboard tools, channel tools, and other
authenticated actors. Missing and unauthorized exact IDs both return null.
The same enrolled-key and operator-approved actor-session authentication
supported by channels is supported here. Personal records are never retrieved
automatically through the general search_context or list_recent_context
surfaces; clients must deliberately call the authenticated private-notebook
tools.
Access groups
Access groups provide Unix-like shared ownership for private archives. A
group-owned context keeps its authenticated actor as the author for provenance,
but the access group owns the authorization boundary. Current members with
can_read may list, search, and fetch group records. Current members with
can_write may save, update, and delete them.
Group owners and admins manage membership using owner/admin/member roles and
independent read/write capability flags. Removing a member revokes access
immediately without rewriting every group-owned record. Owners cannot be
removed. Membership is enforced before search, semantic ranking, limiting,
serialization, exact-ID lookup, update, and deletion. Missing and unauthorized
exact IDs both return null.
Group ownership is distinct from channels and actor-private notes: channels are conversation/history scopes, personal contexts belong to one actor, and group contexts belong to an access group shared by its current members.
Attachments
Attachments are immutable binary source artifacts stored outside context text.
PostgreSQL keeps ownership, integrity, provenance, and context-link metadata;
the bytes live in a content-addressed filesystem store under
ATTACHMENT_STORAGE_DIR (default: ./data/attachments). Never place that
directory inside a publicly served tree. Back it up together with PostgreSQL:
neither half is a complete archive by itself.
Personal actors and access groups each have a strict 100 MiB logical attachment
quota by default. Configure the independent byte limits with
ATTACHMENT_PERSONAL_QUOTA_BYTES and ATTACHMENT_GROUP_QUOTA_BYTES. Finalized
attachments and the full declared size of every active upload both count, so
parallel uploads cannot over-reserve a scope. Content deduplication saves
physical disk without bypassing logical quota accounting.
Uploads use an integrity-checked sequence:
begin_attachment_uploaddeclares personal or group ownership, filename, media type, exact byte length, and SHA-256.append_attachment_chunksends base64 chunks of at most 512 KiB at the exact next byte offset.finalize_attachment_uploadverifies length and SHA-256 before atomically publishing immutable bytes.
For new integrations, the payload-first aliases keep large artifact transfer separate from knowledge metadata:
begin_payload_uploadandappend_payload_chunkstage bytes without creating or modifying a context envelope.finalize_payload_uploadverifies the bytes and returns an immutablepayload:artifact:<uuid>:v1reference with server-derived media type, size, and SHA-256 metadata.attach_payload_to_contextapplies that finalized reference afterward with acanonical,source,derived, orreferencerole. Derived payloads must name a distinct, authorized payload in the same personal or group scope; lineage is committed atomically with the link and returned bylist_context_attachments.
These upload tools deliberately remain on the full administrative surface, not the bounded conversation catalog. The established attachment tools remain as compatibility APIs and resolve to the same immutable payload records.
Unfinished uploads expire after 24 hours and are pruned when a new upload
begins. cancel_attachment_upload removes one immediately.
get_attachment_quota reports finalized, reserved, available, and limit bytes.
Quota reservation is serialized per actor or group in PostgreSQL. Every upload
reservation, finalization, cancellation, deletion, and reconciliation result is
written to the append-only attachment_audit_events ledger.
Run npm run attachments:audit for a strict reconciliation of database rows,
stored object sizes and SHA-256 values, partial-upload sizes, and orphan files.
The command records its result and exits nonzero on any discrepancy. It reports
orphans for operator review and never deletes or repairs them automatically.
get_attachment, list_attachments, and read_attachment_chunk enforce the
current personal owner or group membership before returning metadata or bytes.
delete_attachment requires write access, cascades its context links, and
removes content-addressed bytes only when no other attachment metadata uses
them. Missing and unauthorized attachment IDs both return null.
link_attachment_to_context deliberately permits only exact scope matches:
personal attachment to the same actor's personal context, or group attachment
to a context owned by the same group. Links record canonical, source, derived, or
reference relationships, stable sort order, and optional inclusive page
ranges. list_context_attachments reads those links through the same attachment
authorization boundary. Original filenames are metadata only; generated UUIDs
and SHA-256 keys determine every filesystem path.
context MCP 질문
context MCP는 어떤 도구를 제공하나요?
46개 도구를 제공합니다. 예: ping, identify_actor, save_context, search_context, get_user_profile.
서버를 어떻게 설정하나요?
npm run mcp:config를 실행하거나 VS Code에서 MCP: Generate config 작업을 사용하여 기기별 설정 파일을 생성할 수 있습니다.
데이터베이스를 자동으로 관리할 수 있나요?
네, AUTO_MANAGE_DB 환경 변수를 true로 설정하면 서버가 데이터베이스를 확인하고 없는 경우 자동으로 생성합니다.
다이렉트 메시지의 개인정보는 어떻게 처리하나요?
비공개 메시지 본문은 SQL 쿼리에서 완전히 제외되며, Inspection API는 내용이 노출되지 않음을 명시적으로 확인하는 엔벨로프를 반환합니다.
액터를 식별하지 않으면 어떻게 되나요?
저장은 성공하지만 actor: null로 기록되며 ACTOR_NOT_IDENTIFIED 경고가 발생합니다.