lifecarelog
개발일지

대화형에선 붙던 MCP가 크론에서만 죽은 이유

대화형 세션에선 잘 붙던 MCP 서버가 크론에서만 연결 실패하던 문제를 환경변수 세션 스코프로 풀어낸 빌드로그예요.

5분 읽기

터미널에서는 잘 되던 게 자동화에서만 조용히 안 될 때가 있어요. 혹시 이런 적 없나요? 제가 딱 이걸로 며칠 헤맸어요.

터미널에선 되는데 크론에선 안 되던 MCP

발행 파이프라인을 자동화하면서 MCP 서버 몇 개를 붙였어요. 대화형 터미널에서는 한 번도 안 빠지고 붙었죠. 그런데 밤 2시에 도는 크론 작업에서만 같은 서버가 "연결 실패"로 떴어요.

처음엔 서버가 불안정한 줄 알았어요. 재시도도 넣어 봤는데 그대로였고요.

로그를 뒤져 보니 값이 비어 있었다

로그를 30분쯤 뒤져 보니, 크론에서 뜨는 프로세스에는 인증 토큰이 아예 비어 있었어요. 같은 설정 파일을 쓰는데 대화형에서는 채워지고 크론에서는 빈 값이었죠.

원인은 이렇게 붙였던 거였어요. export TOKEN=... && (mcp 등록). 이러면 설정 파일에는 서버 항목만 남고, 토큰 값은 그 셸 세션에서만 살아 있어요. 셸을 닫으면 값도 같이 사라지는 거죠. 새 워크트리 3개를 만들어 각각 열어 봤더니, 세 곳 다 같은 서버가 연결 실패로 떴어요.

export로 붙임대화형은 프로필 로드값 채워짐크론은 프로필 미로드값 빈 채 실행

대화형과 크론은 읽는 게 다르다

핵심은 이거였어요. 대화형 셸은 .zshrc 같은 프로필을 읽지만, 크론이나 launchd로 도는 헤드리스 작업은 그 프로필을 안 읽어요. 그래서 프로필에 토큰을 심어 두면 터미널에서만 채워지고, 자동화 경로에서만 조용히 빈 값이 돼요.

더 고약한 건 작업 상태가 "success"로 찍힌다는 점이었어요. 서버 연결만 실패하고 나머지는 흘러가서, 겉으론 초록불인데 실제로는 반쪽만 돌던 거죠.

프로필이 아니라 실행 정의에 박기

해결은 단순했어요. 토큰을 셸 프로필이 아니라 작업을 띄우는 쪽에 직접 박았어요. launchd plist의 환경변수 블록이나 설정 파일의 env 블록에요. 그러면 대화형이든 크론이든 같은 값을 받아요.

배선한 다음에는 대화형에서 확인만 하고 끝내지 않았어요. 크론이 실제로 도는 경로에서 한 번 돌려 보고, 그 프로세스에서 서버가 붙는지까지 확인했어요. 이 마지막 한 번이 없으면 또 초록불에 속아요.

  • 세션 스코프 값은 휘발
  • 헤드리스는 프로필 미로드
  • 실행 정의에 박기
  • 자동화 경로에서 실증

플랜씨(plan-c) 같은 도구를 혼자 만들다 보면 이런 자동화가 하나둘 늘어나요. 그럴수록 "터미널에서 됐으니 됐겠지"를 한 번 더 의심하게 돼요. 작은 자동화일수록 조용히 반쪽만 도는 게 제일 무섭더라고요.

#MCP#크론자동화#환경변수

라이프케어로그 서비스가 궁금하신가요?

AI 기반 건강·일정·재활 관리 앱을 직접 써보세요.

서비스 살펴보기

관련 글

댓글

아직 댓글이 없어요. 첫 댓글을 남겨주세요.