다 끝나면 Codex CLI한테 "Launch plan 프로젝트, 어제부터 뭐 바뀌었어?"라고 물었을 때 노트랑 채널을 전부 다시 읽지 않고 답이 나온다. Codex는 먼저 osFoundry에 오너가 허용한 리소스를 묻고(list_granted_resources), 프로젝트 안에 뭐가 있는지 찾고(list_project_resources), 리소스마다 마지막으로 본 시퀀스 번호 이후의 이벤트만 가져온다(poll_resource_events). 번호는 리포지토리 안 작은 파일에 남겨 두니까 다음 Codex 세션은 지난번에 멈춘 데서 이어 간다. 호출은 전부 osFoundry 쪽 연결의 Recent activity에 남는다.
누가 뭘 하나
| Codex CLI | osFoundry | |
|---|---|---|
| 로그인 | osFoundry OAuth 토큰을 들고 있다. osfoundry:read면 충분 | 오너가 Connected 탭에서 연결을 한 번 승인 |
| 볼 수 있는 것 | list_granted_resources가 돌려주는 것뿐, 그 외엔 없음 | 오너가 정한다. 연결에 추가한 프로젝트와, 초대한 Message 채널 |
| "어디까지 봤나" 상태 | 리소스마다 정수 하나를 Codex가 보관(여기선 .osfoundry/cursors.json) | 리소스마다 순서 붙은 이벤트 로그가 있고, 시퀀스 번호부터 읽힌다 |
| 바뀌면 뭐가 도나 | Codex가 정한다. 그 노트 하나만 다시 읽든, 채널을 읽든, 보고만 하든 | 아무것도. 폴링으로 서버 쪽이 바뀌는 일은 없다 |
| 멈출 수 있는 사람 | 나. 안 물어보면 안 돈다 | 오너가 프로젝트를 빼거나, 툴 체크를 끄거나, 연결을 Revoke |
세팅
1. Codex 연결 찾기
osFoundry 헤더의 열쇠 아이콘에서 Connected 탭을 연다. Codex를 아직 안 붙였으면 Assistant에서 Other MCP client를 고르고, 표시 이름에 Codex CLI 같은 걸 넣고 Add assistant를 누른다. Codex에 넘길 서버 주소도 이 패널에 나와 있다.
예시: Codex CLI 연결이 active로 떠 있는 Connected agents 탭
Codex 쪽은 이게 전부다.
codex mcp add osfoundry --url https://api.osfoundry.io/api/v1/external-mcp codex mcp login osfoundry 2. Codex가 뭘 지켜봐도 되는지 정하기
여기가 오너 몫이고, "Codex한테 뭐가 보일까?"의 답이 사실상 여기서 다 정해진다. 연결을 고르고 Projects를 연다. "Choose a project"에서 프로젝트를 고르고 Add to project를 누른다. 도움말 줄에 이게 뭘 허용하는지 적혀 있다. "Adding this agent to a project gives it access to supported synced content in that project and its discussion channel. Other Message channels require a separate invitation."
그러니까 프로젝트 하나를 추가하면 Codex는 그 안의 노트, 지식 베이스, 레코드 채널, Room, GitNest 리포지토리, 세션들, 그리고 프로젝트의 디스커션 채널까지 보게 된다. 그 밖의 Message 채널은 따로 한 단계를 더 밟아야 한다. 아래쪽 Message channels에서 "Choose a Message channel"로 채널을 고르고 Invite를 누른다.
예시: Launch plan 프로젝트를 추가하고 Message 채널 하나를 초대한 Codex CLI 연결
프로젝트 단위 접근이 생기기 전에 저장한 권한은 "Older individual access"에 나온다. list_granted_resources는 이것도 개별 허용 리소스로 돌려주니까, 들어오는 길이 프로젝트뿐이라고 단정하기 전에 이 영역도 한번 봐 두자.
3. 툴 세 개는 체크해 둔 채로
같은 연결에서 Tools를 연다. "All supported tools are on by default." list granted resources, list project resources, poll resource events는 체크해 둔 채로 두고, 뭔가 바뀐 걸 알았을 때 Codex가 읽을 툴(read note tab, read channel messages 등)도 같이 남겨 둔다. 여기서 체크를 끈 툴은 Codex 설정에 뭐라고 적혀 있든 osFoundry 쪽에서 막힌다.
4. Codex를 확인 루프용으로 좁히기
# ~/.codex/config.toml [mcp_servers.osfoundry] url = "https://api.osfoundry.io/api/v1/external-mcp" scopes = ["osfoundry:read"] enabled_tools = [ "list_granted_resources", "list_project_resources", "poll_resource_events", "list_note_tabs", "read_note_tab", "read_channel_messages", ] 여섯 개 다 서버에서 읽기 전용으로 표시돼 있어서 Codex가 묻지 않고 실행한다.
5. 커서 둘 곳을 Codex한테 알려 주기
Codex는 세션마다 백지에서 시작하니까, 리소스별 마지막 시퀀스는 Codex가 읽을 수 있는 어딘가에 있어야 한다. 리포지토리에 AGENTS.md를 두면 된다.
## osFoundry changes - Cursors are in .osfoundry/cursors.json: {"<resource_type>:<resource_id>": <last sequence>}. - Start with list_granted_resources. Drop cursors for resources it no longer returns. - For each watched resource call poll_resource_events with after_sequence from the file and limit 100. If a page comes back full, call again from its last sequence. - Only after reporting the changes, write the new sequence back to the file. - A resource with no cursor yet: poll from after_sequence 0 once to get its current sequence. 커서를 보고 전이 아니라 보고 후에 다시 쓰면, 중간에 죽은 세션이 있어도 이벤트를 잃는 대신 다음번에 같은 이벤트를 다시 보여 준다.
실제로 돌려 보면
이 글을 쓴 머신에는 Codex가 없어서 아래는 시뮬레이션한 예시다. 툴 이름과 인자 이름은 라이브 서버 그대로고, Codex가 붙이는 mcp__osfoundry__ 접두어를 달았다. 프로젝트, 리소스, 시퀀스 번호, 결과는 전부 데모다.
예시(시뮬레이션) > What changed in the Launch plan project since my last check? • mcp__osfoundry__list_granted_resources {} ← project "Launch plan"; message_channel "launch-updates" (invited) • mcp__osfoundry__list_project_resources {"project_id": "…", "resource_type": "note"} ← 3 notes: "Launch checklist", "Pricing page copy", "Press list" • mcp__osfoundry__poll_resource_events {"resource_type": "note", "resource_id": "…", "after_sequence": 118, "limit": 100} (Launch checklist) ← 2 events, last sequence 120 • mcp__osfoundry__poll_resource_events {… "Pricing page copy", "after_sequence": 64 …} ← no events • mcp__osfoundry__poll_resource_events {… "Press list", "after_sequence": 9 …} ← no events • mcp__osfoundry__poll_resource_events {"resource_type": "message_channel", "resource_id": "…", "after_sequence": 311, "limit": 100} ← 5 events, last sequence 316 • mcp__osfoundry__read_note_tab {"note_id": "…", "tab_id": "…"} (Launch checklist) • mcp__osfoundry__read_channel_messages {"channel_id": "…", "limit": 5} (Codex writes 120 and 316 back to .osfoundry/cursors.json) Two things moved since yesterday. In "Launch checklist", the press embargo line now says Thursday 09:00 instead of Wednesday. In launch-updates, five messages: the pricing page is approved, and the App Store build is still in review. "Pricing page copy" and "Press list" haven't changed. 폴링 네 번에 읽기 두 번이다. 커서가 없으면 같은 답을 내려고 노트 세 개와 채널을 통째로 읽고, Codex가 기억하는 것과 비교해야 한다. 그런데 Codex가 기억하는 건 아무것도 없다.
오너 쪽에서는 호출 하나가 연결의 Recent activity에 한 줄씩 남는다. 툴 이름, 결정, 시각.
예시: 확인 한 번 뒤의 Codex CLI 연결 Tools와 Recent activity
어디까지 되나
Codex는 list_granted_resources에 나오는 것만 본다. 서버의 initialize 응답부터 "Use list_granted_resources first"라고 하고, 그 호출은 인자를 안 받는다. Codex가 프로젝트 이름을 대고 들어갈 방법은 없다. 프로젝트의 디스커션 채널이 아닌 Message 채널은 오너가 연결을 초대하기 전까지 안 보인다. list_project_resources 설명문에도 다시 적혀 있다. "Ordinary Message channels require a separate invitation."
폴링은 읽기지 구독이 아니다. 서버가 광고하는 건 tools뿐이라 osFoundry가 Codex를 깨우는 일은 없다. 어차피 Codex 쓰는 방식에도 맞는다. 실행할 때 들여다보고, 커서 덕분에 "지난번 이후"를 싸게 알 수 있다.
poll_resource_events는 호출 한 번에 리소스 하나다. "프로젝트 전체" 커서 같은 건 없다. 그래서 로그 하나하나가 작고 그랜트도 따로 논다. 오너가 프로젝트를 빼면 그 리소스들에 대한 폴링은 안 통하게 되고, 다음 list_granted_resources에도 더는 안 나온다. 그러면 Codex는 그 커서를 재시도하지 말고 버려야 한다.
Graph 세션은 예외다. poll_resource_events는 graph_session을 받지만, Graph는 오너의 데스크톱에 있다. 오너가 "Share desktop Graph sessions"에서 체크하고, 데스크톱 앱이 켜져서 로그인돼 있을 때만 연결에 닿는다. 기기에만 있는 그 밖의 것들은 기기에 남는다. initialize 응답에도 "Local-only data is unavailable to cloud clients."라고 적혀 있다.
다음엔 아침 루틴에 넣어 보자. 다른 걸 열기 전에 AGENTS.md가 있는 리포지토리에서 codex exec "What changed in the Launch plan project since my last check?"를 돌리면 된다. 연결마다 어떤 툴이 주어지는지, 그리고 왜 접근은 여전히 프로젝트 단위로 정해지는지는 툴 스코프 페이지에 있다. 그 아래 깔린 프로토콜은 MCP 용어 설명에서 볼 수 있다.



