Atharva Raykar 阅读更多 Atharva 的文章 here

MCP explained without hype or fluff

2025年5月12日

如同大多数协议,Model Context Protocol (MCP) 通过将 M ⨯ N 的集成问题转化为 M + N 的集成问题来解决。

一个实现了该协议的 AI 客户端应用无需考虑如何获取数据或执行特定于平台的动作。

MCP 可能不会让你的 AI 更智能,也不会改善你的产品,但它可以减少与已经支持 MCP 的其他应用集成的摩擦。 这对你来说可能重要,也可能不重要。

该协议定义了 MCP Server,它们通常连接到数据源并暴露特定于该数据源的工具。 然后是 MCP Client,它们是 AI 应用的一部分。 它们可以连接到任何 MCP Server,通常是通过一个配置来指定如何连接或运行服务器。

服务器(比客户端更常见)可以暴露:

服务器还有一些其他功能和细微差别,但以上是我认为最突出的。 我见过或使用过的服务器大多只暴露工具调用。

一个小小的具体示例:用于开放数据访问的 MCP Server

我编写了一个小型的 MCP Server,用于暴露对 CKAN 的操作。CKAN 是一个开源数据管理系统,被政府和其他组织用于发布开放数据集。 CKAN 有一个 Web 界面,链接到这些带有标签的数据集,这些数据集通常是半结构化的(CSV、XLS)或完全非结构化的(PDF 报告和论文)。

CKAN 界面的视图

这不利于发现和浏览数据,并且连接各个数据集之间存在很大的摩擦。 我认为拥有一个可以访问 CKAN 上所有数据集并理解它们的 AI 应用会很棒。 开放数据的价值在于可以从中提取的见解。

我可以采用的一种方法是从头开始编写一个 AI 应用,其中包含关于所有 CKAN REST APIs 的知识。 不幸的是,这会将 CKAN 开放数据集的 AI 使用 "锁定" 在我的应用程序中。而且数据,尤其是开放数据,希望是自由的

我真正想要的是一个众所周知的 "门把手",世界上许多 AI 应用和代理都知道如何打开。 这就是 MCP Server 的作用。 我在几个小时内编写了一个。

我使用了官方的 MCP Python SDK 并定义了一些工具。 以下是其中的一个摘录:

@mcp.tool()
async def list_tags(query: Optional[str] = None, limit: int = 50, ctx: Context = None) -> str:
  """List available tags in CKAN.
  Args:
    query: Optional search string to filter tags
    limit: Maximum number of tags to return
  Returns:
    A formatted string containing available tags.
  """
  # code to list all the tags used to tag data, via the CKAN API

@mcp.tool()
async def search_datasets(
  query: Optional[str] = None,
  tags: Optional[List[str]] = None,
  organization: Optional[str] = None,
  format: Optional[str] = None,
  limit: int = 10,
  offset: int = 0,
  ctx: Context = None
) -> str:
  """Search for datasets with various filters.
  Args:
    query: Free text search query
    tags: Filter by tags (list of tag names)
    organization: Filter by organization name
    format: Filter by resource format (e.g., CSV, JSON)
    limit: Maximum number of datasets to return
    offset: Number of datasets to skip
  Returns:
    A formatted string containing matching datasets.
  """
  # code to handle searches, using the CKAN API

@mcp.tool()
async def get_resource_details(resource_id: str, ctx: Context = None) -> str:
  """Get detailed information about a specific resource (file/data).
  Args:
    resource_id: The ID of the resource
  Returns:
    A formatted string containing resource details.
  """
  # code to read the details and get the link to a specific resource, using the CKAN API

SDK 的详细信息在官方指南中有更好的解释,但要点是它是对协议中定义的 JSON-RPC 请求-响应消息的抽象。 我实现的服务器在本地运行,由客户端应用程序作为子进程启动,并使用 stdio 流来传递这些协议消息。 远程 MCP Server 也是可行的。

编写完这个服务器后,我通过编辑 claude_desktop_config.json 将它暴露给 Claude desktop app,它也是一个 MCP Client。 我将它指向了 JusticeHub,这是一个包含法律和司法数据的 CKAN 实例,由 CivicDataLabs 的人创建。

{"mcpServers":{"CKAN Server":{"command":"/Users/atharva/.local/bin/uv","args":["run","--with","httpx","--with","mcp[cli]","mcp","run","/Users/atharva/ckan-mcp-server/main.py"],"env":{"CKAN_URL":"https://justicehub.in"}}}}

这允许我通过 Claude 使用这些数据。

关于探索 JusticeHub 开放数据的 AI 助手对话截图。 助手列出了 JusticeHub 平台上可用的数据集、标签和组织。 对话显示了多个函数调用,如 list_datasets、list_tags、list_organizations 和 search_datasets,以探索数据的不同方面。 截图

Claude 发现了我的 MCP Server,并给了我一个关于 JusticeHub 中可用数据类型的摘要。

对话的延续,显示了助手对 JusticeHub 开放数据平台的全面概述。 它将 JusticeHub 描述为一个专注于印度司法系统的专业数据平台。 概述包括关键数据集类别,如司法系统绩效、法律预算和财务数据、法律援助和诉诸法律以及议会和立法数据,并在每个类别下列出了特定数据集。

我能够利用 Claude 的分析工具来帮助我将数据可视化为一个交互式仪表板!

分屏视图,左侧显示关于创建司法人口统计仪表板的对话,右侧显示实际的仪表板可视化。 右侧显示 "印度司法人口统计仪表板",分析了 1950-2019 年的最高法院法官,可视化显示了性别代表性(95.6% 男性,4.4% 女性),女性在一段时间内的代表性(一条线图显示了从 1970 年代到 2010 年代逐渐增加)以及按十年任命的最高法院法官的部分视图。

我可以设想未来其他的 MCP Client 可以更好地利用这些数据,超越这种基本的会话界面,并解决诸如反向链接和出处等问题,同时提供更结构化、更主观的可视化和分析。

我应该构建 "一个 MCP" 吗?

值得注意的是,这并不是一个成熟的协议 —— 它在不断发展。 但采用率非常高 —— 我打开了第一个随机的 MCP 聚合网站,它列出了来自各种组织和个人的 4000 多个服务器。 我估计还有很多。

基于 MCP 构建是一个清晰、明确的事情,这在动荡的 AI 领域中很少见。 这可能解释了它的受欢迎程度。 但它并不能造就一个好的产品。 它只是你工具箱中的另一个工具。

我(以及 nilenso 的其他人)认为,好的产品建立在需要软件工程成熟度的基础上,对于 AI 产品尤其如此。

所以让我们重新审视一下 MCP 带来的好处:

这种解耦并非没有成本。 需要额外的脚手架来使你的应用程序使用此协议。 你的 LLM 性能对提示词和工具描述很敏感。 随意添加大量工具会影响延迟和响应的整体质量。

对于 GitHub 来说,暴露代码库操作供 Cursor 或 Windsurf 等 AI 工具执行是有意义的。 这是一种有价值的解耦形式。

对于客户端和服务器都在你的控制之下的内部工具,并且价值来自经过良好优化的微调响应,进行这种解耦有意义吗? 可能没有。

无论如何,这里有一些参考资料。 祝你构建愉快。

参考资料,供深入研究

数据库优化故事:Sir Sonnet ⌂ 归档 » 探索基于 RAG 的文本到 SQL 方法

india + canada