一、引言
Cursor 报告称其在实际编码任务中“再次成为最佳”,特别是在处理复杂代码库和高级工具使用方面。
Cognition 发现它在规划代码更改和处理全栈更新方面远超其他模型。
Vercel 强调其在复杂代理工作流中的“卓越精度”。
Replit 成功使用它从头构建复杂的网络应用程序和仪表板,而其他模型则停滞不前。
二、Claude 3.7:技术突破与能力提升
模型概述
各种安全评估
案例
绘制一个笛卡尔坐标系,x轴和y轴用白色标注。
用不同颜色的点标记并用白色文本标注以下位置:
点 A (0, 0):原点,用黄色点标记。
点 B (0, 1):y轴上,用红色点标记。
点 C (1, 1):右上角,用紫色点标记。
在青色阴影区域内,用白色文本清晰显示面积计算公式:
1.从黑色背景开始,绘制并标注坐标系(x轴和y轴)。
2.逐一绘制并标注点 A、B、C、D,使用各自的颜色。
3.用浅蓝色线条连接四点,绘制矩形正方形。
4.缓慢绘制黄色半圆形曲线,强调其为参数曲线。
5.用青色填充曲线下的区域,突出显示待计算的面积。
6.在阴影区域内显示公式
采用数学插图常见的简洁精确风格。
使用黑色背景,搭配白色文本和彩色元素(点、线、阴影),增强视觉对比度。
动画过渡需平滑,节奏适中,避免观众感到仓促。
小结
模型能力持续提升,效果都比以往更好,准确度更高;
我们还没有完全发挥这些模型的潜力,主要是缺乏想象力;
只要善用模型配置和写代码的能力,AI就能在日常工作中带来巨大的帮助。
数据分析
生成报告
日常自动化任务
三、MCP:模型与现实世界的连接
什么是 MCP?
1.获取数据:比如从数据库里查东西、从文件里读内容。
2.执行操作:比如调用API发个消息、管理代码仓库。
1.标准化:就像USB-C成了通用接口,MCP让AI跟外部世界的连接有了统一标准,省去了重复开发的麻烦。
2.安全性:服务器管着访问权限,不用担心数据被乱用。
3.灵活性:不管是数据库、文件还是API,MCP都能支持,而且还能根据需要扩展。
数据分析:AI可以直接查数据库,拿到最新数据帮你分析。
自动化任务:比如让AI调用API,在GitHub上创建issue,或者在Slack上发消息。
如何开发MCP Server?
开发一个MCP Server需要使用Anthropic的Model Context Protocol(MCP),它是一个开源标准协议,帮助AI模型与外部数据源和工具无缝连接。
推荐使用Python SDK,通过uv或pip安装,创建简单的服务器文件,并使用mcp dev命令本地运行。
资源(Resources)资源是AI可以读取的数据,比如文件内容、数据库查询结果或API的响应。 例如,AI可能通过资源获取你的日历事件列表。
工具(Tools)工具是AI可以调用的函数,用于执行特定操作,比如添加新任务或发送邮件,使用工具时,通常需要用户先批准,以确保安全。
curl-LsSfhttps://astral.sh/uv/install.sh|shuvadd"mcp[cli]"
from mcp.server.fastmcp import FastMCPmcp = FastMCP("Simple Server")@mcp.tool()def add(a: int, b: int) -> int:"""Add两个数字"""return a + b@mcp.resource("greeting://{name}")def get_greeting(name: str) -> str:"""获取个性化问候"""return f"Hello, {name}!"
mcpdevserver.py
importsqlite3fromfastapiimportHTTPExceptionfrommcp.server.fastmcpimportFastMCPimportatexitdb_conn=Nonedefinit_db():globaldb_conndb_conn=sqlite3.connect("todo.db")cursor=db_conn.cursor()cursor.execute("CREATETABLEIFNOTEXISTStasks(idINTEGERPRIMARYKEY,descriptionTEXTNOTNULL,completedINTEGERDEFAULT0);")db_conn.commit()init_db()defclose_db():ifdb_conn:db_conn.close()atexit.register(close_db)mcp=FastMCP("To-DoListServer")@mcp.tool()defadd_task(description:str)->int:ifnotdescription.strip():raiseValueError("Taskdescriptioncannotbeempty")cursor=db_conn.cursor()cursor.execute("INSERTINTOtasks(description)VALUES(?);",(description,))task_id=cursor.lastrowiddb_conn.commit()returntask_id@mcp.tool()defmark_task_completed(task_id:int)->bool:cursor=db_conn.cursor()cursor.execute("UPDATEtasksSETcompleted=1WHEREid=?;",(task_id,))rows_affected=cursor.rowcountdb_conn.commit()returnrows_affected>0@mcp.tool()defdelete_task(task_id:int)->bool:cursor=db_conn.cursor()cursor.execute("DELETEFROMtasksWHEREid=?;",(task_id,))rows_affected=cursor.rowcountdb_conn.commit()returnrows_affected>0@mcp.tool()defupdate_task_description(task_id:int,new_description:str)->bool:ifnotnew_description.strip():raiseValueError("Taskdescriptioncannotbeempty")cursor=db_conn.cursor()cursor.execute("UPDATEtasksSETdescription=?WHEREid=?;",(new_description,task_id))rows_affected=cursor.rowcountdb_conn.commit()returnrows_affected>0@mcp.resource("tasks://all")defget_all_tasks()->list[dict]:cursor=db_conn.cursor()cursor.execute("SELECTid,description,completedFROMtasks;")tasks=[]forrowincursor.fetchall():tasks.append({"id":row[0],"description":row[1],"completed":bool(row[2])})returntasks@mcp.resource("task_status://{task_id}")defget_task_status(task_id:int)->dict:cursor=db_conn.cursor()cursor.execute("SELECTdescription,completedFROMtasksWHEREid=?;",(task_id,))row=cursor.fetchone()ifrowisNone:raiseHTTPException(status_code=404,detail="Tasknotfound")return{"description":row[0],"completed":bool(row[1])}@mcp.resource("task_counts://{dummy}")defget_task_counts(dummy:str="all")->dict:cursor=db_conn.cursor()cursor.execute("SELECTCOUNT(*)FROMtasksWHEREcompleted=0;")incomplete_count=cursor.fetchone()[0]cursor.execute("SELECTCOUNT(*)FROMtasksWHEREcompleted=1;")completed_count=cursor.fetchone()[0]return{"incomplete":incomplete_count,"completed":completed_count}@mcp.prompt()deftodo_list_prompt()->str:return"""Youhaveaccesstoato-dolistserver.Youcanusethefollowingtoolsandresources:-Tool:add_task(description)->int-AddsanewtaskwiththegivendescriptionandreturnsthetaskID.-Tool:mark_task_completed(task_id)->bool-MarksthetaskwiththegivenIDascompletedandreturnsTrueifsuccessful,Falseotherwise.-Tool:delete_task(task_id)->bool-DeletesthetaskwiththegivenIDandreturnsTrueifsuccessful,Falseotherwise.-Tool:update_task_description(task_id,new_description)->bool-UpdatesthedescriptionofthetaskwiththegivenIDandreturnsTrueifsuccessful,Falseotherwise.-Resource:tasks://all-Returnsalistofalltasks,eachwiththeirID,description,andcompletionstatus.-Resource:task_status://{task_id}-ReturnsthestatusofthetaskwiththegivenID,includingitsdescriptionandcompletionstatus.-Resource:task_counts://{dummy}-Returnsadictionarywiththecountofincompleteandcompletedtasks.Youcanusethesetomanageyourto-dolist."""部署MCP服务器可以选择本地运行、VPS或云平台,具体取决于使用场景。
确保服务器稳定、安全,并支持JSON-RPC和SSE协议。
使用mcp install server.py可为Claude Desktop安装服务器;对于通用部署,可用Uvicorn或Docker运行。
sudomcpinstallserver.py
2025-03-01T13:15:43.231Z[To-DoListServer][info]Initializingserver...2025-03-01T13:15:43.246Z[To-DoListServer][error]spawnuvENOENT{"context":"connection","stack":"Error:spawnuvENOENT\natChildProcess._handle.onexit(node:internal/child_process:285:19)\natonErrorNT(node:internal/child_process:483:16)\natprocess.processTicksAndRejections(node:internal/process/task_queues:82:21)"}2025-03-01T13:15:43.246Z[To-DoListServer][error]spawnuvENOENT{"stack":"Error:spawnuvENOENT\natChildProcess._handle.onexit(node:internal/child_process:285:19)\natonErrorNT(node:internal/child_process:483:16)\natprocess.processTicksAndRejections(node:internal/process/task_queues:82:21)"}2025-03-01T13:15:43.248Z[To-DoListServer][info]Servertransportclosed2025-03-01T13:15:43.248Z[To-DoListServer][info]Clienttransportclosedbrewinstalluv
mcpinstallserver2.py--withfastapi
mcpinstallserver2.py--withfastapi,uvicorn
from fastmcp import FastMCPmcp = FastMCP("To-Do List Server", dependencies=["fastapi", "uvicorn"])
如何集成MCP Server?
sudomcpinstallserver.py
{"mcpServers":{"playwright":{"command":"npx","args":["-y","@executeautomation/playwright-mcp-server"]}}}#!/usr/bin/env python3"""简单的 MCP 客户端示例连接到 server2.py 并演示 MCP 的基本功能"""import asyncioimport osimport jsonfrom mcp import ClientSession, StdioServerParametersfrom mcp.client.stdio import stdio_clientfrom typing import Optional, List, Dict, Any# 创建连接到 server2.py 的参数server_params = StdioServerParameters(command="python",args=[os.path.join(os.path.dirname(os.path.abspath(__file__)), "server2.py")],env=None# 使用当前环境变量)async def run():"""演示 MCP 客户端功能的主函数"""print("正在连接到 MCP 服务器...")async with stdio_client(server_params) as (read, write):async with ClientSession(read, write) as session:# 1. 初始化连接await session.initialize()print("✓ 已成功初始化连接")# 2. 获取可用的提示词try:prompts = await session.list_prompts()print(f"可用的提示词: {prompts}")if prompts and prompts.prompts:# 3. 获取提示词内容try:prompt = await session.get_prompt(prompts.prompts[0].name)print(f"\n服务器提示词:\n{prompt}\n")except Exception as e:print(f"获取提示词内容时出错: {e}")except Exception as e:print(f"获取提示词列表时出错: {e}")# 4. 列出可用资源try:resources = await session.list_resources()print(f"可用的资源: {resources}")except Exception as e:print(f"获取资源列表时出错: {e}")resources = []# 5. 列出可用工具try:tools = await session.list_tools()print(f"可用的工具: {tools}")except Exception as e:print(f"获取工具列表时出错: {e}")tools = []if __name__ == "__main__":try:asyncio.run(run())except KeyboardInterrupt:print("\n程序已被用户中断")except Exception as e:print(f"\n发生错误: {e}")finally:print("演示完成")
四、MCP 的未来畅想
五、总结
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |