글

라벨이 IT·AI인 게시물 표시

MCP 서버 만들기, 파이썬으로 테스트 실패만 읽어 주는 도구 붙이기

이미지
3줄 요약 튜토리얼의 FastMCP 코드는 mcp 2.3.0에서 import부터 막힙니다. MCPServer로 바꾸고 stdio로 부르면 도구 하나가 바로 돌아갑니다. 서버 쪽 print 한 줄이 연결을 끊으니 로그는 stderr로 보냅니다. pip install mcp 를 하고 FastMCP 를 쓰는 튜토리얼 코드를 돌려 봤더니 import 줄에서 바로 멈췄습니다. 한국어 튜토리얼 중에는 위키독스 「나만의 MCP 서버 만들기」 처럼 이 이름을 쓰는 글이 있습니다. 에러 문구에 원인이 그대로 적혀 있었는데요, 2.x부터 FastMCP 가 MCPServer 로 이름이 바뀌었다는 내용입니다. 새 이름으로 서버를 만들고 도구를 하나 붙여 호출까지 해 봤습니다. 도구는 JUnit 결과 파일에서 실패한 테스트만 골라 줍니다. 실행은 Linux 컨테이너(Python 3.13.16)에서 했고, 예제 결과 파일은 테스트 5개짜리로 제가 직접 만들었습니다. Claude Code에 붙이는 마지막 부분은 직접 돌리지 않고 공식 문서의 명령을 옮겼습니다. pip install mcp 다음에 만나는 에러 설치된 버전부터 봅니다 PyPI의 mcp 최신 버전은 2.3.0이고, 한국 시간 10월 3일 오전 7시에 올라왔습니다. 가상환경을 새로 만들어 설치하면 이 버전을 받게 됩니다. # 가상환경을 만들고 mcp 를 설치합니다 python3 -m venv v && . v/bin/activate pip install mcp pip list | grep -E '^mcp ' # mcp 2.3.0 옛 튜토리얼의 import는 에러가 납니다 1.x 시절 코드는 from mcp.server.fastmcp import FastMCP 로 시작합니다. 2.3.0에서 이 줄을 실행하면 아래 에러가 나옵니다. ModuleNotFoundError: No module named 'mcp.server.fastmcp'. This is m...

구글 계정 2년 안 쓰면 삭제된다는데, 내 계정은 괜찮은지 확인하는 방법

이미지
3줄 요약 구글은 2년간 안 쓴 개인 계정과 그 안의 데이터를 지울 수 있습니다. 로그인, 메일, 유튜브 시청 같은 평소 행동이 전부 사용으로 인정됩니다. 안 쓰는 계정은 로그인 한 번으로 살리고, 지울 계정은 먼저 백업하십시오.

네이버 서치어드바이저에 블로거 등록하는 방법, 소유확인과 사이트맵 제출

이미지
3줄 요약 블로거 블로그를 네이버에 올리려면 무엇부터 할까요? 사이트 등록, 소유확인 태그, 사이트맵·RSS 제출 순서입니다. 소유확인은 1년마다 다시 하고, 반영은 며칠에서 몇 주 걸립니다.

맥 클립보드 히스토리 maccy 무료 설치와 단축키 정리

이미지
3줄 요약 maccy는 앱스토어에서 9.99달러, 깃허브에서는 무료입니다. Shift+Command+C로 복사 기록을 열어 검색하고 바로 붙여넣습니다. 설치 직후 손볼 곳은 손쉬운 사용 권한과 민감 정보 제외입니다.

맥 캡쳐 프로그램 shottr, 기본 스크린샷 대신 쓸 만할까?

이미지
3줄 요약 캡처하고 바로 지우는 정도라면 기본 스크린샷으로 충분합니다. 스크롤 캡처·OCR·핀을 매주 쓴다면 12달러가 아깝지 않습니다. 브루로 설치하면 버전이 하나 뒤처진다는 것만 기억해 두면 됩니다.

맥 md 파일 미리보기, QLMarkdown 설치와 사용법

이미지
3줄 요약 QLMarkdown 설치 안내에 xattr 격리 해제가 자주 따라붙습니다. 1.5.0부터 서명·공증된 앱이라 그 단계는 빼도 됩니다. 안 보이면 설정의 Quick Look 확장 체크부터 보십시오.

subprocess timeout not working 원인과 해결법

이미지
3줄 요약 먼저 확인할 것은 timeout 값이 아니라 capture_output 입니다. 같은 명령이 캡처를 켜면 20.01초, 끄면 0.00초였습니다. 그다음은 손자 프로세스입니다. timeout=2 로 10회 돌리면 예외는 매번 2.01초에 뜨지만 고아 프로세스가 10개 쌓입니다. 여기서 멈춰도 됩니다. stdout 을 파일로 받거나 start_new_session=True 와 os.killpg 를 붙이면 둘 다 0개·0.00초로 떨어집니다.

YAML 파싱 차이, 따옴표 없는 값이 파서마다 달라지는 문제

이미지
3줄 요약 따옴표 없이 적은 YAML 값은 파서를 바꾸면 다르게 읽힐까요. 같은 값 42개를 파서 5종에 넣어 대조했습니다. 다섯 곳이 모두 같은 값은 20개(47.6%)뿐이었습니다. PyYAML 6.0.3과 js-yaml 5.4.2만 놓고 보면 42개 중 20개가 다릅니다. 다만 version: 1.10 은 다섯 곳 전부 1.1로 읽습니다. 원인이 구현이 아니라 표기인 값은 파서를 바꿔도 그대로입니다.

프롬프트 캐싱 비용 계산, 5분 TTL 손익분기 정리

이미지
3줄 요약 같은 프리픽스를 TTL 안에 다시 쓰면 5분 캐시는 두 번째 호출부터, 1시간 캐시는 세 번째 호출부터 싸집니다. 공식 문서가 배율로 못 박아 둔 값이라 계산이 단순합니다. 재사용 간격이 TTL을 넘어가면 히트가 0회가 되고 쓰기 배율만 남습니다. 이 구간에서는 5분 캐시가 미캐시보다 25%, 1시간 캐시가 100% 더 비쌉니다. 경계는 하루에 몇 번 도느냐가 아니라 TTL 안에 몇 번 도느냐입니다. 제 파이프라인의 슬롯 간격은 5분의 59.3배였습니다.

oh my zsh 속도 개선, 플러그인을 지우면 빨라질까?

이미지
3줄 요약 빈 설정에서 zsh는 0.010초에 뜨고, 플러그인 세 개를 얹은 현재 설정에서는 중앙 1.310초에 뜹니다. 131배이고, 하루에 셸을 30번 열면 39초입니다. 구문 강조와 자동 제안 플러그인을 통째로 들어내면 돌아오는 시간은 3.7ms입니다. 벽시계 1.310초의 0.28%입니다. 경계는 nvm 자동 로드 360ms와 완성 시스템 233ms입니다. 둘이 프로파일에 잡힌 629ms의 94%이고, 벽시계의 나머지 절반은 프로파일러가 세는 범위 밖입니다.

vimrc 기본 설정, 빈 파일이 끄는 vim 기능과 해결법

이미지
3줄 요약 vimrc는 비어 있으면 아무 일도 하지 않고, 설정을 적을수록 편해진다고 알고 있었습니다. vim 8.2에서 옵션과 기능 37개를 조건 다섯 개로 대조하니 빈 .vimrc 파일 하나 때문에 15개가 후퇴했습니다. incsearch · wildmenu 가 꺼지고 scrolloff 는 5에서 0, history 는 200에서 50으로 내려갔습니다. 판단 기준은 vimrc에 무엇을 적었는가가 아니라 vim -c 'echo exists("#vimStartup#BufReadPost")' 가 1을 돌려주는가입니다.

uv 설치 후 버전이 안 바뀔 때, pip install uv 경로 문제

이미지
3줄 요약 pip install uv 가 Successfully installed uv-0.12.13 을 찍은 직후 uv --version 이 34일 전 버전인 0.12.3을 그대로 출력했습니다. pip는 ~/.local/bin 에 새 바이너리를 넣었고 셸은 /usr/local/bin 을 먼저 봅니다. 두 위치 사이에 릴리스 10개가 쌓여 있었는데 pip 경고는 0줄이었습니다. 설치 직후 which -a uv 와 python3 -c "import uv; print(uv.find_uv_bin())" 두 줄을 찍어 경로가 같은지 확인하십시오.

npm 버전 표기법 캐럿(^), 0.x 버전 주의점

이미지
3줄 요약 캐럿( ^ )은 버전의 왼쪽에서 처음 만나는 0이 아닌 자리를 고정합니다. 그래서 ^7.0.0 은 7.x 전체를, ^0.124.0 은 0.124.x만 허용합니다. 2026-09-12 기준 실측으로 ^7.0.0 은 45일 동안 openai 15개 버전을 지나 5.08MB와 export 431개가 늘었고, 같은 기간 ^0.124.0 은 만족 버전이 1개라 그대로 멈춰 있었습니다. 지금 쓰는 AI SDK의 버전이 0.x인지 1.0 이상인지부터 확인하시고, 아래 조회 스크립트로 자기 package.json 의 실제 드리프트 폭을 재 보시면 됩니다.

한글 토큰 계산, 글자수로 어림하면 안 되는 이유

이미지
3줄 요약 영어 기준 어림셈인 "1토큰 = 4자"를 한글 원고에 쓰면 토큰을 절반 이하로 잡게 됩니다. 원고 55편 624,261자 실측 결과 o200k_base 329,961토큰(토큰당 1.892자), cl100k_base 461,817토큰(1.352자)으로 인코딩만 바꿔도 1.4배가 갈립니다. 글자수÷4 추정치는 실측 대비 52.7% 모자랐습니다. 자기 원고 폴더에 gpt-tokenizer 를 붙여 한 번 세어 보고, 글자수가 아니라 바이트 수 기준 계수 로 예산표를 다시 만드시면 됩니다.

cron 중복 실행 방지, 예약 작업이 겹칠 때 해결법

이미지
3줄 요약 cron은 시작 시각만 보장하고 앞 실행이 끝났는지는 보지 않습니다. 겹침 방지는 표준 문법에 없습니다. 예약 작업 실행 29회 실측에서 소요 시간 중앙값은 29.4분인데 최대가 803분이었고, 최대와 중앙값의 차이가 27.4배였습니다. 하루 점유율은 18.2%인데도 겹침이 났습니다. 자기 작업의 소요 시간부터 열흘치 재보시고, p95가 간격을 넘으면 flock -n 한 줄을 먼저 붙이시면 됩니다.

LangChain text splitter, 마크다운 코드가 깨질 때

이미지
3줄 요약 LangChain MarkdownHeaderTextSplitter 는 코드블록 안의 들여쓰기까지 지웁니다. 제 원고 45편으로 재현했더니 파이썬 코드 84개 중 67개가 문법 오류 상태로 인덱스에 들어갔습니다. 검색 자체는 멀쩡합니다. 질의 12개로 확인해 보니 어떤 분할기를 써도 정답 문서를 1등으로 찾아냈습니다. 망가지는 것은 찾은 뒤 모델에게 건네는 그 조각입니다. 코드가 든 문서를 인덱싱하고 있다면 오늘 ast.parse 한 줄짜리 검사부터 돌려 보시면 됩니다. 아래 스크립트를 그대로 쓰시면 됩니다.

프롬프트 작성법 예시, 예시 문구가 관용구로 굳는 문제

이미지
3줄 요약 하루 세 번 도는 글쓰기 예약 작업의 산출물 43편을 세어 보니, 프롬프트가 예시로 든 문구 13종이 총 215회, 편당 6.0회 등장하고 있었습니다. 프롬프트에서 문구 지정을 걷어내고 요건만 남긴 뒤 발행한 7편은 그 13종이 0회였고, 산문 길이·표·코드블록 같은 형식 지표는 그대로 유지됐습니다. 자기 에이전트 산출물이 있다면 이 글 마지막의 20줄짜리 검사 스크립트를 코퍼스 폴더에서 한 번 돌려 보시면 됩니다. 고정 목록 없이도 굳어 가는 표현이 나옵니다.

MCP 서버 Connection closed 오류 해결법

이미지
3줄 요약 stdio로 붙인 MCP 서버가 죽으면 클라이언트에는 MCPError: Connection closed 한 줄만 남고, 실제 원인은 서버 프로세스의 stderr에만 기록됩니다. mcp 2.1.1(PyPI 업로드 2026-08-26 01:13 KST) 기준으로 재현해 보니, 원인 문자열은 서버를 직접 실행해 stderr를 읽으면 6줄 안에 나왔습니다. 도구를 20개 붙이면 tools/list 응답만 9,831바이트였습니다. 서버를 붙이기 전에 아래 30줄짜리 핸드셰이크 진단 스크립트를 먼저 돌려 보시면 됩니다.

개발자 채용 시장 동향, AI 공고 비중 정리

이미지
이직 시장을 한 번 열어 보신 분들은 비슷한 감각을 갖고 계실 겁니다. 공고 수 자체는 확실히 줄었는데, 남아 있는 공고의 요구사항은 오히려 늘어나 있습니다. "AI 기반 테스트 도구 경험", "LLM 활용 자동화 경험" 같은 문구가 QA 공고에도 붙기 시작합니다. 팀원과 1:1을 하면 "지금 뭘 배워야 하냐"는 질문이 나오는데, 답할 근거가 마땅치 않습니다. 여기서 리드가 취할 수 있는 태도는 셋입니다. 첫째, 시장이 어렵다고 인정하고 현 업무에 집중하자고 말합니다. 둘째, AI 관련 학습을 팀 OKR에 넣습니다. 셋째, 숫자를 먼저 확인하고 어느 방향이 실제로 수요가 있는지 확인한 뒤 우선순위를 정합니다. 결론부터 말씀드리면, 8월 24일에 나온 두 개의 자료가 셋째를 할 수 있게 해 줍니다. 요지는 두 문장으로 정리됩니다. 소프트웨어 개발 직군 공고는 코로나 이전 수준의 74% 근처에 머물러 있지만 저점에서는 뚜렷하게 회복했고, AI 관련 공고 비중은 2022년 직전 최고치의 두 배에 가까운 수준까지 올라왔습니다. 이 두 숫자를 나란히 놓으면 팀원에게 할 말이 생깁니다. 1. 8월 24일에 나온 숫자들 1-1. Indeed Hiring Lab의 8월 스냅샷 Indeed Hiring Lab 이 2026-08-24 18:27 UTC(KST 2026-08-25 03:27)에 공개한 "US Labor Market Snapshot — August 2026"의 수치를 원문 그대로 옮깁니다. 지표 원문 수치 기준 시점 전체 채용공고 지수(JPI) "101.8" (2020년 2월 1일 대비 +1.8%) as of August 14, 2026 신규 공고 "97.2" (2020년 2월 대비 약 -3%) 동일 JPI 월간 변화 "0.2%" as of August 14 JPI 전년 대비 변화 ...

옵시디언 3기기 동기화, 유료 결제 없이 구글 드라이브로 끝내기

이미지
안드로이드 폰과 맥은 이미 동기화되고 있는데 아이패드만 붙지 않는다면, 설정을 잘못한 것이 아닐 가능성이 큽니다. iOS는 다른 앱의 폴더를 볼트로 지정하는 방식 자체를 허용하지 않기 때문입니다. 해결은 두 갈래입니다. 월 구독료를 내고 공식 동기화를 쓰거나, 구글 클라우드 콘솔에서 OAuth 클라이언트를 직접 발급해 커뮤니티 플러그인에 물리는 것입니다. 이 글은 후자를 택했을 때 실제로 어디서 막히는지, 그리고 그 대가가 얼마나 되는지를 순서대로 정리한 기록입니다. 미리 결론부터 말씀드리면, 기술적으로는 완전히 동작합니다. 다만 "무료"의 정의를 금전 비용이 아니라 총 소요 시간으로 바꾸는 순간 판단이 달라질 수 있습니다. 1. 아이패드에서만 막히는 진짜 이유 같은 볼트를 세 기기에서 열려고 할 때, 플랫폼별로 가능한 동작이 다릅니다. 항목 안드로이드 macOS iPadOS 임의 폴더를 볼트로 지정 가능 가능 불가 볼트 위치 선택지 내부 저장소 어디든 어디든 iCloud Drive 또는 앱 내부 로컬 백그라운드 동기화 데몬 가능 가능 불가 안드로이드에서 서드파티 동기화 앱이 잘 동작하는 이유는 두 가지입니다. 파일 시스템에 자유롭게 접근할 수 있고, 백그라운드 서비스로 상주할 수 있기 때문입니다. macOS도 마찬가지입니다. iOS와 iPadOS는 둘 다 막혀 있습니다. 앱은 다른 앱의 샌드박스를 읽을 수 없고, 화면에 떠 있지 않으면 대부분 실행되지 않습니다. 파일 앱에 구글 드라이브가 보이는 것은 원격 스트리밍 방식의 File Provider일 뿐이라, 노트 앱이 실시간으로 읽고 쓸 수 있는 로컬 폴더가 아닙니다. 그래서 iPad에서 가능한 모델은 하나뿐입니다. [다른 플랫폼] 클라우드 폴더 자체를 볼트로 지정 [iPad] 앱 내부 로컬 볼트 + 플러그인이 API로 밀고 당김 이 차이를 모르면 "플러그인 설정을 잘못했나" 하며 며칠을 ...