큰 코드에서 함수 이름 하나를 바꾸려면 그 함수를 부르는 곳을 빠짐없이 찾아야 하고, 이름만 같은 다른 함수는 건드리지 말아야 합니다. Serena(세레나)는 이 일을 개발 도구(IDE)처럼 해 주겠다는 오픈소스 MCP 서버로, 클로드 코드 공식 플러그인 디렉터리에도 올라 있습니다. 세레나는 무료지만 일을 시키는 동안 클로드 사용량이 듭니다. 파이썬 라이브러리 click 저장소에서 같은 이름 바꾸기 요청을 10번 시켰습니다. 세레나 없이, 마켓 플러그인으로, 공식 권장 설정으로, 그리고 “세레나를 써서”라고 이름을 불러서 시킨 뒤 채점했습니다.
- 10번 모두 바꿔야 할 2곳만 정확히 바꾸고 테스트를 통과했습니다. 세레나 없이도 결과는 같았습니다.
- 깔아 두기만 한 6번은 세레나 도구를 한 번도 부르지 않았습니다. 공식 문서가 권하는 훅까지 붙여도 마찬가지였습니다.
- “세레나를 써서”라고 부르면 언어 서버의 이름 바꾸기 기능으로 한 번에 2곳을 고쳤고, 사용량은 캐시를 새로 쓴 실행을 뺀 없이·깔아 둔 쪽(0.07~0.09달러)보다 4~5할쯤 더 들었습니다(1회 0.11달러어치).
결과부터 보기: parse_args 13줄 중 2줄만 바꾸기
영상은 요청문, 함정이 섞인 검색 결과, 세레나 없이 고친 과정, 세레나의 이름 바꾸기 도구가 낸 결과, 10번의 채점표 순서입니다.
직접 눌러 보기: parse_args가 들어간 13줄에서 바꿀 곳을 골라 보고 정답 확인하기
직접 실행 확인한 날짜 2026-10-20
- 실행 환경
- macOS 26.1 · Claude Code 2.1.299 · Sonnet 5.5 · 생각 깊이 중간 (10번 모두 같은 설정) · Serena 2.1.0(공식 설치)·2.1.1.dev0(마켓 플러그인) · 파이썬 3.13
- 설치 난이도
- uv가 있으면 명령 세 줄. 파이썬 언어 서버(pyright)는 처음 켤 때 알아서 받음
- 비용
- 세레나는 무료. 이번 과제 1회에 API 단가로 0.07~0.18달러어치(세레나를 부르면 0.11달러 안팎)
- 라이선스
- Serena 본체 GPL-3.0-or-later · 언어 서버 연결부(SolidLSP) MIT · GitHub 별 약 3만 개(2026-10-20 기준)
따라 해 보기: 요청문과 실습 재료
과제는 click(파이썬 명령줄 라이브러리, 약 1만 3천 줄) 저장소에서 _OptionParser 클래스의 parse_args 메서드만 parse_tokens로 바꾸는 일입니다. 이 저장소에서 parse_args가 들어간 줄은 13개인데, 바꿔야 할 곳은 정의 1곳과 그것을 부르는 1곳뿐입니다. 나머지는 이름만 같은 Command·Group의 메서드, 테스트 안의 표준 라이브러리(optparse) 객체입니다. 클로드 코드가 처음이라면 클로드 코드 설치 방법을 먼저 보세요.
세레나(serena) MCP 도구를 써서 해 주세요. 이 저장소는 파이썬 명령줄 라이브러리 click입니다. src/click/parser.py에 있는 `_OptionParser` 클래스의 `parse_args` 메서드 이름을 `parse_tokens`로 바꿔 주세요. 이 메서드를 부르는 곳도 모두 함께 고치고, 이름만 같은 다른 메서드나 다른 객체의 parse_args는 건드리지 마세요. 끝나면 `.venv/bin/python -m pytest -q`로 테스트가 통과하는지 확인하고, 바꾼 곳을 파일:줄 목록으로 알려 주세요.
내 코드에 쓸 때는 파일·클래스·이름을 바꿉니다. 좋은 결과라면 클로드가 세레나의 이름 바꾸기 결과 “2 changes applied”(2곳 바꿈)를 보여 주고, 바뀐 곳 목록과 테스트 통과를 알려 줍니다. 실습 재료(zip)에는 요청문 두 가지(세레나 이름 부름·안 부름), 채점 기준, 공식 문서의 훅 설정 예시를 넣었습니다.
세레나에 들어 있는 것
클로드 코드에서 세레나를 연결하면 도구가 두 개만 보입니다. 사용 안내서를 읽는 initial_instructions와, 파이썬식 짧은 코드로 기능을 부르는 serena_repl입니다. 실제 기능은 serena_repl 안에 묶음으로 들어 있고, 프로젝트를 켜면 아래 목록을 알려 줍니다.
| 묶음 | 하는 일 | 이번에 쓴 것 |
|---|---|---|
s.lsp | 언어 서버로 심볼(함수·클래스) 찾기, 그 심볼을 부르는 곳 찾기, 이름 바꾸기, 안전하게 지우기, 파일 오류 진단 | find_symbol, find_referencing_symbols, rename_symbol |
s.edit | 함수 본문 통째로 바꾸기, 함수 앞뒤에 코드 넣기, 여러 파일 찾아 바꾸기(미리 보기 포함) | 안 씀 |
s.fs | 파일 찾기·읽기·만들기, 패턴 검색 | search_for_pattern, read_file |
s.shell | 셸 명령 실행 | 테스트·git diff 실행(2번) |
s.mem | 프로젝트 메모를 남겨 다음 작업에 다시 쓰기, 처음 프로젝트 파악(onboarding) | 안 씀 |
s.cfg | 설정 보기, 대시보드 열기 | 안 씀 |
파이썬은 pyright 언어 서버로 처리했고, 공식 README 기준 40개 넘는 언어를 지원합니다. 유료 JetBrains 플러그인을 붙이면 파일 옮기기·디버깅 같은 기능이 더 생기는데, 이번에는 쓰지 않았습니다.
1단계. 세레나 설치하기 (약 3분)
이 단계에서는 세레나를 설치하고 클로드 코드에 연결합니다. 설치 방법이 두 가지인데, 세레나 README는 마켓이나 플러그인 디렉터리로 설치하지 말라고 적어 두었습니다. 거기 있는 설치 명령이 낡았거나 최적이 아니라는 이유입니다.

공식 권장 방법입니다. 먼저 uv(파이썬 도구 설치 프로그램)가 있어야 합니다. 터미널에서 실행합니다.
uv tool install -p 3.13 serena-agent
serena init
이렇게 나오면 성공 Installed 3 executables: serena, serena-agent, serena-hooks(실행 파일 3개 설치) 뒤에 Serena has been initialised successfully.(세레나 초기화 성공)가 나옵니다.
이어서 작업할 코드 폴더로 가서 클로드 코드에 연결합니다. --context claude-code는 클로드 코드와 겹치는 기본 도구를 끄는 설정이고, --project는 이 폴더를 바로 프로젝트로 켭니다.
claude mcp add serena -- serena start-mcp-server --context claude-code --project "$(pwd)"
uv: command not found가 나오면: uv를 먼저 설치하고 터미널을 다시 엽니다.- 클로드 코드 안에서
/mcp를 입력해 serena가 연결됐는지 봅니다. 늦게 켜지면 공식 문서대로export MCP_TIMEOUT=60000을 셸 설정에 넣습니다. - 처음 켜면 세레나 대시보드(웹 화면)가 열리면서 앞으로도 열지 묻습니다. 끄려면
~/.serena/serena_config.yml의web_dashboard_open_on_launch를false로 둡니다.
클로드 앱의 플러그인 디렉터리나 claude plugin install serena@claude-plugins-official로도 깔 수 있습니다(공식 마켓 기준, 이 설치 명령은 이번에 실행하지 않음, 디렉터리 여는 법). 실험은 같은 플러그인 폴더를 클로드 코드에 직접 지정해 켰고, 이름을 부르면 잘 동작했지만 프로젝트를 켜는 단계(activate_project)를 한 번 더 거쳤습니다.
필요 없어지면 아래 명령으로 지웁니다. 설정 폴더는 ~/.serena, 작업한 코드 폴더 안에는 .serena 폴더가 생깁니다.
claude mcp remove serena
uv tool uninstall serena-agent
2단계. 깔아 두기만 하면 쓰일까: 같은 요청 10번 (약 1분씩)
이 단계에서는 세레나를 깔아 둔 것만으로 클로드가 알아서 쓰는지 봅니다. 위 요청문에서 “세레나 도구를 써서”를 뺀 문장을 세 조건에 2번씩 보냈습니다. 공식 권장 설정 쪽에는 세레나 문서가 “강력히 권장”하는 훅(세레나를 쓰라고 일깨우는 자동 명령)도 붙였습니다. 이어서 “세레나 도구를 써서”를 붙인 요청을 마켓 플러그인과 공식 설정에 2번씩 보냈습니다.
채점 기준은 실행 전에 세레나 README가 내세우는 기능(정확한 이름 바꾸기)에서 뽑아 고정했고, 채점 때 테스트를 다시 돌렸습니다.
| 채점 항목(5개) | 세레나 없이 | 마켓 플러그인 깔아 둠 | 공식 설정 깔아 둠 | 마켓 + 이름 부름 | 공식 + 이름 부름 |
|---|---|---|---|---|---|
| 정의 바꿈(parser.py) | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ |
| 부르는 곳 바꿈(core.py) | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ |
| 함정 11곳 그대로 | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ |
| 테스트 통과(2261개) | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ |
| 다른 변경 없음 | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ | ✓ ✓ |
| 세레나 도구 호출 | – | 0 · 0 | 0 · 0 | 4 · 5 | 5 · 5 |
| 사용량(API 단가) | 0.17 · 0.07달러 | 0.18 · 0.07달러 | 0.09 · 0.08달러 | 0.11 · 0.12달러 | 0.11 · 0.11달러 |
세레나 없이도 클로드는 검색(Grep)으로 13줄을 찾은 뒤 앞뒤를 읽고 두 줄만 고쳤습니다. 테스트 안의 parser.parse_args(args)가 표준 라이브러리 optparse 객체라는 것도 스스로 구분했습니다.
깔아 둔 6번은 모두 같은 방식으로 풀었습니다. 마켓 플러그인 2번은 클로드가 일을 시작할 때 세레나 서버가 아직 켜지는 중이었습니다. 공식 설정 2번은 서버가 연결돼 있었고, 훅이 “먼저 세레나 안내서를 읽으라”는 문장까지 넣었습니다. 그래도 한 번은 안내서 도구를 불러올 준비만 하고 쓰지 않았고, 한 번은 아예 보지 않았습니다.
0.17·0.18달러 두 번은 클로드 쪽 캐시를 새로 쓴 양이 다른 실행보다 3배쯤 많았던 실행입니다. 이 둘을 빼면 깔아 둔 쪽과 없이 한 쪽의 사용량은 비슷했습니다. 걸린 시간은 10번 모두 1분이 안 됐습니다.
3단계. 이름을 불러 세레나로 바꾸기 (약 1분)
이 단계에서는 요청문 앞에 “세레나(serena) MCP 도구를 써서”를 붙여 세레나가 실제로 일하게 합니다. 네 번 모두 안내서를 먼저 읽고 이름 바꾸기 기능 한 번으로 정의와 부르는 곳을 함께 고쳤습니다. 세 번은 그 전에 바꿀 메서드를 심볼로 먼저 찾았습니다.
s.lsp.find_symbol("_OptionParser/parse_args", relative_path="src/click/parser.py")
→ [{"name_path": "_OptionParser/parse_args", "kind": "Method", "relative_path": "src/click/parser.py", "body_location": {"start_line": 297, "end_line": 313}}]
s.lsp.rename_symbol("_OptionParser/parse_args", relative_path="src/click/parser.py", new_name="parse_tokens")
→ Successfully renamed '_OptionParser/parse_args' to 'parse_tokens' (2 changes applied)
이렇게 나오면 성공 “이름 바꾸기 성공(2곳 바꿈)”이 나오고, git diff에 정의 한 줄과 부르는 곳 한 줄만 보입니다. 이름 바꾸기는 글자 검색이 아니라 언어 서버가 “이 메서드를 실제로 부르는 곳”을 계산해서 고치기 때문에 이름만 같은 함정은 처음부터 후보에 없습니다.
대신 한 번에 0.11달러 안팎, 캐시를 새로 쓴 실행을 뺀 없이·깔아 둔 쪽(0.07~0.09달러)보다 4~5할쯤 더 들었습니다. 안내서와 프로젝트 정보를 읽는 데 매번 분량이 들어갔기 때문입니다. 이번처럼 검색 결과가 13줄이면 클로드가 혼자 읽어도 충분했습니다. 세레나의 차이는 검색 결과가 수백 줄이라 다 읽을 수 없는 큰 저장소에서 날 가능성이 큽니다. 이번에는 그 규모를 시험하지 않았습니다.
매번 이름을 붙이기 번거롭다면 프로젝트의 CLAUDE.md에 “코드 탐색과 이름 바꾸기는 세레나 도구로” 같은 한 줄을 두는 방법이 있습니다. 이 방법은 이번에 시험하지 않았습니다.
이런 사람에게 권합니다
- ✅ 수만 줄 넘는 저장소에서 함수 이름을 바꾸거나, 어떤 함수를 누가 부르는지 따라가야 하는 개발자. 글자 검색 대신 언어 서버가 실제 호출 관계로 찾아 줍니다.
- ✅ 클로드 코드 말고도 코덱스·커서 같은 여러 도구에서 같은 코드 탐색 기능을 쓰고 싶은 사람. 세레나는 MCP라 여러 도구에 붙습니다(공식 문서 기준).
- ❌ 작은 프로젝트에서 가끔 이름을 바꾸는 사람. 이번 과제에서는 세레나 없이도 같은 결과가 나왔습니다.
한계와 주의할 점
- 세레나의 셸 기능(
s.shell)은 클로드 코드의 명령 허용 목록을 거치지 않습니다. 이번에도 두 번은 테스트와 git diff를 세레나 쪽에서 실행했습니다. 세레나 보안 문서도 이 방식에서는 도구 단위 제한이 다 걸리지 않으며, 완전히 막으려면 격리된 환경(도커 등)에서 돌리라고 안내합니다. - 1만 3천 줄짜리 파이썬 저장소에서 이름 바꾸기 하나만, Sonnet 5.5로 조건마다 두 번씩 돌렸습니다. 큰 저장소, 다른 언어, Opus 모델에서는 결과가 다를 수 있습니다.
- 마켓 플러그인은 켤 때마다 GitHub 최신 소스를 받아 실행합니다. 이번에는 2.1.1 개발판이 돌았습니다. 버전을 고정하고 싶다면 공식 권장 설치가 맞습니다.
- 대시보드는 기본으로 켜지고 이 맥 안(localhost:24282)에서만 열립니다(대시보드 문서).
대안
| 방법 | 다른 점 | 이럴 때 고르세요 |
|---|---|---|
| 세레나(이 글) | 언어 서버로 심볼 찾기·이름 바꾸기·함수 단위 고치기, 프로젝트 메모 | 큰 저장소에서 정확한 이름 바꾸기·호출 추적이 필요할 때 |
| 클로드 코드 기본 도구 | 검색(Grep)과 파일 읽기로 찾아 고침. 이번 과제는 이것만으로 5점 만점 | 보통 크기 프로젝트, 추가 설치를 원하지 않을 때 |
| 공식 마켓의 언어별 LSP 플러그인(pyright-lsp 등) | 클로드 코드에 언어 서버를 직접 붙이는 Anthropic 공식 플러그인. 이번에는 시험하지 않음 | 한 언어만 쓰고 공식 플러그인을 원할 때 |
| Context7 MCP | 내 코드가 아니라 라이브러리 최신 문서를 찾아 읽게 함 | 새 버전 라이브러리 사용법이 틀릴 때 |
MCP 서버를 처음 붙인다면 MCP란? 클로드 코드에 MCP 서버 연결하는 법을, 훅이 무엇인지는 hookify 리뷰를 보세요.
자주 묻는 질문
세레나는 무료인가요?
세레나 자체는 무료 오픈소스(GPL-3.0)입니다. 언어 서버도 무료로 내려받아 씁니다. 다만 세레나를 쓰는 동안 클로드 사용량이 들고, 이번에는 한 번에 0.11달러어치 안팎이었습니다. JetBrains 플러그인 연결은 유료입니다(무료 체험 있음).
세레나를 깔았는데 클로드가 안 써요
요청에 “세레나 도구를 써서”를 붙이면 네 번 모두 썼습니다.
클로드 앱(데스크톱)이나 코덱스에서도 되나요?
세레나 문서는 클로드 데스크톱, 코덱스, 커서, 제미나이 CLI 등 MCP를 지원하는 도구에 붙이는 법을 안내합니다(연결 문서). 이번에는 클로드 코드만 시험했습니다.
세레나를 켜면 브라우저 창이 떠요
세레나 대시보드입니다. 1단계의 설정으로 자동으로 열리지 않게 하고, 필요할 때 http://localhost:24282/dashboard/로 직접 엽니다.
출처
세레나 GitHub 저장소·README, 클라이언트 연결 문서(클로드 코드), 보안 문서, 대시보드 문서, 공식 마켓 serena 플러그인, pallets/click (모두 2026-10-20 확인, 세레나 별 30,405개)