Common Lisp로 MCP 서버 구축

발행: (2026년 4월 11일 오전 11:55 GMT+9)
4 분 소요
원문: Dev.to

Source: Dev.to

사전 요구 사항

시작하기 전에 다음이 설치되어 있는지 확인하세요:

  • SBCL – 고성능 Common Lisp 컴파일러
  • Roswell – Common Lisp 구현 관리자 및 스크립트 실행기
  • Quicklisp – Common Lisp의 사실상 패키지 매니저
  • Ultralisp – 커뮤니티 기반 Common Lisp 라이브러리 배포판

Ultralisp 설치

SBCL과 Quicklisp을 사용할 때 Ultralisp를 활성화하려면 다음을 실행합니다:

(ql-dist:install-dist "http://dist.ultralisp.org/" :prompt nil)

(SBCL 및 Quicklisp 설치 방법은 부록에 설명되어 있습니다.)

문제점: 40ants-mcp 로드

다음과 같이 40ants-mcp를 로드하려고 하면:

(ql:quickload :40ants-mcp)

오류가 발생할 수 있습니다. 해결 방법은 간단하지만 직관적이지 않으며, 먼저 jsonrpc를 로드하면 됩니다:

(ql:quickload :jsonrpc)
(ql:quickload :40ants-mcp)

이 의존성은 자동으로 해결되지 않으며, 이것이 좌절의 원인이었습니다.

MCP 서버 만들기

mcp-exper 패키지의 최소 예제는 다음과 같습니다:

(in-package :mcp-exper)

(openrpc-server:define-api (mi-tools :title "mi-tools"))

(40ants-mcp/tools:define-tool (mi-tools add) (a b)
  (:summary "just add")
  (:param a integer "a")
  (:param b integer "b")
  (:result text-content)
  (make-instance 'text-content :text (format nil "~a" (+ a b))))

(defun start-server ()
  (40ants-mcp/server/definition:start-server mi-tools))

핵심 포인트

  • openrpc-server:define-api를 사용해 API를 정의합니다.
  • 40ants-mcp/tools:define-tool을 사용해 도구를 정의합니다.
  • 텍스트 결과는 text-content 인스턴스로 반환합니다 (MCP는 특정 콘텐츠 타입을 요구합니다).

서버 실행

Roswell 스크립트(mi-mcp-server.ros)를 만듭니다:

#!/bin/sh
#|-*- mode:lisp -*-|#
exec ros -Q -- $0 "$@"
|#
(progn
  (ros:ensure-asdf)
  #+quicklisp (ql:quickload '(:mcp-exper) :silent t))

(defun main (&rest argv)
  (declare (ignorable argv))
  (mcp-exper:start-server))

간단 테스트

Roswell로 스크립트를 직접 실행합니다:

ros mi-mcp-server.ros

프로덕션 설치

실행 파일을 빌드하고 설치합니다:

ros build mi-mcp-server.ros
install -m 0755 mi-mcp-server $HOME/.local/bin/

$HOME/.local/binPATH에 포함되어 있는지 확인하세요.

Opencode와 통합

Opencode에서 MCP 서버를 사용하려면 ~/.config/opencode/opencode.json에 다음을 추가합니다:

{
  "mcp": {
    "mi-tools": {
      "type": "local",
      "command": ["mi-mcp-server"],
      "enabled": true
    }
  }
}

결론

Common Lisp으로 MCP 서버를 만드는 것은 요령만 알면 간단합니다. 40ants-mcp 라이브러리는 설계가 훌륭하고, OpenRPC 통합도 원활하게 동작합니다.

이 가이드가 제가 겪었던 좌절을 줄이는 데 도움이 되길 바랍니다. 즐거운 해킹 되세요!

이 예제의 전체 소스 코드는 mcp-exper에서 확인할 수 있습니다.

부록: SBCL 설치

macOS

brew install sbcl

Debian/Ubuntu

apt install sbcl

Arch Linux

pacman -S sbcl

부록: Quicklisp 설치

Quicklisp을 다운로드하고 설치합니다:

wget https://beta.quicklisp.org/quicklisp.lisp
sbcl --load quicklisp.lisp \
     --eval '(quicklisp-quickstart:install)' \
     --eval '(ql-util:without-prompting (ql:add-to-init-file))' \
     --quit
0 조회
Back to Blog

관련 글

더 보기 »

[Rust Guide] 8.2. 벡터와 Enum 응용

Rust Guide 8.2. Vector와 Enum 응용 프로그램의 표지 이미지 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%...

Git diff driver를 구축하는 방법

2024년 11월부터 쓰고 싶어 했던 것 중 하나는 https://gitlab.com/tanna.dev/jvt.me/-/work_items/1358 에서 diff를 위한 external command를 만드는 방법입니다.

SQL 개념 및 실무 적용

SQL은 데이터베이스에서 데이터를 저장, 검색 및 분석하는 데 사용되는 언어입니다. SQL 명령은 그 목적에 따라 카테고리로 구분됩니다. DDL vs DML DDL Data D...