> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 如何使用 ClickHouse MCP 服务器构建 LlamaIndex AI 智能体

> 了解如何构建一个可与 ClickHouse MCP 服务器交互的 LlamaIndex AI 智能体。

在本指南中，你将学习如何构建一个 [LlamaIndex](https://docs.llamaindex.ai) AI 智能体，使其能够使用 [ClickHouse 的 MCP 服务器](https://github.com/ClickHouse/mcp-clickhouse) 与 [ClickHouse 的 SQL playground](https://sql.clickhouse.com/) 交互。

<Info>
  **示例笔记本**

  你可以在 [examples 代码仓库](https://github.com/ClickHouse/examples/blob/main/ai/mcp/llamaindex/llamaindex.ipynb) 中找到此示例的笔记本。
</Info>

<div id="prerequisites">
  ## 前置条件
</div>

* 你的系统中需要已安装 Python。
* 你的系统中需要已安装 `pip`。
* 你需要有一个 Anthropic API key，或其他 LLM 提供商的 API key

你可以在 Python REPL 中或通过脚本执行以下步骤。

<Steps>
  <Step title="安装库" id="install-libraries">
    运行以下命令，安装所需的库：

    ```python theme={null}
    pip install -q --upgrade pip
    pip install -q llama-index clickhouse-connect llama-index-llms-anthropic llama-index-tools-mcp
    ```
  </Step>

  <Step title="设置凭证" id="setup-credentials">
    接下来，你需要提供 Anthropic 的 API 密钥：

    ```python theme={null}
    import os, getpass
    os.environ["ANTHROPIC_API_KEY"] = getpass.getpass("Enter Anthropic API Key:")
    ```

    ```response title="Response" theme={null}
    Enter Anthropic API Key: ········
    ```

    <Info>
      **使用其他 LLM 提供商**

      如果你没有 Anthropic API key，但想使用其他 LLM 提供商，
      可以在 [LlamaIndex "LLMs" 文档](https://docs.llamaindex.ai/en/stable/examples/)中查看设置 credentials 的说明。
    </Info>
  </Step>

  <Step title="初始化 MCP 服务器" id="initialize-mcp-and-agent">
    现在将 ClickHouse MCP 服务器配置为指向 ClickHouse SQL playground。
    你需要将这些 Python 函数转换为 Llama Index 工具：

    ```python theme={null}
    from llama_index.tools.mcp import BasicMCPClient, McpToolSpec

    mcp_client = BasicMCPClient(
        "uv",
        args=[
            "run",
            "--with", "mcp-clickhouse",
            "--python", "3.13",
            "mcp-clickhouse"
        ],
        env={
            "CLICKHOUSE_HOST": "sql-clickhouse.clickhouse.com",
            "CLICKHOUSE_PORT": "8443",
            "CLICKHOUSE_USER": "demo",
            "CLICKHOUSE_PASSWORD": "",
            "CLICKHOUSE_SECURE": "true"
        }
    )

    mcp_tool_spec = McpToolSpec(
        client=mcp_client,
    )

    tools = await mcp_tool_spec.to_tool_list_async()
    ```
  </Step>

  <Step title="创建一个 agent" id="create-agent">
    现在，你已经可以创建一个能够访问这些工具的 agent。将单次运行中的工具调用次数上限设为 10。如有需要，你可以修改这个参数：

    ```python theme={null}
    from llama_index.core.agent import AgentRunner, FunctionCallingAgentWorker

    agent_worker = FunctionCallingAgentWorker.from_tools(
        tools=tools,
        llm=llm, verbose=True, max_function_calls=10
    )
    agent = AgentRunner(agent_worker)
    ```
  </Step>

  <Step title="初始化 LLM" id="initialize-llm">
    使用以下代码初始化 Claude Sonnet 4.0：

    ```python theme={null}
    from llama_index.llms.anthropic import Anthropic
    llm = Anthropic(model="claude-sonnet-4-0")
    ```
  </Step>

  <Step title="运行 agent" id="run-agent">
    最后，你可以向 agent 提出一个问题：

    ```python theme={null}
    response = agent.query("What's the most popular repository?")
    ```

    返回的响应较长，因此在下面的示例中
    进行了截断：

    ```response title="Response" theme={null}
    Added user message to memory: What's the most popular repository?
    === LLM Response ===
    I'll help you find the most popular repository. Let me first explore the available databases and tables to understand the data structure.
    === Calling Function ===
    Calling function: list_databases with args: {}
    === Function Output ===
    meta=None content=[TextContent(type='text', text='amazon\nbluesky\ncountry\ncovid\ndefault\ndns\nenvironmental\nfood\nforex\ngeo\ngit\ngithub\nhackernews\nimdb\nlogs\nmetrica\nmgbench\nmta\nnoaa\nnyc_taxi\nnypd\nontime\nopensky\notel\notel_v2\npypi\nrandom\nreddit\nrubygems\nstackoverflow\nstar_schema\nstock\nsystem\ntw_weather\ntwitter\nuk\nwiki\nwords\nyoutube', annotations=None)] isError=False
    === LLM Response ===
    I can see there's a `github` database which likely contains repository data. Let me explore the tables in that database.
    === Calling Function ===
    Calling function: list_tables with args: {"database": "github"}
    === Function Output ===
    ...
    ...
    ...
    === LLM Response ===
    Based on the GitHub data, **the most popular repository is `sindresorhus/awesome`** with **402,292 stars**.

    Here are the top 10 most popular repositories by star count:

    1. **sindresorhus/awesome** - 402,292 stars
    2. **996icu/996.ICU** - 388,413 stars  
    3. **kamranahmedse/developer-roadmap** - 349,097 stars
    4. **donnemartin/system-design-primer** - 316,524 stars
    5. **jwasham/coding-interview-university** - 313,767 stars
    6. **public-apis/public-apis** - 307,227 stars
    7. **EbookFoundation/free-programming-books** - 298,890 stars
    8. **facebook/react** - 286,034 stars
    9. **vinta/awesome-python** - 269,320 stars
    10. **freeCodeCamp/freeCodeCamp** - 261,824 stars

    The `sindresorhus/awesome` repository is a curated list of awesome lists, which explains its popularity as it serves as a comprehensive directory of resources across many different topics in software development.
    ```
  </Step>
</Steps>
