Browse Source

Docs: add mcp self-host mode (#7163)

### What problem does this PR solve?

Add mcp self-host mode documentation, a complement of #7141.

### Type of change

- [x] Documentation Update

---------

Co-authored-by: writinwaters <93570324+writinwaters@users.noreply.github.com>
tags/v0.18.0
Yongteng Lei 6 months ago
parent
commit
91c5a5c08f
No account linked to committer's email address
1 changed files with 43 additions and 9 deletions
  1. 43
    9
      docs/develop/mcp.md

docs/guides/mcp.md → docs/develop/mcp.md View File

______________________________________________________________________
--- ---
sidebar_position: 7
slug: /MCP server
sidebar_position: 4
slug: /mcp_server
--- ---


# Overview of RAGFlow Model Context Protocol (MCP) Server # Overview of RAGFlow Model Context Protocol (MCP) Server


The MCP server currently offers a specific tool to assist users in searching for relevant information powered by RAGFlow DeepDoc technology: The MCP server currently offers a specific tool to assist users in searching for relevant information powered by RAGFlow DeepDoc technology:


**retrieve**: Fetches relevant chunks from specified `dataset_ids` and optional `document_ids` using the RAGFlow retrieve interface, based on a given question. Details of all available datasets, namely, `id` and `description`, are provided within the tool description for each individual dataset.
- **retrieve**: Fetches relevant chunks from specified `dataset_ids` and optional `document_ids` using the RAGFlow retrieve interface, based on a given question. Details of all available datasets, namely, `id` and `description`, are provided within the tool description for each individual dataset.


## Launching the MCP Server ## Launching the MCP Server


Similar to launching the RAGFlow server, the MCP server can be started either from source code or via Docker. Similar to launching the RAGFlow server, the MCP server can be started either from source code or via Docker.


### Launch Modes

The MCP server supports two launch modes:

1. **Self-Host Mode**:

- In this mode, the MCP server is launched to access a specific tenant's datasets.
- This is the default mode.
- The `--api_key` argument is **required** to authenticate the server with the RAGFlow server.
- Example:
```bash
uv run mcp/server/server.py --host=127.0.0.1 --port=9382 --base_url=http://127.0.0.1:9380 --mode=self-host --api_key=ragflow-xxxxx
```

1. **Host Mode**:

- In this mode, the MCP server allows each user to access their own datasets.
- To ensure secure access, a valid API key must be included in the request headers to identify the user.
- The `--api_key` argument is **not required** during server launch but must be provided in the headers on each client request for user authentication.
- Example:
```bash
uv run mcp/server/server.py --host=127.0.0.1 --port=9382 --base_url=http://127.0.0.1:9380 --mode=host
```

### Launching from Source Code ### Launching from Source Code


All you need to do is stand on the right place and strike out command, assuming you are on the project working directory. All you need to do is stand on the right place and strike out command, assuming you are on the project working directory.


```bash ```bash
uv run mcp/server/server.py --host=127.0.0.1 --port=9382 --base_url=http://127.0.0.1:9380
uv run mcp/server/server.py --host=127.0.0.1 --port=9382 --base_url=http://127.0.0.1:9380 --api_key=ragflow-xxxxx
``` ```


For testing purposes, there is an [MCP client example](#example_mcp_client) provided, free to take! For testing purposes, there is an [MCP client example](#example_mcp_client) provided, free to take!


#### Required Arguments #### Required Arguments


• **`host`**: Specifies the server's host address.
• **`port`**: Defines the server's listening port.
• **`base_url`**: The address of the RAGFlow server that is already running and ready to handle tasks.
- **`host`**: Specifies the server's host address.
- **`port`**: Defines the server's listening port.
- **`base_url`**: The address of the RAGFlow server that is already running and ready to handle tasks.
- **`mode`**: Launch mode, only accept `self-host` or `host`.
- **`api_key`**: Required when `mode` is `self-host` to authenticate the MCP server with the RAGFlow server.


Here are three augments required, the first two,`host` and `port`, are self-explained. The`base_url` is the address of the ready-to-serve RAGFlow server to actually perform the task. Here are three augments required, the first two,`host` and `port`, are self-explained. The`base_url` is the address of the ready-to-serve RAGFlow server to actually perform the task.


- --mcp-port=9382 - --mcp-port=9382
- --mcp-base-url=http://127.0.0.1:9380 - --mcp-base-url=http://127.0.0.1:9380
- --mcp-script-path=/ragflow/mcp/server/server.py - --mcp-script-path=/ragflow/mcp/server/server.py
- --mcp-mode=self-host # `self-host` or `host`
- --mcp--host-api-key="ragflow-xxxxxxx" # only need to privide when mode is `self-host`
``` ```


Then launch it normally `docker compose -f docker-compose.yml`. Then launch it normally `docker compose -f docker-compose.yml`.
ragflow-server | | | | | |___| __/ ___) | |___| _ < \ V / | |___| _ < ragflow-server | | | | | |___| __/ ___) | |___| _ < \ V / | |___| _ <
ragflow-server | |_| |_|\____|_| |____/|_____|_| \_\ \_/ |_____|_| \_\ ragflow-server | |_| |_|\____|_| |____/|_____|_| \_\ \_/ |_____|_| \_\
ragflow-server | ragflow-server |
ragflow-server | MCP launch mode: self-host
ragflow-server | MCP host: 0.0.0.0 ragflow-server | MCP host: 0.0.0.0
ragflow-server | MCP port: 9382 ragflow-server | MCP port: 9382
ragflow-server | MCP base_url: http://127.0.0.1:9380 ragflow-server | MCP base_url: http://127.0.0.1:9380
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #


from mcp.client.session import ClientSession from mcp.client.session import ClientSession
from mcp.client.sse import sse_client from mcp.client.sse import sse_client




async def main(): async def main():
try: try:
async with sse_client("http://localhost:9382/sse", headers={"api_key": "ragflow-IyMGI1ZDhjMTA2ZTExZjBiYTMyMGQ4Zm"}) as streams:
# To access RAGFlow server in `host` mode, you need to attach `api_key` for each request to indicate identification.
# async with sse_client("http://localhost:9382/sse", headers={"api_key": "ragflow-IyMGI1ZDhjMTA2ZTExZjBiYTMyMGQ4Zm"}) as streams:
async with sse_client("http://localhost:9382/sse") as streams:
async with ClientSession( async with ClientSession(
streams[0], streams[0],
streams[1], streams[1],
await session.initialize() await session.initialize()
tools = await session.list_tools() tools = await session.list_tools()
print(f"{tools.tools=}") print(f"{tools.tools=}")
response = await session.call_tool(name="ragflow_retrival", arguments={"dataset_ids": ["ce3bb17cf27a11efa69751e139332ced"], "document_ids": [], "question": "How to install neovim?"})
response = await session.call_tool(name="ragflow_retrieval", arguments={"dataset_ids": ["ce3bb17cf27a11efa69751e139332ced"], "document_ids": [], "question": "How to install neovim?"})
print(f"Tool response: {response.model_dump()}") print(f"Tool response: {response.model_dump()}")


except Exception as e: except Exception as e:

Loading…
Cancel
Save