在Hello, MCP我们采用HTTP传输协议搭建了一个简单FastMCP服务器并直接采用HTTP请求的形式完整MCP的基本操作包括读取组件列表、调用工具、读取资源和渲染提示词等操作。接下来我们来演示其他两种交互方法一是使用fastmcp命令行二是以编程的方式是客户端SDK。1. 搭建MCP服务器我们直接使用Hello, MCP中搭建的服务器相关代码如下fromfastmcpimportFastMCP mcpFastMCP(Greeting)mcp.tool()asyncdefgreet(name:str)-str:Get a greeting message for the given namereturnfHi,{name}!mcp.resource(greeting://everyone)asyncdefgreet_everyone()-str:Get a greeting message for everyonereturnfHey, everyone!mcp.resource(greeting://{name})asyncdefgreet_to_name(name:str)-str:Get a greeting message for the given namereturnfHello,{name}!mcp.prompt()asyncdefgreet_prompt(name:str)-str:Get a greeting message for the given namereturnfHi,{name}!mcp.run(transporthttp,host0.0.0.0,port3721)在根据名称Greeting创建了代表MCP服务器的FastMCP对象之后我们利用该对象的三种装饰器方法注册了四种典型的组件greet利用mcp.tool装饰器注册的工具greet_everyone:利用mcp.resource装饰器注册的静态文本资源表示绑定于固定URI的单个资源greet_to_name利用mcp.resource装饰器注册的动态资源模板表示绑定于URI模板的一组资源greet_prompt利用mcp.prompt装饰器注册的提示词模板然后我们调用FastMCP的run方法启动服务器。为了方便后面的演示我们设置了如下四个参数transport将传输协议设置为HTTP那么我们就可以单纯地发送HTTP请求的方式与MCP服务交互了host: 设置成0.0.0.0那么我们可以利用localhost、127.0.0.1以及绑定的主机名和真实IP地址访问MCP服务器port显式指定的端口号3721默认为80002 以命令行的方法与MCP服务器交互FastMCP提供了同名的CLI所以我们可以以命令行的形式与MCP服务器交互。比如我们通过如下的方式读取工具列表。PS C:\Users\jinnanfastmcp list http://localhost:3721/mcp Tools(1)greet(name: str)-dict Get a greeting messageforthe given name可以进一步添加命令行开关--input-schema和--output-schema显示工具输入和输出Schema。PS C:\Users\jinnanfastmcp list http://localhost:3721/mcp --input-schema --output-schema Tools(1)greet(name: str)-dict Get a greeting messageforthe given name Input:{additionalProperties:false,properties:{name:{type:string}},required:[name],type:object}Output:{properties:{result:{type:string}},required:[result],type:object,x-fastmcp-wrap-result:true}如果希望看到工具更多细节可以添加--json开关以JSON格式输出工具信息。PS C:\Users\jinnanfastmcp list http://localhost:3721/mcp--json{tools:[{name:greet,description:Get a greeting message for the given name,inputSchema:{additionalProperties:false,properties:{name:{type:string}},required:[name],type:object},outputSchema:{properties:{result:{type:string}},required:[result],type:object,x-fastmcp-wrap-result:true}}]}如果进一步添加命令行开关--resources--prompts可以列出资源和提示词不过貌似只能显式静态资源。PS C:\Users\jinnanfastmcp list http://localhost:3721/mcp--json--resources--prompts{tools:[{name:greet,description:Get a greeting message for the given name,inputSchema:{additionalProperties:false,properties:{name:{type:string}},required:[name],type:object},outputSchema:{properties:{result:{type:string}},required:[result],type:object,x-fastmcp-wrap-result:true}}],resources:[{uri:greeting://everyone,name:greet_everyone,description:Get a greeting message for everyone,mimeType:text/plain}],prompts:[{name:greet_prompt,description:Get a greeting message for the given name,arguments:[{name:name,description:null,required:true}]}]}我们还可以执行按照如下的方式执行fastmcp call命令调用工具greet并将参数name指定为MCP。关于fastmcp cli的详细用法可以参考官方文档。PS C:\Users\jinnanfastmcp call http://localhost:3721/mcp greetnameMCP--json{content:[{type:text,text:Hi, MCP!}],is_error:false,structured_content:{result:Hi, MCP!}}3 利用FastMCP客户端SDKfastmcp库还提供了客户端SDK我们利用它不仅仅可以采用单纯的请求-响应模式完成诸如读取组件和调用工具这样的操作还能提供接收并处理来自服务端的请求和通知。MCP是一个涉及服务端和客户端双边协议fastmcp客户端SDK是MCP客户端协议的实现。对于上面构建的MCP服务器我们可以根据其URLhttp://localhost:3721/mcp创建一个Client对象并调用其list_tools、list_resources、list_resource_templates和list_prompts方法读取工具、静态资源、动态资源模板和提示词模板列表。importasynciofromfastmcpimportClient clientClient(http://localhost:3721/mcp)asyncdefmain():asyncwithclient:toolsawaitclient.list_tools()print(fTools ({len(tools)}):,end)fortoolintools:print(f name:{tool.name}description:{tool.description}input_schema:{tool.inputSchema}output_schema:{tool.outputSchema})resourcesawaitclient.list_resources()print(f\nResources ({len(resources)}):,end)forresourceinresources:print(f name:{resource.name}description:{resource.description}mimeType:{resource.mimeType})resource_templatesawaitclient.list_resource_templates()print(f\nResource Templates ({len(resource_templates)}):,end)fortemplateinresource_templates:print(f name:{template.name}description:{template.description}mimeType:{template.mimeType})promptsawaitclient.list_prompts()print(f\nPrompts ({len(prompts)}):,end)forpromptinprompts:print(f name:{prompt.name}description:{prompt.description}arguments:{prompt.arguments})if__name____main__:asyncio.run(main())输出:Tools (1): name: greet description: Get a greeting message for the given name input_schema: {additionalProperties: False, properties: {name: {type: string}}, required: [name], type: object} output_schema: {properties: {result: {type: string}}, required: [result], type: object, x-fastmcp-wrap-result: True} Resources (1): name: greet_everyone description: Get a greeting message for everyone mimeType: text/plain Resource Templates (1): name: greet_to_name description: Get a greeting message for the given name mimeType: text/plain Prompts (1): name: greet_prompt description: Get a greeting message for the given name arguments: [PromptArgument(namename, descriptionNone, requiredTrue)]我们还可以按照如下的方式调用Client对象的call_tool方法调用工具调用read_resource方法读取指定URI的资源以及调用get_prompt方法完成指定提示词的渲染。importasynciofromtypingimportcastfromfastmcpimportClientfrommcp.typesimportTextResourceContents clientClient(http://localhost:3721/mcp)asyncdefmain():asyncwithclient:resultawaitclient.call_tool(greet,{name:MCP})print(Tool call result:,end)print(f content:{result.content}data:{result.data}structured_content:{result.structured_content}is_error:{result.is_error})resourcecast(list[TextResourceContents],awaitclient.read_resource(greeting://MCP))[0]print(Resource:,end)print(f uri:{resource.uri}mimeType:{resource.mimeType}text:{resource.text})propmptawaitclient.get_prompt(namegreet_prompt,arguments{name:MCP})print(Prompt:,end)print(f description:{propmpt.description}messages:{propmpt.messages})if__name____main__:asyncio.run(main())输出Tool call result: content: [TextContent(typetext, textHi, MCP!, annotationsNone, metaNone)] data: Hi, MCP! structured_content: {result: Hi, MCP!} is_error: False Resource: uri: greeting://MCP mimeType: text/plain text: Hello, MCP! Prompt: description: Get a greeting message for the given name messages: [PromptMessage(roleuser, contentTextContent(typetext, textHi, MCP! This is a prompt response., annotationsNone, metaNone))]
阅读完成 · 觉得有帮助?