40ants MCP

Um framework para construir servidores Model Context Protocol (MCP) em Common Lisp.

Documentação

40ants-mcp - O framework para construir servidores e clientes MCP em Common Lisp.

Detalhes do Sistema ASDF 40ANTS-MCP

  • Descrição: O framework para construir MCP servidores e clientes em Common Lisp.
  • Licença: Unlicense
  • Autor: Alexander Artemenko svetlyak.40wt@gmail.com
  • Página inicial: [https://40ants.com/mcp/][7318]
  • Rastreador de bugs: [https://github.com/40ants/mcp/issues][6ed2]
  • Controle de fonte: [GIT][e31f]
  • Depende de: [alexandria][8236], [bordeaux-threads][3dbf], [cl-ppcre][49b9], [clack][482d], [clack-sse][b0a4], [jsonrpc][a9bd], [lack][63d7], [lack-request][6a02], [lack-response][521b], [local-time][46a1], [log4cl][7f8b], [log4cl-extras][691c], [openrpc-client][b8fd], [openrpc-server][c8e7], [sento][626d], [serapeum][c41d], [sse-server][0027], [trivial-gray-streams][588d], [uuid][d6b3], [yason][aba2]

[][04f0]

Sobre

Um framework abrangente para construir servidores [Model Context Protocol (MCP)][473e] em Common Lisp. Esta biblioteca fornece uma implementação completa da especificação MCP com uma API fácil de usar para criar servidores que podem interagir com assistentes AI como o Claude Desktop.

O desenvolvimento ativo está em andamento e a interface provavelmente mudará.

Recursos

  • ✅ Transporte STDIO: Suporte nativo para comunicação baseada em STDIO
  • ✅ Transporte HTTP Transmitível: Permitindo criar servidores MCP hospedados remotamente
  • ✅ Sistema de Ferramentas: Registre e execute ferramentas personalizadas com validação de Schema JSON
  • ✅ Construído sobre OpenRPC: Aproveita a robusta [biblioteca 40ants OpenRPC][348e]
  • ✅ Baseado em CLOS: Design orientado a objetos com encapsulamento adequado
  • ✅ Integração Fácil: API simples para adicionar funcionalidades
  • ✅ Tratamento de Erros: Gerenciamento abrangente de erros com códigos de erro JSON-RPC adequados
  • ✅ Edição Interativa: Ferramentas MCP podem ser editadas e atualizadas em tempo real, usando abordagem orientada por REPL

Roteiro

  • 🔄 Suporte Completo à Especificação MCP: Implementação completa do protocolo MCP versão 2025-06-18
  • 🔄 Sistema de Recursos: Sirva recursos dinâmicos e estáticos via URI
  • 🔄 Sistema de Prompts: Forneça modelos de prompt com interpolação de argumentos
  • 🔄 Protocolo de Cliente MCP: Implemente o protocolo do lado do cliente para conectar a servidores MCP

Instalação

Você pode instalar esta biblioteca via Quicklisp, mas se quiser receber atualizações rapidamente, instale-a pelo Ultralisp.org:

(ql-dist:install-dist "http://dist.ultralisp.org/"
                      :prompt nil)
(ql:quickload :40ants-mcp)

Uso

Aqui está um exemplo rápido de como criar um servidor MCP com ferramentas personalizadas:

(defpackage #:my-mcp-server
  (:use #:cl)
  (:import-from #:40ants-mcp/content/text
                #:text-content)
  (:import-from #:openrpc-server))

(in-package #:my-mcp-server)

;; Define your API
(openrpc-server:define-api (my-tools :title "My Custom Tools"))

;; Define a tool that adds two numbers
(40ants-mcp/tools:define-tool (my-tools add) (a b)
  (:summary "Adds two numbers and returns the result.")
  (:param a integer "First number to add.")
  (:param b integer "Second number to add.")
  (:result (soft-list-of text-content))
  (list (make-instance 'text-content
                      :text (format nil "The sum of ~A and ~A is: ~A"
                                  a b (+ a b)))))

;; Start the server
(40ants-mcp/server/definition:start-server my-tools)

Executando como Script

Para uso em produção, você pode criar um script Roswell. Crie um arquivo my-mcp.ros:

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 \"$@\"
|#

(ql:quickload '(:40ants-mcp :alexandria) :silent t)

;; Your package and tool definitions here...

(defun main (&rest argv)
  (declare (ignore argv))
  (40ants-mcp/server/definition:start-server my-tools))

Compile e execute o script:

# Build the script
ros build my-mcp.ros

# Run the server
./my-mcp

# With remote debugging support
SLYNK_PORT=4005 ./my-mcp

Cada ferramenta que você definir deve retornar uma lista de itens de conteúdo. O tipo de conteúdo mais comum é text-content, mas você também pode retornar outros tipos definidos na especificação MCP.

Para mais exemplos, verifique o diretório examples/ no código-fonte.

API

40ANTS-MCP/CONTENT/BASE

pacote 40ants-mcp/content/base

Classes

CONTENT

classe 40ants-mcp/content/base:content ()

Leitores

leitor 40ants-mcp/content/base:content-type (content) (:TYPE = "unknown")

40ANTS-MCP/CONTENT/TEXT

pacote 40ants-mcp/content/text

Classes

TEXT-CONTENT

classe 40ants-mcp/content/text:text-content (content)

Leitores

leitor 40ants-mcp/content/text:content-text (text-content) (:text)

40ANTS-MCP/HTTP-TRANSPORT

pacote 40ants-mcp/http-transport

Classes

HTTP-TRANSPORT

classe 40ants-mcp/http-transport:http-transport ()

Implementação de transporte HTTP para comunicação MCP (Model Context Protocol). Esta classe lida com a troca de mensagens JSON-RPC via requisições HTTP POST.

Leitores

leitor 40ants-mcp/http-transport:transport-lack-app (http-transport) ()

Instância da aplicação Lack

leitor 40ants-mcp/http-transport:transport-message-handler (http-transport) ()

Função para lidar com mensagens recebidas

leitor 40ants-mcp/http-transport:transport-port (http-transport) (:port = 8080)

Número da porta para escutar.

leitor 40ants-mcp/http-transport:transport-running-p (http-transport) (= t)

Indicador se o transporte está ativo

leitor 40ants-mcp/http-transport:transport-server (http-transport) ()

Instância do servidor Clack

Acessores

acessor 40ants-mcp/http-transport:transport-lack-app (http-transport) ()

Instância da aplicação Lack

acessor 40ants-mcp/http-transport:transport-message-handler (http-transport) ()

Função para lidar com mensagens recebidas

acessor 40ants-mcp/http-transport:transport-running-p (http-transport) (= t)

Indicador se o transporte está ativo

acessor 40ants-mcp/http-transport:transport-server (http-transport) ()

Instância do servidor Clack

40ANTS-MCP/SERVER/DEFINITION

pacote 40ants-mcp/server/definition

Classes

MCP-SERVER

classe 40ants-mcp/server/definition:mcp-server (api)

Leitores

leitor 40ants-mcp/server/definition:server-tools-collections (mcp-server) (collections = nil)

Funções

função 40ants-mcp/server/definition:start-server tools-collections &key (transport :stdio) (port 8080)

Inicia o servidor MCP com o transporte especificado. TRANSPORT pode ser :stdio ou :http. PORT é usado apenas quando o transporte é :http.

40ANTS-MCP/SERVER/ERRORS

pacote 40ants-mcp/server/errors

Classes

TOOL-ERROR

condição 40ants-mcp/server/errors:tool-error ()

Você deve sinalizar este erro caso a ferramenta não consiga realizar seu trabalho.

Leitores

leitor 40ants-mcp/server/errors:tool-error-content (tool-error) (:content)

40ANTS-MCP/STDIO-TRANSPORT

pacote 40ants-mcp/stdio-transport

Classes

STDIO-TRANSPORT

classe 40ants-mcp/stdio-transport:stdio-transport ()

Implementação de transporte STDIO para comunicação MCP (Model Context Protocol). Esta classe lida com a troca de mensagens JSON-RPC via fluxos padrão de entrada/saída. Foi projetada para funcionar com a especificação do protocolo MCP para comunicação de modelo AI.

Leitores

leitor 40ants-mcp/stdio-transport:transport-input (stdio-transport) (:input-stream = *standard-input*)

Fluxo de entrada para ler mensagens JSON-RPC. Padrão: standard-input.

leitor 40ants-mcp/stdio-transport:transport-output (stdio-transport) (:output-stream = *standard-output*)

Fluxo de saída para escrever respostas JSON-RPC. Padrão: standard-output.

leitor 40ants-mcp/stdio-transport:transport-running-p (stdio-transport) (= t)

Indicador se o transporte está ativo e processando mensagens.

Acessores

acessor 40ants-mcp/stdio-transport:transport-input (stdio-transport) (:input-stream = *standard-input*)

Fluxo de entrada para ler mensagens JSON-RPC. Padrão: standard-input.

acessor 40ants-mcp/stdio-transport:transport-output (stdio-transport) (:output-stream = *standard-output*)

Fluxo de saída para escrever respostas JSON-RPC. Padrão: standard-output.

acessor 40ants-mcp/stdio-transport:transport-running-p (stdio-transport) (= t)

Indicador se o transporte está ativo e processando mensagens.

Genéricos

função-genérica 40ants-mcp/transport/base:receive-message transport

Recebe uma mensagem JSON-RPC, retorna uma mensagem ou NIL.

função-genérica 40ants-mcp/transport/base:send-message transport message

Envia uma mensagem JSON-RPC, não retorna valores.

40ANTS-MCP/TOOLS

pacote 40ants-mcp/tools

Macros

macro 40ants-mcp/tools:define-tool name args &body body

40ANTS-MCP/TRANSPORT/BASE

pacote 40ants-mcp/transport/base

Genéricos

função-genérica 40ants-mcp/transport/base:receive-message transport

Recebe uma mensagem JSON-RPC, retorna uma mensagem ou NIL.

função-genérica 40ants-mcp/transport/base:send-message transport message

Envia uma mensagem JSON-RPC, não retorna valores.

função-genérica 40ants-mcp/transport/base:start-loop transport message-handler

Inicia o processamento de mensagens usando o transporte fornecido.

função-genérica 40ants-mcp/transport/base:stop-loop transport

Interrompe o processamento de mensagens usando o transporte fornecido. [7318]: https://40ants.com/mcp/ [348e]: https://40ants.com/openrpc/ [e31f]: https://github.com/40ants/mcp [04f0]: https://github.com/40ants/mcp/actions [7ba7]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/content/base.lisp#L1 [347d]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/content/base.lisp#L8 [cd03]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/content/base.lisp#L9 [6dea]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/content/text.lisp#L1 [b3cb]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/content/text.lisp#L11 [dc8f]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/content/text.lisp#L12 [88e6]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/http-transport.lisp#L1 [b290]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/http-transport.lisp#L35 [7034]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/http-transport.lisp#L36 [230a]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/http-transport.lisp#L40 [752d]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/http-transport.lisp#L42 [8339]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/http-transport.lisp#L44 [5e7c]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/http-transport.lisp#L46 [ef30]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/server/definition.lisp#L1 [b145]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/server/definition.lisp#L104 [9f32]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/server/definition.lisp#L38 [0e16]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/server/definition.lisp#L39 [9049]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/server/errors.lisp#L1 [038d]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/server/errors.lisp#L10 [9f3a]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/stdio-transport.lisp#L1 [776e]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/stdio-transport.lisp#L19 [6de0]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/stdio-transport.lisp#L20 [3063]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/stdio-transport.lisp#L24 [02aa]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/stdio-transport.lisp#L28 [e8e4]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/tools.lisp#L1 [19bc]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/tools.lisp#L10 [6304]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/transport/base.lisp#L1 [6fc2]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/transport/base.lisp#L10 [cd26]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/transport/base.lisp#L14 [a41d]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/transport/base.lisp#L18 [c6ea]: https://github.com/40ants/mcp/blob/85602aa0a65bee2c0b4df0d1328de71fe7d592e4/src/transport/base.lisp#L22 [6ed2]: https://github.com/40ants/mcp/issues [473e]: https://modelcontextprotocol.io/ [8236]: https://quickdocs.org/alexandria [3dbf]: https://quickdocs.org/bordeaux-threads [49b9]: https://quickdocs.org/cl-ppcre [482d]: https://quickdocs.org/clack [b0a4]: https://quickdocs.org/clack-sse [a9bd]: https://quickdocs.org/jsonrpc [63d7]: https://quickdocs.org/lack [6a02]: https://quickdocs.org/lack-request [521b]: https://quickdocs.org/lack-response [46a1]: https://quickdocs.org/local-time [7f8b]: https://quickdocs.org/log4cl [691c]: https://quickdocs.org/log4cl-extras [b8fd]: https://quickdocs.org/openrpc-client [c8e7]: https://quickdocs.org/openrpc-server [626d]: https://quickdocs.org/sento [c41d]: https://quickdocs.org/serapeum [0027]: https://quickdocs.org/sse-server [588d]: https://quickdocs.org/trivial-gray-streams [d6b3]: https://quickdocs.org/uuid [aba2]: https://quickdocs.org/yason


[gerado por 40ANTS-DOC]