Anthropic的新协议--MCP

Hello,欢迎来到流穿的AI探索之路系列专栏,作为一名AI应用工程师,我会在这儿更新一些前沿技术,欢迎关注哦

Screenshot 2024-12-16 at 11.40.40

2024年底,Anthropic发布了 MCP协议。Anthropic就是发布了Claude系列模型的公司(现在gpt基础模型不更新还退步,claude真的很棒)

除去官方的各种美化和包装,这到底是什么?我大胆说一说:这其实是另一种形式的 Function Calling

简单看下效果:
调用结果


一、简单解释 Function Calling

大模型可以看作在一个封闭的“盒子”里,无法实时获取外部信息。为了让大模型获取外部数据,我们可以提供一些“方法”,例如:

方法: 获取天气
需要传入的参数: 经度、纬度
返回结果:空气质量、温度、湿度...

在提问时,我们携带一个方法列表,里面写着各种方法。大模型决定调用某个方法时,会输出方法名和参数;该方法在本地执行,并将结果返回给大模型。


二、快速开始

简介

模型上下文协议 (MCP) 是一种开放协议,可实现 LLM 应用与外部数据源和工具之间的无缝集成。

GitHub地址

在此处我们还是跳开这些枯燥的理论,直接上手官方案例(有条件的小伙伴可以亲自试试!)

我是Mac环境、Python语言(TS也支持)

(一)安装包管理器 - uv

执行以下命令安装 uv:

curl -LsSf https://astral.sh/uv/install.sh | sh

提示:
安装后需重启终端。如果环境变量写入失败,手动修改 ~/.zshrc

export PATH="$HOME/.local/bin:$PATH"

**吐槽:**官方居然选了个刚发布不久的依赖管理工具 uv,坑点一堆。我后续探索下给换成poetry版本的吧

(二)初始化项目

以下是完整步骤:

# 创建项目
uv init weather
cd weather

# 创建虚拟环境
uv venv
source .venv/bin/activate

# 安装依赖
uv add mcp httpx

# 删除示例文件
rm hello.py

# 创建文件
mkdir -p src/weather
touch src/weather/__init__.py
touch src/weather/server.py

(三)编写代码

1. 修改 pyproject.toml

pyproject.toml 尾部添加以下内容:

[build-system]
requires = [ "hatchling",]
build-backend = "hatchling.build"

[project.scripts]
weather = "weather:main"
2. 编写 __init__.py

文件路径:src/weather/__init__.py

from . import server
import asyncio

def main():
    """Main entry point for the package."""
    asyncio.run(server.main())

# Optionally expose other important items at package level
__all__ = ['main', 'server']
3. 编写 server.py

文件路径:src/weather/server.py

from typing import Any
import asyncio
import httpx
from mcp.server.models import InitializationOptions
import mcp.types as types
from mcp.server import NotificationOptions, Server
import mcp.server.stdio

NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

server = Server("weather")

@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
    return [
        types.Tool(
            name="get-alerts",
            description="Get weather alerts for a state",
            inputSchema={
                "type": "object",
                "properties": {
                    "state": {
                        "type": "string",
                        "description": "Two-letter state code (e.g. CA, NY)",
                    },
                },
                "required": ["state"],
            },
        ),
        types.Tool(
            name="get-forecast",
            description="Get weather forecast for a location",
            inputSchema={
                "type": "object",
                "properties": {
                    "latitude": {
                        "type": "number",
                        "description": "Latitude of the location",
                    },
                    "longitude": {
                        "type": "number",
                        "description": "Longitude of the location",
                    },
                },
                "required": ["latitude", "longitude"],
            },
        ),
    ]

@server.call_tool()
async def handle_call_tool(
    name: str, arguments: dict | None
) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:
    if not arguments:
        raise ValueError("Missing arguments")
  
    if name == "get-alerts":
        return [
            types.TextContent(
                type="text",
                text="气温38,湿度60%"
            )
        ]
    elif name == "get-forecast":
        return [types.TextContent(
            type="text",
            text="气温18,湿度10%"
        )]
    else:
        raise ValueError(f"Unknown tool: {name}")

async def main():
    async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
        await server.run(
            read_stream,
            write_stream,
            InitializationOptions(
                server_name="weather",
                server_version="0.1.0",
                capabilities=server.get_capabilities(
                    notification_options=NotificationOptions(),
                    experimental_capabilities={},
                ),
            ),
        )

if __name__ == "__main__":
    asyncio.run(main())

这里我做了优化,第四章会讲

(四)运行项目

项目编写完成后,运行以下命令启动服务:

uv run src/weather/server.py

三、使用 Claude for Desktop 测试

第二章我们就完成了代码部分,接下来就要看效果

我前面说:MCP 是 Function Calling 的另一种实现。因此需要一个大模型主动调用。
这里我们使用 Claude for Desktop,它可以作为测试客户端(不是唯一的,你也可以用vscode搭建一个客户端)

Claude for Desktop 下载链接

修改配置文件

将第二章写的服务注册到 Claude for Desktop:

vim ~/Library/Application Support/Claude/claude_desktop_config.json

添加如下内容:

{
    "mcpServers": {
        "weather": {
            "command": "uv", //缺少环境变量的话可以写绝对路径
            "args": [
                "--directory",
                "/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather",# 目录记得改
                "run",
                "weather"
            ]
        }
    }
}

保存后,重启 Claude for Desktop

测试 MCP 工具

重新打开 Claude 后,点击工具栏中的锤子图标:

工具列表

基于可以看到我们实现的工具了:

可用工具

输入问题,即可看到 Claude 调用本地服务并返回答案:

调用结果

四、原理解读

(一)过程分析

  1. 我们向 Claude 提问;
  2. Claude 分析可用工具并决定调用某个工具;
  3. 客户端(Claude for Desktop)通过 MCP 协议调用工具;
  4. 结果返回给 Claude;
  5. Claude 根据结果生成答案。

(二)代码核心

代码的核心功能集中在以下两部分:

# 列出工具,供 LLM 选择
@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:

# 执行方法,解析并处理 LLM 调用请求
@server.call_tool()
async def handle_call_tool(
    name: str, arguments: dict | None
) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:

注: 示例代码中 handle_call_tool 返回固定回复,是因为原版调用美国国家气象数据局 API,配置较麻烦。实际使用时,可替换为真实 API。

更多问题可参考官方 故障排除文档

那么到这儿其实就基本能看明白了,后续深入会视情况再推进

<think>好的,用户现在想获取Claude-3.7的API密钥。我需要先确认正确的获取途径,然后整理出步骤清晰的答案。 首先,根据用户提供的引用[1]和[2],Claude-3.7-Sonnet的API密钥可以通过Anthropic官网和Amazon Bedrock两种方式获取。我需要分别说明这两种方法的步骤。 对于Anthropic官网,用户需要注册账号,创建API密钥,然后可能需要绑定支付方式。这里要注意的是,用户可能有免费试用额度,但需要信用卡验证。 然后是Amazon Bedrock的途径。用户需要有AWS账号,然后在Bedrock服务中申请模型权限,生成访问密钥。这里需要提到AWS的权限管理和安全设置,比如IAM角色。 另外,用户提到Cursor IDE可能集成Claude模型,但不确定是否需要独立API密钥。需要建议用户查看Cursor的文档,或者直接通过Anthropic或AWS获取。 可能需要注意的常见问题包括:地区限制、支付方式支持、以及审核流程的时间。需要提醒用户这些潜在的问题,并提供官方链接供参考。 最后,确保回答结构清晰,分点说明两种方法,并附上相关引用。避免使用复杂术语,保持步骤简单明了,方便用户操作。</think>### 如何获取Claude-3.7 API密钥 #### 方法一:通过Anthropic官方平台获取(开发者优先) 1. **注册Anthropic账号** - 访问[Anthropic官网](https://www.anthropic.com),选择开发者注册通道 - 完成企业邮箱验证和开发者身份认证(需提供GitHub/LinkedIn等开发者资料)[^1] 2. **创建API Key** - 登录后进入`API Management`控制台 - 选择`Claude-3.7-Sonnet`模型,点击`Generate New Key` - 设置密钥访问权限范围(建议先选择测试环境权限)[^2] 3. **绑定支付方式** - 需添加信用卡完成$5预授权验证 - 用户可获得$10免费调用额度(有效期30天) #### 方法二:通过Amazon Bedrock获取(企业用户推荐) 1. **登录AWS控制台** - 访问[Amazon Bedrock控制台](https://aws.amazon.com/bedrock/) - 在「模型访问」中请求`Claude-3.7-Sonnet`的访问权限 2. **配置IAM权限** ```json { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "bedrock:*", "Resource": "arn:aws:bedrock:*::model/anthropic.claude-3-sonnet-20240229" }] } ``` 3. **生成访问密钥** - 通过AWS CLI执行: ```bash aws bedrock create-model-access-key --model-id anthropic.claude-3-sonnet-20240229 ``` #### 注意事项 - 两种方式均需通过企业实名认证(个人开发者建议使用方法一) - API调用费用按token计费,建议开启用量警报 - 中国用户需通过AWS海外区域(如东京/加坡)访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值