SourceSync.ai MCP 서버
SourceSync.ai API를 위한 모델 컨텍스트 프로토콜(MCP) 서버 구현입니다. 이 서버를 통해 AI 모델은 표준화된 인터페이스를 통해 SourceSync.ai의 지식 관리 플랫폼과 상호 작용할 수 있습니다.
특징
- 지식 구성을 위한 네임스페이스 관리
- 다양한 소스(텍스트, URL, 웹사이트, 외부 서비스)에서 콘텐츠를 수집합니다.
- 지식 기반에 저장된 문서를 검색, 업데이트 및 관리합니다.
- 지식 기반에 대해 의미론적 검색과 하이브리드 검색을 수행합니다.
- 구문 분석된 텍스트 URL에서 직접 문서 콘텐츠에 액세스
- 외부 서비스에 대한 연결 관리
- 원활한 AI 통합을 위한 기본 구성 지원
설치
npx로 실행
지엑스피1
Smithery를 통해 설치
Smithery를 통해 Claude Desktop용 sourcesyncai-mcp를 자동으로 설치하려면:
npx -y @smithery/cli install @pbteja1998/sourcesyncai-mcp --client claude
수동 설치
# Clone the repository
git clone https://github.com/yourusername/sourcesyncai-mcp.git
cd sourcesyncai-mcp
# Install dependencies
npm install
# Build the project
npm run build
# Run the server
node dist/index.js
커서에서 실행
Cursor에서 SourceSync.ai MCP를 구성하려면:
- 커서 설정 열기
Features > MCP Servers
로 이동하세요+ Add New MCP Server
클릭하세요- 다음을 입력하세요.
- 이름:
sourcesyncai-mcp
(또는 원하는 이름) - 유형:
command
- 명령어:
env SOURCESYNCAI_API_KEY=your-api-key npx -y sourcesyncai-mcp
추가한 후에는 SourceSync.ai 도구를 Cursor의 AI 기능과 함께 사용하여 지식 관리 요구 사항을 설명할 수 있습니다.
윈드서프에서 달리기
./codeium/windsurf/model_config.json
에 다음을 추가하세요.
{
"mcpServers": {
"sourcesyncai-mcp": {
"command": "npx",
"args": ["-y", "soucesyncai-mcp"],
"env": {
"SOURCESYNC_API_KEY": "your_api_key",
"SOURCESYNC_NAMESPACE_ID": "your_namespace_id",
"SOURCESYNC_TENANT_ID": "your_tenant_id"
}
}
}
}
Claude Desktop에서 실행
Claude Desktop과 함께 이 MCP 서버를 사용하려면:
- Claude Desktop 구성 파일을 찾으세요.
- macOS :
~/Library/Application Support/Claude/claude_desktop_config.json
- 윈도우 :
%APPDATA%\Claude\claude_desktop_config.json
- 리눅스 :
~/.config/Claude/claude_desktop_config.json
- SourceSync.ai MCP 서버를 추가하려면 구성 파일을 편집하세요.
{
"mcpServers": {
"sourcesyncai-mcp": {
"command": "npx",
"args": ["-y", "sourcesyncai-mcp"],
"env": {
"SOURCESYNC_API_KEY": "your_api_key",
"SOURCESYNC_NAMESPACE_ID": "your_namespace_id",
"SOURCESYNC_TENANT_ID": "your_tenant_id"
}
}
}
}
- 구성 파일을 저장하고 Claude Desktop을 다시 시작하세요.
구성
환경 변수
필수의
SOURCESYNC_API_KEY
: SourceSync.ai API 키(필수)
선택 과목
SOURCESYNC_NAMESPACE_ID
: 작업에 사용할 기본 네임스페이스 IDSOURCESYNC_TENANT_ID
: 테넌트 ID(선택 사항)
구성 예제
기본값을 사용한 기본 구성:
export SOURCESYNC_API_KEY=your_api_key
export SOURCESYNC_TENANT_ID=your_tenant_id
export SOURCESYNC_NAMESPACE_ID=your_namespace_id
사용 가능한 도구
입증
validate_api_key
: SourceSync.ai API 키 검증
{
"name": "validate_api_key",
"arguments": {}
}
네임스페이스
create_namespace
: 새로운 네임스페이스를 생성합니다.list_namespaces
: 모든 네임스페이스를 나열합니다.get_namespace
: 특정 네임스페이스의 세부 정보를 가져옵니다.update_namespace
: 네임스페이스 업데이트delete_namespace
: 네임스페이스 삭제
{
"name": "create_namespace",
"arguments": {
"name": "my-namespace",
"fileStorageConfig": {
"provider": "S3_COMPATIBLE",
"config": {
"endpoint": "s3.amazonaws.com",
"accessKey": "your_access_key",
"secretKey": "your_secret_key",
"bucket": "your_bucket",
"region": "us-east-1"
}
},
"vectorStorageConfig": {
"provider": "PINECONE",
"config": {
"apiKey": "your_pinecone_api_key",
"environment": "your_environment",
"index": "your_index"
}
},
"embeddingModelConfig": {
"provider": "OPENAI",
"config": {
"apiKey": "your_openai_api_key",
"model": "text-embedding-3-small"
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "list_namespaces",
"arguments": {
"tenantId": "tenant_XXX"
}
}
{
"name": "get_namespace",
"arguments": {
"namespaceId": "namespace_XXX",
"tenantId": "tenant_XXX"
}
}
{
"name": "update_namespace",
"arguments": {
"namespaceId": "namespace_XXX",
"tenantId": "tenant_XXX",
"name": "updated-namespace-name"
}
}
{
"name": "delete_namespace",
"arguments": {
"namespaceId": "namespace_XXX",
"tenantId": "tenant_XXX"
}
}
데이터 수집
ingest_text
: 텍스트 콘텐츠 수집ingest_urls
: URL에서 콘텐츠 수집ingest_sitemap
: 사이트맵에서 콘텐츠를 수집합니다.ingest_website
: 웹사이트에서 콘텐츠를 수집합니다.ingest_notion
: Notion에서 콘텐츠를 수집합니다.ingest_google_drive
: Google 드라이브에서 콘텐츠를 수집합니다.ingest_dropbox
: Dropbox에서 콘텐츠 수집ingest_onedrive
: OneDrive에서 콘텐츠를 수집합니다.ingest_box
: Box에서 콘텐츠를 수집합니다.get_ingest_job_run_status
: 수집 작업 실행 상태를 가져옵니다.
{
"name": "ingest_text",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "TEXT",
"config": {
"name": "example-document",
"text": "This is an example document for ingestion.",
"metadata": {
"category": "example",
"author": "AI Assistant"
}
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "ingest_urls",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "URLS",
"config": {
"urls": ["https://example.com/page1", "https://example.com/page2"],
"metadata": {
"source": "web",
"category": "documentation"
}
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "ingest_sitemap",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "SITEMAP",
"config": {
"url": "https://example.com/sitemap.xml",
"metadata": {
"source": "sitemap",
"website": "example.com"
}
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "ingest_website",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "WEBSITE",
"config": {
"url": "https://example.com",
"maxDepth": 3,
"maxPages": 100,
"metadata": {
"source": "website",
"domain": "example.com"
}
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "ingest_notion",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "NOTION",
"config": {
"connectionId": "your_notion_connection_id",
"metadata": {
"source": "notion",
"workspace": "My Workspace"
}
}
},
"tenantId": "your_tenant_id"
}
}
{
"name": "ingest_google_drive",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "GOOGLE_DRIVE",
"config": {
"connectionId": "connection_XXX",
"metadata": {
"source": "google_drive",
"owner": "user@example.com"
}
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "ingest_dropbox",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "DROPBOX",
"config": {
"connectionId": "connection_XXX",
"metadata": {
"source": "dropbox",
"account": "user@example.com"
}
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "ingest_onedrive",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "ONEDRIVE",
"config": {
"connectionId": "connection_XXX",
"metadata": {
"source": "onedrive",
"account": "user@example.com"
}
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "ingest_box",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestConfig": {
"source": "BOX",
"config": {
"connectionId": "connection_XXX",
"metadata": {
"source": "box",
"owner": "user@example.com"
}
}
},
"tenantId": "tenant_XXX"
}
}
{
"name": "get_ingest_job_run_status",
"arguments": {
"namespaceId": "your_namespace_id",
"ingestJobRunId": "ingest_job_run_XXX",
"tenantId": "tenant_XXX"
}
}
서류
getDocuments
: 선택적 필터를 사용하여 문서 검색updateDocuments
: 문서 메타데이터 업데이트deleteDocuments
: 문서 삭제resyncDocuments
: 문서 다시 동기화fetchUrlContent
: 문서 URL에서 텍스트 콘텐츠 가져오기
{
"name": "getDocuments",
"arguments": {
"namespaceId": "namespace_XXX",
"tenantId": "tenant_XXX",
"filterConfig": {
"documentTypes": ["PDF"]
},
"includeConfig": {
"parsedTextFileUrl": true
}
}
}
{
"name": "updateDocuments",
"arguments": {
"namespaceId": "namespace_XXX",
"tenantId": "tenant_XXX",
"documentIds": ["doc_XXX", "doc_YYY"],
"filterConfig": {
"documentIds": ["doc_XXX", "doc_YYY"]
},
"data": {
"metadata": {
"status": "reviewed",
"category": "technical"
}
}
}
}
{
"name": "deleteDocuments",
"arguments": {
"namespaceId": "namespace_XXX",
"tenantId": "tenant_XXX",
"documentIds": ["doc_XXX", "doc_YYY"],
"filterConfig": {
"documentIds": ["doc_XXX", "doc_YYY"]
}
}
}
{
"name": "resyncDocuments",
"arguments": {
"namespaceId": "namespace_XXX",
"tenantId": "tenant_XXX",
"documentIds": ["doc_XXX", "doc_YYY"],
"filterConfig": {
"documentIds": ["doc_XXX", "doc_YYY"]
}
}
}
{
"name": "fetchUrlContent",
"arguments": {
"url": "https://api.sourcesync.ai/v1/documents/doc_XXX/content?format=text",
"apiKey": "your_api_key",
"tenantId": "tenant_XXX"
}
}
찾다
semantic_search
: 의미 검색을 수행합니다.hybrid_search
: 하이브리드 검색(의미론적 검색 + 키워드 검색)을 수행합니다.
{
"name": "semantic_search",
"arguments": {
"namespaceId": "your_namespace_id",
"query": "example document",
"topK": 5,
"tenantId": "tenant_XXX"
}
}
{
"name": "hybrid_search",
"arguments": {
"namespaceId": "your_namespace_id",
"query": "example document",
"topK": 5,
"tenantId": "tenant_XXX",
"hybridConfig": {
"semanticWeight": 0.7,
"keywordWeight": 0.3
}
}
}
사이
create_connection
: 외부 서비스에 대한 새로운 연결을 생성합니다.list_connections
: 모든 연결 나열get_connection
: 특정 연결의 세부 정보를 가져옵니다.update_connection
: 연결 업데이트revoke_connection
: 연결을 취소합니다.
{
"name": "create_connection",
"arguments": {
"tenantId": "tenant_XXX",
"namespaceId": "namespace_XXX",
"name": "My Connection",
"connector": "GOOGLE_DRIVE",
"clientRedirectUrl": "https://your-app.com/callback"
}
}
{
"name": "list_connections",
"arguments": {
"tenantId": "tenant_XXX",
"namespaceId": "namespace_XXX"
}
}
{
"name": "get_connection",
"arguments": {
"tenantId": "tenant_XXX",
"namespaceId": "namespace_XXX",
"connectionId": "connection_XXX"
}
}
{
"name": "update_connection",
"arguments": {
"tenantId": "tenant_XXX",
"namespaceId": "namespace_XXX",
"connectionId": "connection_XXX",
"name": "Updated Connection Name",
"clientRedirectUrl": "https://your-app.com/updated-callback"
}
}
{
"name": "revoke_connection",
"arguments": {
"tenantId": "tenant_XXX",
"namespaceId": "namespace_XXX",
"connectionId": "connection_XXX"
}
}
예시 프롬프트
MCP 서버를 구성한 후 Claude 또는 Cursor와 함께 사용할 수 있는 몇 가지 프롬프트 예는 다음과 같습니다.
- "머신 러닝에 대한 정보는 SourceSync 지식 기반에서 검색하세요."
- "이 문서를 내 SourceSync 지식 기반에 수집합니다: [URL]"
- "SourceSync에서 프로젝트 문서를 위한 새 네임스페이스를 만듭니다."
- "내 SourceSync 네임스페이스에 있는 모든 문서를 나열하세요."
- "SourceSync 네임스페이스에서 문서 [document_id]의 텍스트 콘텐츠를 가져옵니다."
문제 해결
연결 문제
SourceSync.ai MCP 서버 연결에 문제가 발생하는 경우:
- 경로 확인 : 구성의 모든 경로가 상대 경로가 아닌 절대 경로인지 확인하세요.
- 권한 확인 : 서버 파일에 실행 권한이 있는지 확인하세요(
chmod +x dist/index.js
). - 개발자 모드 활성화 : Claude Desktop에서 개발자 모드를 활성화하고 MCP 로그 파일을 확인하세요.
- 서버 테스트 : 명령줄에서 직접 서버를 실행합니다.
node /path/to/sourcesyncai-mcp/dist/index.js
- AI 클라이언트 다시 시작 : 변경 사항을 적용한 후 Claude Desktop 또는 Cursor를 완전히 다시 시작합니다.
- 환경 변수 확인 : 모든 필수 환경 변수가 올바르게 설정되었는지 확인하세요.
디버그 로깅
자세한 로깅을 위해 DEBUG 환경 변수를 추가하세요.
개발
프로젝트 구조
src/index.ts
: 메인 진입점 및 서버 설정src/schemas.ts
: 모든 도구에 대한 스키마 정의src/sourcesync.ts
: SourceSync.ai API와 상호 작용하기 위한 클라이언트src/sourcesync.types.ts
: TypeScript 유형 정의
빌딩 및 테스트
# Build the project
npm run build
# Run tests
npm test
특허
MIT
모래밭
문서 콘텐츠 검색 워크플로:
- 먼저
includeConfig.parsedTextFileUrl: true
와 함께 getDocuments
사용하여 콘텐츠 URL이 포함된 문서를 가져옵니다. - 문서 응답에서 URL 추출
fetchUrlContent
사용하여 실제 콘텐츠를 검색합니다.
{
"name": "fetchUrlContent",
"arguments": {
"url": "https://example.com"
}
}