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
MCPservidores 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 emSTDIO - ✅ Transporte
HTTPTransmitível: Permitindo criar servidoresMCPhospedados remotamente - ✅ Sistema de Ferramentas: Registre e execute ferramentas personalizadas com validação de Schema
JSON - ✅ Construído sobre Open
RPC: Aproveita a robusta [biblioteca 40ants OpenRPC][348e] - ✅ Baseado em
CLOS: Design orientado a objetos com encapsulamento adequado - ✅ Integração Fácil:
APIsimples para adicionar funcionalidades - ✅ Tratamento de Erros: Gerenciamento abrangente de erros com códigos de erro
JSON-RPCadequados - ✅ Edição Interativa: Ferramentas
MCPpodem ser editadas e atualizadas em tempo real, usando abordagem orientada porREPL
Roteiro
- 🔄 Suporte Completo à Especificação
MCP: Implementação completa do protocoloMCPversã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 servidoresMCP
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