Conhecendo a MCP pela primeira vez
O MCP (Model Context Protocol) é um protocolo desenvolvido para padronizar a forma como os aplicativos fornecem contexto para modelos grandes. O MCP oferece uma maneira padrão de fornecer dados e ferramentas para o LLM. O uso do MCP facilitará a criação de agentes ou fluxos de trabalho complexos baseados no LLM.
construir
MCP é uma estrutura de CS em que um aplicativo host MCP pode vincular vários servidores MCP.
- MCP Host: programas que precisam obter dados por meio do MCP, como o Claude Desktop, IDEs ou algumas ferramentas de IA, etc.
- Cliente MCP: cliente do protocolo MCP, e o servidor MCP é um suporte individual.
- Servidor MCP: um aplicativo leve que precisa expor alguns recursos especiais por meio do MCP. De acordo com a definição do protocolo MCP, o servidor pode fornecer três tipos de recursos padrão: recursos, ferramentas e prompts. Cada servidor pode fornecer simultaneamente três tipos de recursos ou um deles.
- Recursos: os recursos, semelhantes à leitura de dados de arquivos, podem ser recursos de arquivos ou o conteúdo retornado pela resposta da API.
- Ferramentas: ferramentas, serviços de terceiros, funções de função, por meio das quais você pode controlar quais funções podem ser chamadas pelo LLM.
- Prompts: Prompts, modelos predefinidos para que o usuário conclua tarefas específicas.
- Recursos de dados locais: arquivos locais, bancos de dados, serviços, etc. que o MCP Server pode acessar com segurança.
- Serviço remoto: um sistema externo ao qual o servidor MCP pode se conectar por meio de uma rede (por exemplo, uma API).
Esquema dos serviços da MCP:
Os servidores MCP fornecem uma lista de funções para o aplicativo host por meio do protocolo MCP (por exemplo, fornecem uma lista de ferramentas) e, em seguida, o aplicativo host formata essa lista em um formato que o LLM pode ler e entender. O aplicativo host pode usar essa lista de recursos para enviar algumas solicitações ao LLM que precisam ser processadas pelo modelo grande (esse é o prompt), e o LLM retornará uma cadeia de caracteres json de tool_calls com base nesse prompt. Quando o aplicativo host receber essas tool_calls, ele chamará a ferramenta do servidor MCP correspondente para retornar os resultados correspondentes.
Uso do MCP com o Claude Desktop
Com a ajuda do cliente de desktop Claude, você definitivamente precisa instalar um primeiro, e essa instalação é ignorada. Configuramos um sistema de arquivos MCP Server.
Em seguida, selecione Edit Config em Developer,
show (um ingresso)claude_desktop_config.json
Para concluir a configuração do servidor MCP para o sistema de arquivos, é necessário substituir o nome de usuário pelo nome de usuário do seu próprio computador. (O nome de usuário da configuração precisa ser substituído pelo nome de usuário do seu próprio computador, mas também é necessário instalar localmente o ambiente node.js).
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/username/Desktop",
"/Users/username/Downloads"
]
}
}
}
Quando a configuração estiver concluída, reinicie o cliente Cluade. Ele estará pronto para ser testado.
Clique no ícone do martelo para ver as ferramentas fornecidas pelo MCP Server.
Você pode experimentá-lo digitando o seguinte prompt
Can you take all the images on my desktop and move them to a new folder called “Images”?
O feedback do LLM e o servidor MCP do sistema de arquivos são executados com mais alguns lembretes de permissões, lembre-se de permiti-los.
Em seguida, você verá o LLM e o MCPServer começarem a funcionar.
Tutorial de introdução ao desenvolvimento do servidor MCP (python e pip)
Servidor mcp simples usando a pilha de tecnologia python
Requer instalação
O servidor MCP requer python-sdk, python precisa de 3.10, instale o seguinte
pip install mcp
PS: O MCP usa oficialmente a ferramenta de gerenciamento de pacotes uv, mas eu costumo usar mais o pip, portanto, o texto é principalmente pip. Como algumas das dependências da versão do pacote mcp não são as mais recentes, é melhor obter um ambiente limpo. O desenvolvimento de um servidor MCP requer um cliente de depuração, o inspetor MCP fornece essa função
npx @modelcontextprotocol/inspector <command> <arg1> <arg2>
Em que comando devemos usar python se estivermos usando um servidor escrito em python.<arg1> <arg2>
é um parâmetro opcional. Após a inicialização
Desenvolver um servidor MCP de demonstração
Servidor MCP: um aplicativo leve que precisa expor alguns recursos especiais por meio do MCP. De acordo com a definição do protocolo MCP, o servidor pode fornecer três tipos de recursos padrão: recursos, ferramentas e prompts. Cada servidor pode fornecer simultaneamente três tipos de recursos ou um deles.
- Recursos: os recursos, semelhantes à leitura de dados de arquivos, podem ser recursos de arquivos ou o conteúdo retornado pela resposta da API.
- Ferramentas: ferramentas, serviços de terceiros, funções de função, por meio das quais você pode controlar quais funções podem ser chamadas pelo LLM.
- Prompts: Prompts, modelos predefinidos para que o usuário conclua tarefas específicas.
Aqui está uma demonstração dos três tipos de recursos, usando o python-sdk.
Prompts
Vamos começar com o prompt e examinar ohandle_list_promopts
Listagem de modelos de palavras-chave disponíveis.handle_get_prompt
é obter um modelo de prompt específico com base no nome.
@server.list_prompts() async def handle_list_prompts() -> list[types.Prompt]: """ 提示模版定义 """ return [ types.Prompt( name="example-prompt", description="An example prompt template", arguments=[ types.PromptArgument( name="arg1", description="Example argument", required=True ) ] ) ] @server.get_prompt() async def handle_get_prompt( name: str, arguments: dict[str, str] | None ) -> types.GetPromptResult: """ 提示模板处理 """ if name != "example-prompt": raise ValueError(f"Unknown prompt: {name}") return types.GetPromptResult( description="Example prompt", messages=[ types.PromptMessage( role="user", content=types.TextContent( type="text", text="Example prompt text" ) ) ] )
Recursos
Código para funções de gerenciamento de recursoslist_resources
Lista os recursos disponíveis, retornando uma lista de recursos.read_resource
SAMPLE_RESOURCES é uma demonstração criada para testes.
@server.list_resources() async def list_resources() -> list[types.Resource]: """ 资源定义 """ test='test' return [ types.Resource( uri=AnyUrl(f"file:///{test}.txt"), name=test, description=f"A sample text resource named {test}", mimeType="text/plain", ) # for name in SAMPLE_RESOURCES.keys() ] SAMPLE_RESOURCES={'test':'this demo is a mcp server!'} @server.read_resource() async def read_resource(uri: AnyUrl) -> str | bytes: assert uri.path is not None print(uri.path) name = uri.path.replace(".txt", "").lstrip("/") # print(name) if name not in SAMPLE_RESOURCES: raise ValueError(f"Unknown resource: {uri}") return SAMPLE_RESOURCES[name]
Ferramentas
工具定义和调用,handle_list_tools
定义可用的工具,使用 JSON Schema 验证工具参数。handle_call_tool
处理工具调用,根据工具名称和参数执行相应的操作。 @server.list_tools() async def handle_list_tools() -> list[types.Tool]: """ 工具定义. 每个工具都使用JSON Schema验证指定其参数. """ return [ types.Tool( name="demo-tool", description="Get data tool for a param", inputSchema={ "type": "object", "properties": { "param": { "type": "string", "description": "url", }, }, "required": ["param"], }, ) ] @server.call_tool() async def handle_call_tool( name: str, arguments: dict | None ) -> list[Any]: logging.info(name) """ 处理工具调用 """ if not arguments: raise ValueError("Missing arguments") if name == "demo-tool": param = arguments.get("param") if not param: raise ValueError("Missing state parameter") param = param.upper() return [ types.TextContent( type="text", text=f"text:{param}" ) ] else: raise ValueError(f"Unknown tool: {name}")
inspetor
Um servidor MCP foi escrito da seguinte forma: você pode iniciar o inspetor MCP para depuração, no diretório em que o código do servidor está localizado, digite
npx @modelcontextprotocal/inspector
Após a inicialização, obtenha a seguinte captura de tela de acordo com a figura, acesse http://localhost:5273, de acordo com o que eu disse anteriormente, selecione STDIO para o tipo de transporte, insira python para o comando, insira server.py para os argumentos (o código de demonstração acima é salvo no arquivo server.py), clique em conectar. No diagrama, você pode inserir a chamada de serviço do servidor correspondente para cada tipo e clicar em List Resource (Listar recurso) em Resources (Recursos) para listar todos os recursos e clicar no recurso correspondente para ver o conteúdo do recurso específico.
Isso nos permite interagir com o servidor MCP que desenvolvemos.
Como configurar na área de trabalho do Claude
Configure esse servidor MCP no Claude seguindo a configuração de comando que você acabou de fazer no inspetor. Clique na configuração da área de trabalho do Claude, selecione a guia do desenvolvedor e, em seguida, clique em editar configuração para ir para claude_desktop_config.json.
Atualmente, tenho dois servidores MCP instalados com as seguintes configurações, um para organização de arquivos e outro para o playwright (para instalar o servidor MCP do playwright via npx).
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/crisschan/Desktop",
"/Users/crisschan/Downloads"
]
},
"playwright": {
"command": "npx",
"args": ["-y",
"@executeautomation/playwright-mcp-server"]
}
}
}
Configure nosso próprio serviço de demonstração nesse formato, salve e reinicie o desktop do Claude.
{
"mcpServers": {
,
"demo": {
"command": "/opt/anaconda3/bin/python3",
"args": ["/Users/workspace/pyspace/try_mcp/server.py"]
}
}
}
Na configuração, o comando deve ser o endereço absoluto da versão correspondente do python, e o mesmo vale para o local do código server.py em args, para usar o endereço absoluto.