mirror of
https://github.com/agentscope-ai/ReMe.git
synced 2026-09-14 23:21:04 +00:00
424 lines
11 KiB
Markdown
424 lines
11 KiB
Markdown
---
|
|
jupytext:
|
|
formats: md:myst
|
|
text_representation:
|
|
extension: .md
|
|
format_name: myst
|
|
format_version: 0.13
|
|
jupytext_version: 1.11.5
|
|
kernelspec:
|
|
display_name: Python 3
|
|
language: python
|
|
name: python3
|
|
---
|
|
|
|
# MCP Quick Start Guide
|
|
|
|
This guide will help you get started with ReMe using the Model Context Protocol (MCP) interface for seamless
|
|
integration with MCP-compatible clients.
|
|
|
|
## 🚀 What You'll Learn
|
|
|
|
- How to set up and configure ReMe MCP server
|
|
- How to connect to the server using Python MCP clients
|
|
- How to use task memory operations through MCP
|
|
- How to build memory-enhanced agents with MCP integration
|
|
|
|
## 📋 Prerequisites
|
|
|
|
- Python 3.12+
|
|
- LLM API access (OpenAI or compatible)
|
|
- Embedding model API access
|
|
- MCP-compatible client (Claude Desktop, or custom MCP client)
|
|
|
|
## 🛠️ Installation
|
|
|
|
### Option 1: Install from PyPI (Recommended)
|
|
|
|
```bash
|
|
pip install reme-ai
|
|
```
|
|
|
|
### Option 2: Install from Source
|
|
|
|
```bash
|
|
git clone https://github.com/agentscope-ai/ReMe.git
|
|
cd ReMe
|
|
pip install .
|
|
```
|
|
|
|
## ⚙️ Environment Setup
|
|
|
|
Create a `.env` file in your project directory:
|
|
|
|
```{code-cell}
|
|
FLOW_EMBEDDING_API_KEY=sk-xxxx
|
|
|
|
|
|
FLOW_EMBEDDING_BASE_URL=https://xxxx/v1
|
|
|
|
FLOW_LLM_API_KEY=sk-xxxx
|
|
FLOW_LLM_BASE_URL=https://xxxx/v1
|
|
```
|
|
|
|
## 🚀 Building an MCP Server with ReMe
|
|
|
|
ReMe provides a flexible framework for building MCP servers that can communicate using either STDIO or SSE (Server-Sent
|
|
Events) transport protocols.
|
|
|
|
### Starting the MCP Server
|
|
|
|
#### Option 1: STDIO Transport (Recommended for MCP clients)
|
|
|
|
```bash
|
|
reme \
|
|
backend=mcp \
|
|
mcp.transport=stdio \
|
|
llm.default.model_name=qwen3-30b-a3b-thinking-2507 \
|
|
embedding_model.default.model_name=text-embedding-v4 \
|
|
vector_store.default.backend=local
|
|
```
|
|
|
|
#### Option 2: SSE Transport (Server-Sent Events)
|
|
|
|
```bash
|
|
reme \
|
|
backend=mcp \
|
|
mcp.transport=sse \
|
|
http_service.port=8001 \
|
|
llm.default.model_name=qwen3-30b-a3b-thinking-2507 \
|
|
embedding_model.default.model_name=text-embedding-v4 \
|
|
vector_store.default.backend=local
|
|
```
|
|
|
|
The SSE server will start on `http://localhost:8002/sse`
|
|
|
|
### Configuring MCP Server for Claude Desktop
|
|
|
|
To integrate with Claude Desktop, add the following configuration to your `claude_desktop_config.json`:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"reme": {
|
|
"command": "reme",
|
|
"args": [
|
|
"backend=mcp",
|
|
"mcp.transport=stdio",
|
|
"llm.default.model_name=qwen3-30b-a3b-thinking-2507",
|
|
"embedding_model.default.model_name=text-embedding-v4",
|
|
"vector_store.default.backend=local_file"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
This configuration:
|
|
|
|
1. Registers a new MCP server named "reme"
|
|
2. Specifies the command to launch the server (`reme`)
|
|
3. Configures the server to use STDIO transport
|
|
4. Sets the LLM and embedding models to use
|
|
5. Configures the vector store backend
|
|
|
|
### Advanced Server Configuration Options
|
|
|
|
For more advanced use cases, you can configure the server with additional parameters:
|
|
|
|
```bash
|
|
# Full configuration example
|
|
reme \
|
|
backend=mcp \
|
|
mcp.transport=stdio \
|
|
http_service.host=0.0.0.0 \
|
|
http_service.port=8002 \
|
|
llm.default.model_name=qwen3-30b-a3b-thinking-2507 \
|
|
embedding_model.default.model_name=text-embedding-v4 \
|
|
vector_store.default.backend=elasticsearch \
|
|
```
|
|
|
|
## 🔌 Using Python Client to Call MCP Services
|
|
|
|
The ReMe framework provides a Python client for interacting with MCP services. This section focuses specifically on
|
|
using the `summary_task_memory` and `retrieve_task_memory` tools.
|
|
|
|
### Setting Up the Python MCP Client
|
|
|
|
First, install the required packages:
|
|
|
|
```bash
|
|
pip install fastmcp dotenv
|
|
```
|
|
|
|
Then, create a basic client connection:
|
|
|
|
```{code-cell}
|
|
import asyncio
|
|
from fastmcp import Client
|
|
from dotenv import load_dotenv
|
|
|
|
# Load environment variables
|
|
load_dotenv()
|
|
|
|
# MCP server URL (for SSE transport)
|
|
MCP_URL = "http://0.0.0.0:8002/sse/"
|
|
WORKSPACE_ID = "my_workspace"
|
|
|
|
|
|
async def main():
|
|
async with Client(MCP_URL) as client:
|
|
# Your MCP operations will go here
|
|
pass
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|
|
```
|
|
|
|
### Using the Task Memory Summarizer
|
|
|
|
The `summary_task_memory` tool transforms conversation trajectories into valuable task memories:
|
|
|
|
```{code-cell}
|
|
async def run_summary(client, messages):
|
|
"""
|
|
Generate a summary of conversation messages and create task memories
|
|
|
|
Args:
|
|
client: MCP client instance
|
|
messages: List of message objects from a conversation
|
|
|
|
Returns:
|
|
None
|
|
"""
|
|
try:
|
|
result = await client.call_tool(
|
|
"summary_task_memory",
|
|
arguments={
|
|
"workspace_id": "my_workspace",
|
|
"trajectories": [
|
|
{"messages": messages, "score": 1.0}
|
|
]
|
|
}
|
|
)
|
|
|
|
# Parse the response
|
|
import json
|
|
response_data = json.loads(result.content)
|
|
|
|
# Extract memory list from response
|
|
memory_list = response_data.get("metadata", {}).get("memory_list", [])
|
|
print(f"Created memories: {memory_list}")
|
|
|
|
# Optionally save memories to file
|
|
with open("task_memory.jsonl", "w") as f:
|
|
f.write(json.dumps(memory_list, indent=2, ensure_ascii=False))
|
|
|
|
except Exception as e:
|
|
print(f"Error running summary: {e}")
|
|
```
|
|
|
|
### Using the Task Memory Retriever
|
|
|
|
The `retrieve_task_memory` tool allows you to retrieve relevant memories based on a query:
|
|
|
|
```{code-cell}
|
|
async def run_retrieve(client, query):
|
|
"""
|
|
Retrieve relevant task memories based on a query
|
|
|
|
Args:
|
|
client: MCP client instance
|
|
query: The query to retrieve relevant memories
|
|
|
|
Returns:
|
|
String containing the retrieved memory answer
|
|
"""
|
|
try:
|
|
result = await client.call_tool(
|
|
"retrieve_task_memory",
|
|
arguments={
|
|
"workspace_id": "my_workspace",
|
|
"query": query,
|
|
}
|
|
)
|
|
|
|
# Parse the response
|
|
import json
|
|
response_data = json.loads(result.content)
|
|
|
|
# Extract and return the answer
|
|
answer = response_data.get("answer", "")
|
|
print(f"Retrieved memory: {answer}")
|
|
return answer
|
|
|
|
except Exception as e:
|
|
print(f"Error retrieving memory: {e}")
|
|
return ""
|
|
```
|
|
|
|
### Complete Memory-Augmented Agent Example
|
|
|
|
Here's a complete example showing how to build a memory-augmented agent using the MCP client:
|
|
|
|
```{code-cell}
|
|
import json
|
|
import asyncio
|
|
from fastmcp import Client
|
|
from dotenv import load_dotenv
|
|
|
|
# Load environment variables
|
|
load_dotenv()
|
|
|
|
# API configuration
|
|
MCP_URL = "http://0.0.0.0:8002/sse/"
|
|
WORKSPACE_ID = "test_workspace"
|
|
|
|
|
|
async def run_agent(client, query):
|
|
"""Run the agent with a specific query"""
|
|
result = await client.call_tool(
|
|
"react",
|
|
arguments={"query": query}
|
|
)
|
|
|
|
response_data = json.loads(result.content)
|
|
answer = response_data.get("answer", "")
|
|
messages = response_data.get("messages", [])
|
|
|
|
return messages
|
|
|
|
|
|
async def run_summary(client, messages):
|
|
"""Generate task memories from conversation"""
|
|
result = await client.call_tool(
|
|
"summary_task_memory",
|
|
arguments={
|
|
"workspace_id": WORKSPACE_ID,
|
|
"trajectories": [
|
|
{"messages": messages, "score": 1.0}
|
|
]
|
|
}
|
|
)
|
|
|
|
response_data = json.loads(result.content)
|
|
memory_list = response_data.get("metadata", {}).get("memory_list", [])
|
|
|
|
return memory_list
|
|
|
|
|
|
async def run_retrieve(client, query):
|
|
"""Retrieve relevant task memories"""
|
|
result = await client.call_tool(
|
|
"retrieve_task_memory",
|
|
arguments={
|
|
"workspace_id": WORKSPACE_ID,
|
|
"query": query,
|
|
}
|
|
)
|
|
|
|
response_data = json.loads(result.content)
|
|
answer = response_data.get("answer", "")
|
|
|
|
return answer
|
|
|
|
|
|
async def memory_augmented_workflow():
|
|
"""Complete memory-augmented agent workflow"""
|
|
query1 = "Analyze Xiaomi Corporation"
|
|
query2 = "Analyze the company Tesla."
|
|
|
|
async with Client(MCP_URL) as client:
|
|
# Step 1: Build initial memories with query2
|
|
print(f"Building memories with: '{query2}'")
|
|
messages = await run_agent(client, query=query2)
|
|
|
|
# Step 2: Summarize conversation to create memories
|
|
print("Creating memories from conversation")
|
|
memory_list = await run_summary(client, messages)
|
|
print(f"Created {len(memory_list)} memories")
|
|
|
|
# Step 3: Retrieve relevant memories for query1
|
|
print(f"Retrieving memories for: '{query1}'")
|
|
retrieved_memory = await run_retrieve(client, query1)
|
|
|
|
# Step 4: Run agent with memory-augmented query
|
|
print("Running memory-augmented agent")
|
|
augmented_query = f"{retrieved_memory}\n\nUser Question:\n{query1}"
|
|
final_messages = await run_agent(client, query=augmented_query)
|
|
|
|
# Extract the agent's final answer
|
|
final_answer = ""
|
|
for msg in final_messages:
|
|
if msg.get("role") == "assistant" and msg.get("content"):
|
|
final_answer = msg.get("content")
|
|
break
|
|
|
|
print(f"Memory-augmented response: {final_answer}")
|
|
|
|
|
|
# Run the workflow
|
|
if __name__ == "__main__":
|
|
asyncio.run(memory_augmented_workflow())
|
|
```
|
|
|
|
### Managing Vector Store with MCP
|
|
|
|
You can also manage your vector store through MCP:
|
|
|
|
```{code-cell}
|
|
async def manage_vector_store(client):
|
|
# Delete a workspace
|
|
await client.call_tool(
|
|
"vector_store",
|
|
arguments={
|
|
"workspace_id": WORKSPACE_ID,
|
|
"action": "delete",
|
|
}
|
|
)
|
|
|
|
# Dump memories to disk
|
|
await client.call_tool(
|
|
"vector_store",
|
|
arguments={
|
|
"workspace_id": WORKSPACE_ID,
|
|
"action": "dump",
|
|
"path": "./backups/",
|
|
}
|
|
)
|
|
|
|
# Load memories from disk
|
|
await client.call_tool(
|
|
"vector_store",
|
|
arguments={
|
|
"workspace_id": WORKSPACE_ID,
|
|
"action": "load",
|
|
"path": "./backups/",
|
|
}
|
|
)
|
|
```
|
|
|
|
## 🐛 Common Issues and Troubleshooting
|
|
|
|
### MCP Server Won't Start
|
|
- Check if the required ports are available (for SSE transport)
|
|
- Verify your API keys in `.env` file
|
|
- Ensure Python version is 3.12+
|
|
- Check MCP transport configuration
|
|
|
|
### MCP Client Connection Issues
|
|
- For STDIO: Ensure the command path is correct in your MCP client config
|
|
- For SSE: Verify the server URL and port accessibility
|
|
- Check firewall settings for SSE connections
|
|
|
|
### No Memories Retrieved
|
|
|
|
- Make sure you've run the summarizer tool first to create memories
|
|
- Check if workspace_id matches between operations
|
|
- Verify vector store backend is properly configured
|
|
|
|
### API Connection Errors
|
|
- Confirm LLM_BASE_URL and API keys are correct
|
|
- Test API access independently
|
|
- Check network connectivity
|