Skip to content

Commit 56d6fd5

Browse files
authored
feat: add mcp serve support and client demo (#127)
* feat:add mcp serve * feat: add mcp serve and http client api * add: stdio for memos mcp * fix:remove dup content and reconstructed code * fix : reorg core dire and add mcp examples
1 parent a3dfeae commit 56d6fd5

File tree

6 files changed

+1054
-9
lines changed

6 files changed

+1054
-9
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#!/usr/bin/env python3
2+
"""Working FastMCP Client"""
3+
4+
import asyncio
5+
6+
from fastmcp import Client
7+
8+
9+
async def main():
10+
"""Main function using FastMCP Client"""
11+
12+
print("Working FastMCP Client")
13+
print("=" * 40)
14+
15+
async with Client("http://127.0.0.1:8000/mcp") as client:
16+
print("Connected to MOS MCP server!")
17+
18+
print("Available tools:")
19+
tools = await client.list_tools()
20+
for tool in tools:
21+
print("**" * 20)
22+
print(f" - {tool.name}: {tool.description}")
23+
24+
print("Available resources:")
25+
resources = await client.list_resources()
26+
for resource in resources:
27+
print(f" - {resource.uri}: {resource.description}")
28+
29+
print("Testing tool calls...")
30+
31+
print(" Getting user info...")
32+
result = await client.call_tool("get_user_info", {})
33+
print(f" Result: {result.content[0].text}")
34+
35+
print(" Creating user...")
36+
result = await client.call_tool(
37+
"create_user",
38+
{"user_id": "fastmcp_user", "role": "USER", "user_name": "FastMCP Test User"},
39+
)
40+
print(f"Result: {result.content[0].text}")
41+
42+
print(" register cube...")
43+
result = await client.call_tool(
44+
"register_cube",
45+
{
46+
"cube_name_or_path": "cube_default_user",
47+
"user_id": "fastmcp_user",
48+
"cube_id": "fastmcp_user",
49+
},
50+
)
51+
print(f" Result: {result}")
52+
53+
print(" Adding memory...")
54+
result = await client.call_tool(
55+
"add_memory",
56+
{
57+
"memory_content": "This is a test memory from FastMCP client.",
58+
"cube_id": "fastmcp_user",
59+
"user_id": "fastmcp_user",
60+
},
61+
)
62+
print(f" Result: {result.content[0].text}")
63+
64+
print(" Searching memories...")
65+
result = await client.call_tool(
66+
"search_memories", {"query": "test memory", "user_id": "fastmcp_user"}
67+
)
68+
print(f" Result: {result.content[0].text[:200]}...")
69+
70+
print(" Testing chat...")
71+
result = await client.call_tool(
72+
"chat", {"query": "Hello! Tell me about yourself.", "user_id": "fastmcp_user"}
73+
)
74+
print(f" Result: {result.content[0].text[:200]}...")
75+
76+
77+
if __name__ == "__main__":
78+
asyncio.run(main())
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import argparse
2+
import os
3+
4+
from memos.api.mcp_serve import MOSMCPStdioServer
5+
6+
7+
if __name__ == "__main__":
8+
import argparse
9+
10+
from dotenv import load_dotenv
11+
12+
load_dotenv()
13+
14+
# Parse command line arguments
15+
parser = argparse.ArgumentParser(description="MOS MCP Server")
16+
parser.add_argument(
17+
"--transport",
18+
choices=["stdio", "http", "sse"],
19+
default="stdio",
20+
help="Transport method (default: stdio)",
21+
)
22+
parser.add_argument("--host", default="localhost", help="Host for HTTP/SSE transport")
23+
parser.add_argument("--port", type=int, default=8000, help="Port for HTTP/SSE transport")
24+
25+
args = parser.parse_args()
26+
27+
# Set environment variables
28+
os.environ["OPENAI_API_BASE"] = os.getenv("OPENAI_API_BASE")
29+
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
30+
os.environ["MOS_TEXT_MEM_TYPE"] = "tree_text" # "tree_text" need set neo4j
31+
os.environ["NEO4J_URI"] = os.getenv("NEO4J_URI")
32+
os.environ["NEO4J_USER"] = os.getenv("NEO4J_USER")
33+
os.environ["NEO4J_PASSWORD"] = os.getenv("NEO4J_PASSWORD")
34+
35+
# Create and run MCP server
36+
server = MOSMCPStdioServer()
37+
server.run(transport=args.transport, host=args.host, port=args.port)

0 commit comments

Comments
 (0)