VS Code MCP 설정: mcpServers 대신 servers를 쓰세요
Claude나 Cursor에서 잘 작동하던 MCP 설정을 복사해 VS Code에 붙여 넣고 다시 시작했는데 아무 일도 일어나지 않았습니다. 오류도, 경고도, 목록에 나타나는 서버도 없습니다. 파일은 유효한 JSON이고 VS Code는 아무 문제 없이 받아들입니다. 문제는 단어 하나, 그것도 가장 바깥쪽에 있는 단어입니다.
- VS Code는 MCP 서버를 servers 아래에 감쌉니다. Claude, Cursor 등 대부분은 mcpServers를 씁니다.
- 잘못된 키는 오류를 전혀 내지 않으며, 그래서 사람들이 한 시간을 허비합니다.
- 안쪽의 서버 정의는 클라이언트마다 같습니다. 바깥을 감싸는 부분만 다릅니다.
차이점을 나란히 보기
같은 서버, 같은 명령, 같은 인수입니다. 바뀌는 것은 감싸는 키뿐입니다.
| 클라이언트 | 설정 파일 | 감싸는 키 |
|---|---|---|
| VS Code의 GitHub Copilot | .vscode/mcp.json | servers |
| Cursor | ~/.cursor/mcp.json | mcpServers |
| Claude Desktop | claude_desktop_config.json | mcpServers |
| 그 밖의 대부분의 설정 파일 기반 클라이언트 | 다양함 | mcpServers |
VS Code가 원하는 형식
워크스페이스 루트의 .vscode/mcp.json에 씁니다. MyLinedChart의 커넥터를 예로 들면 다음과 같습니다.
{ "servers": { "mylinedchart": { "command": "npx", "args": ["-y", "@mylinedchart/mcp-chart-context"] } } }
자신의 서버 command와 args로 바꿔 넣으세요. 안쪽 객체의 형태는 클라이언트마다 바뀌지 않습니다.
나머지 클라이언트가 원하는 형식
같은 서버를 Claude나 Cursor에 쓰는 경우입니다.
{ "mcpServers": { "mylinedchart": { "command": "npx", "args": ["-y", "@mylinedchart/mcp-chart-context"] } } }
두 에디터를 모두 열어 둔다면 파일도 정말로 두 개가 필요합니다. 두 에디터는 설정 하나를 공유할 수 없습니다.
오류 없이 실패하는 이유
VS Code는 파일을 읽고, 유효한 JSON임을 확인한 뒤, servers 키를 찾습니다. 파일에 servers 키가 없으므로 VS Code가 시작할 서버가 0개입니다. 서버가 0개인 것은 오류 상태가 아닙니다. VS Code의 입장에서는 아무것도 설정하지 않은 것이고, 이는 완전히 합법적인 상태입니다.
그래서 빨간 밑줄도, 알림도, 키가 틀렸다고 알리는 로그도 없습니다. 이 실패는 서버가 시작하다 죽은 것과 똑같아 보이고, 그래서 사람들이 서버를 디버깅하러 갑니다.
- 파일이 유효한 JSON이므로 파싱 오류가 나타나지 않습니다.
- 인식되지 않는 최상위 키는 거부되지 않고 무시됩니다.
- 설정된 서버가 0개인 것은 정상 상태이므로 VS Code는 문제를 보고하지 않습니다.
어떤 문제인지 확인하는 방법
서버가 고장 났다고 단정하기 전에, VS Code가 서버를 시작하려고 시도하기는 했는지 먼저 확인하세요.
- 먼저 감싸는 키를 확인하세요. 5초면 되고 대부분 이것이 답입니다.
- 터미널에서 서버 명령을 직접 실행해 보세요. 서버가 시작된다면 문제는 다른 곳에 있습니다.
- VS Code의 MCP 서버 목록에서 서버를 찾아보세요. 없으면 설정된 적이 없는 것이고, 있는데 실패한다면 실제 시작 오류입니다.
- 직접 편집하지 않고 원클릭 링크로 설치했다면 이런 종류의 문제는 해당되지 않습니다.
관련된 두 가지 함정
여기까지 왔으니, 같은 방식으로 조용히 실패하는 다른 두 가지도 알아 두세요.
첫째, 원클릭 MCP 설치 링크는 페이로드를 URL 인코딩된 평범한 JSON으로 전달합니다. Base64는 URL 파서가 받아들인 뒤 조용히 아무 일도 하지 않으며, 이는 가장 나쁜 실패입니다. 작동한 것처럼 보이는 버튼이기 때문입니다.
둘째, VS Code에서는 서버 이름이 Cursor처럼 별도 쿼리 매개변수가 아니라 페이로드 안에 담겨 전달됩니다. Cursor 형식으로 만든 링크는 열리기는 해도 VS Code에서 제대로 설치되지 않습니다.
MyLinedChart는 어디에 쓰일까
MyLinedChart는 AI 에이전트에 실시간 차트를 제공하는 MCP 커넥터를 포함합니다. 종목, 내 작도, 지표 값, 화면의 봉이 대상입니다. 커넥터는 내 컴퓨터에서 실행되며 데이터는 우리 서버를 거치지 않습니다.
앱에는 올바른 키를 대신 써 주는 원클릭 Add to VS Code 버튼이 있으며, 직접 편집하는 것보다 이 버튼을 쓰는 이유가 바로 그것입니다. 설정과 다른 클라이언트는 /resources/articles/ibkr-chart-data-github-copilot-vs-code 글을 참고하세요.
다음 단계
키를 고치고 VS Code를 다시 시작하면 서버가 나타납니다. 그래도 서버가 나타나지 않는다면 문제가 설정이 아니라 서버에 있음을 알게 된 것이고, 확인할 목록이 훨씬 짧아집니다.
내 AI는 /mcp에서 연결하세요.
자주 묻는 질문
- VS Code는 왜 mcpServers 대신 servers를 쓰나요?
- servers 키는 Claude Desktop이 정착시킨 관례와 별개로 VS Code 자체의 MCP 설정 형식에서 정한 이름입니다. 어느 쪽이 더 옳다고 할 수 없습니다. 둘이 서로 바꿔 쓸 수 있는 것처럼 보이는데 한쪽이 알리지 않고 실패하기 때문에 문제가 됩니다.
- 잘못된 키를 쓰면 VS Code가 경고해 주나요?
- 아니요, 바로 그것이 어려운 점입니다. 파일은 유효한 JSON이고, 알 수 없는 최상위 키는 거부되지 않고 무시되며, 설정된 서버가 0개인 것은 정상 상태입니다. 어느 것도 결함처럼 보이지 않습니다.
- VS Code와 Cursor에 설정 파일 하나를 같이 쓸 수 있나요?
- 아니요. 두 에디터는 읽는 경로가 다르고 기대하는 감싸는 키도 다르므로 파일이 둘 필요합니다. 안쪽의 서버 정의는 같으므로 단어 하나만 바꿔 복사하면 됩니다.
- Windows Copilot에도 해당되나요?
- 아니요. 여기서 말하는 Copilot은 MCP 서버를 지원하는 VS Code 안의 GitHub Copilot입니다. Windows 작업 표시줄 어시스턴트는 이름만 같은 별개의 제품이며 이 설정 파일을 쓰지 않습니다.