Sign in to save your progressYou can keep reading without an account, but completed lessons won't be saved.
Sign in

튜토리얼 단계

샘플 프로젝트를 살펴보면서 이 기능을 구현하는 방법을 더 잘 이해해 보겠습니다.

이상적으로는 사용자가 MCP 서버가 접근할 수 있는 파일/폴더를 지정해야 합니다.

이 프로그램은 CLI 인수 목록을 받아들이도록 설정되어 있으며, 이는 사용자가 접근을 허용하고자 하는 경로로 해석됩니다.

해당 경로 목록은 42번째 줄에서 MCPClient에 제공됩니다.

import asyncio
import sys
import os
from dotenv import load_dotenv
from contextlib import AsyncExitStack
from mcp_client import MCPClient
from core.claude import Claude
from core.cli_chat import CliChat
from core.cli import CliApp
load_dotenv()
# Anthropic Config
claude_model = os.getenv("CLAUDE_MODEL", "claude-sonnet-4-5")
anthropic_api_key = os.getenv("ANTHROPIC_API_KEY", "")
assert claude_model, "Error: CLAUDE_MODEL cannot be empty. Update .env"
assert anthropic_api_key, (
"Error: ANTHROPIC_API_KEY cannot be empty. Update .env"
)
async def main():
claude_service = Claude(model=claude_model)
# Get root directories from command line arguments
root_paths = sys.argv[1:]
if not root_paths:
print("Usage: uv run main.py <root1> [root2] ...")
print("Example: uv run main.py /path/to/videos /another/path")
sys.exit(1)
clients = {}
async with AsyncExitStack() as stack:
# Create the MCP client with the provided root directories
doc_client = await stack.enter_async_context(
MCPClient(
command="uv", args=["run", "mcp_server.py"], roots=root_paths
)
)
clients["doc_client"] = doc_client
chat = CliChat(
doc_client=doc_client,
clients=clients,
claude_service=claude_service,
)
cli = CliApp(chat)
await cli.initialize()
await cli.run()
if __name__ == "__main__":
if sys.platform == "win32":
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
asyncio.run(main())