Roam Research

local-only server

The server can only run on the client’s local machine because it depends on local resources.

Integrations

  • Supports loading configuration from .env files for managing environment variables like API tokens and graph names.

  • Enables parsing and conversion of markdown content, with support for importing nested markdown structures into Roam Research with proper hierarchy preservation.

  • Provides comprehensive access to Roam Research's API functionality, allowing AI assistants to interact with Roam Research graphs through tools for fetching, creating, and updating pages and blocks, importing markdown, searching content, and executing Datalog queries.

Roam Research MCP 서버

Roam Research의 API 기능에 대한 포괄적인 접근을 제공하는 모델 컨텍스트 프로토콜(MCP) 서버입니다. 이 서버를 통해 Claude와 같은 AI 비서가 표준화된 인터페이스를 통해 Roam Research 그래프와 상호 작용할 수 있습니다. (현재 진행 중인 개인 프로젝트이며 Roam Research의 공식 승인을 받지 않았습니다.)

설치

패키지를 글로벌하게 설치할 수 있습니다:

지엑스피1

또는 저장소를 복제하고 소스에서 빌드합니다.

git clone https://github.com/2b3pro/roam-research-mcp.git cd roam-research-mcp npm install npm run build

특징

이 서버는 Roam Research와 상호 작용하기 위한 강력한 도구를 제공합니다.

  • .env 지원을 통한 환경 변수 처리
  • 포괄적인 입력 검증
  • 대소문자 구분 없이 페이지 제목 일치
  • 재귀적 블록 참조 해결
  • 마크다운 구문 분석 및 변환
  • 일일 페이지 통합
  • 자세한 디버그 로깅
  • 효율적인 배치 작업
  • 계층적 개요 생성
  1. roam_fetch_page_by_title : 제목별로 페이지의 콘텐츠를 가져와서 읽고, 최대 4단계 깊이까지 블록 참조를 재귀적으로 확인합니다.
  2. roam_create_page : 선택적 콘텐츠로 새 페이지를 만듭니다.
  3. roam_create_block : 페이지에 새로운 블록을 생성합니다(기본값은 오늘의 일일 페이지입니다)
  4. roam_import_markdown : 특정 블록 아래에 중첩된 마크다운 콘텐츠를 가져옵니다.
  5. roam_add_todo : 체크박스 구문을 사용하여 오늘의 일일 페이지에 여러 개의 할 일 항목을 추가합니다.
  6. roam_create_outline : 적절한 중첩 및 구조를 사용하여 계층적 개요를 만듭니다.
  7. roam_search_block_refs : 페이지 내 또는 그래프 전체에서 블록 참조를 검색합니다.
  8. roam_search_hierarchy : 블록 부모-자식 관계를 탐색하고 검색합니다.
  9. roam_find_pages_modified_today : 오늘 자정 이후 수정된 모든 페이지를 찾습니다.
  10. roam_search_by_text : 모든 페이지 또는 특정 페이지 내에서 특정 텍스트가 포함된 블록을 검색합니다.
  11. roam_update_block : 직접 텍스트 또는 패턴 기반 변환으로 블록 콘텐츠 업데이트
  12. roam_search_by_date : 생성 또는 수정 날짜를 기준으로 블록 및 페이지 검색
  13. roam_search_for_tag : 근처 태그로 선택적으로 필터링하여 특정 태그가 포함된 블록을 검색합니다.
  14. roam_remember : 자동 태그 지정으로 기억이나 정보를 저장하고 분류합니다.
  15. roam_recall : MEMORIES_TAG 태그로 표시된 블록(아래 참조) 또는 같은 이름의 페이지 제목에 있는 블록의 메모리를 회수합니다.
  16. roam_datomic_query : 고급 데이터 검색 및 분석을 위해 Roam 그래프에서 사용자 정의 Datalog 쿼리를 실행합니다.

설정

  1. Roam Research API 토큰을 생성하세요:
    • 그래프 설정으로 이동하세요
    • "API 토큰" 섹션으로 이동합니다(설정 > "그래프" 탭 > "API 토큰" 섹션을 클릭하고 "+ 새 API 토큰" 버튼을 클릭합니다)
    • 새로운 토큰을 생성하세요
  2. 환경 변수 구성: 필요한 환경 변수를 구성하는 데는 두 가지 옵션이 있습니다.옵션 1: .env 파일 사용(개발에 권장) roam-research 디렉터리에 .env 파일을 만듭니다.
    ROAM_API_TOKEN=your-api-token ROAM_GRAPH_NAME=your-graph-name MEMORIES_TAG='#[[LLM/Memories]]'
    옵션 2: MCP 설정 사용(대체 방법) MCP 설정 파일에 구성을 추가합니다.
    • Cline의 경우( ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json ):
    • Claude 데스크톱 앱( ~/Library/Application Support/Claude/claude_desktop_config.json ):
    { "mcpServers": { "roam-research": { "command": "node", "args": ["/path/to/roam-research-mcp/build/index.js"], "env": { "ROAM_API_TOKEN": "your-api-token", "ROAM_GRAPH_NAME": "your-graph-name", "MEMORIES_TAG": "#[[LLM/Memories]]" } } } }

    참고: 서버는 먼저 .env 파일에서 로드를 시도한 다음 MCP 설정의 환경 변수를 사용합니다.

  3. 서버를 빌드합니다(MCP의 루트 디렉토리에 있는지 확인하세요):
    cd roam-research-mcp npm install npm run build

용법

제목으로 페이지 가져오기

해결된 블록 참조로 페이지의 콘텐츠를 가져와서 읽습니다.

use_mcp_tool roam-research roam_fetch_page_by_title { "title": "Example Page" }

다음을 사용하여 페이지 내용을 마크다운으로 반환합니다.

  • 완전한 계층 구조
  • 블록 참조는 재귀적으로 해결됨(최대 4단계 깊이)
  • 중첩 수준에 대한 적절한 들여쓰기
  • 전체 마크다운 서식

페이지 만들기

선택적인 콘텐츠로 새 페이지를 만드세요:

use_mcp_tool roam-research roam_create_page { "title": "New Page", "content": "Initial content for the page" }

성공시 생성된 페이지의 UID를 반환합니다.

블록 생성

페이지에 새 블록을 추가합니다(page_uid나 title이 제공되지 않으면 오늘의 일일 페이지가 기본값으로 설정됨):

use_mcp_tool roam-research roam_create_block { "content": "Block content", "page_uid": "optional-target-page-uid", "title": "optional-target-page-title" }

다음 중 하나를 지정할 수 있습니다.

  • page_uid : 대상 페이지에 대한 직접 참조
  • title : 대상 페이지의 이름 (존재하지 않으면 생성됩니다)
  • 둘 다 아님: 블록이 오늘의 일일 페이지에 추가됩니다.

보고:

{ "success": true, "block_uid": "created-block-uid", "parent_uid": "parent-page-uid" }

개요 만들기

적절한 중첩과 구조를 갖춘 계층적 개요를 만듭니다.

use_mcp_tool roam-research roam_create_outline { "outline": [ { "text": "I. Top Level", "level": 1 }, { "text": "A. Second Level", "level": 2 }, { "text": "1. Third Level", "level": 3 } ], "page_title_uid": "optional-target-page", "block_text_uid": "optional-header-text" }

특징:

  • 최대 10단계의 중첩으로 복잡한 윤곽선을 만듭니다.
  • 개요 구조와 내용 검증
  • 올바른 부모-자녀 관계 유지
  • 개요에 대한 선택적 헤더 블록
  • 페이지가 지정되지 않으면 오늘의 일일 페이지로 기본 설정됩니다.
  • 블록 생성을 위한 효율적인 일괄 작업

매개변수:

  • outline : 개요 항목의 배열, 각 항목에는 다음이 포함됩니다.
    • text : 개요 항목의 내용(필수)
    • level : 중첩 레벨(1-10, 필수)
  • page_title_uid : 대상 페이지 제목 또는 UID(선택 사항, 기본값은 오늘 페이지)
  • block_text_uid : 개요의 헤더 텍스트(선택 사항)

보고:

{ "success": true, "page_uid": "target-page-uid", "parent_uid": "header-block-uid", "created_uids": ["uid1", "uid2", ...] }

할 일 항목 추가

오늘의 일일 페이지에 하나 이상의 할 일 항목을 추가하세요.

use_mcp_tool roam-research roam_add_todo { "todos": [ "First todo item", "Second todo item", "Third todo item" ] }

특징:

  • Roam 체크박스 구문을 사용하여 할 일을 추가합니다( {{TODO}} todo text ).
  • 단일 작업에서 여러 개의 할 일 추가 지원
  • 10개 이상의 할 일을 추가할 때 효율성을 위해 일괄 작업을 사용합니다.
  • 오늘의 페이지가 존재하지 않으면 자동으로 오늘의 페이지를 생성합니다.
  • 순차적으로 최상위 블록으로 할 일을 추가합니다.

중첩된 마크다운 가져오기

특정 블록 아래에 중첩된 마크다운 콘텐츠를 가져옵니다.

use_mcp_tool roam-research roam_import_markdown { "content": "- Item 1\n - Subitem A\n - Subitem B\n- Item 2", "page_uid": "optional-page-uid", "page_title": "optional-page-title", "parent_uid": "optional-parent-block-uid", "parent_string": "optional-exact-block-content", "order": "first" }

특징:

  • 특정 블록 아래의 콘텐츠 가져오기:
    • UID 또는 정확한 문자열 일치로 부모 블록 찾기
    • 제목이나 UID로 특정 페이지 내 블록 찾기
    • 페이지가 지정되지 않으면 오늘 페이지로 기본 설정됩니다.
  • 콘텐츠 배치 제어:
    • 부모 블록의 첫 번째 또는 마지막 자식으로 추가
    • 계층 구조 유지
    • 중첩된 콘텐츠에 대한 효율적인 일괄 작업
  • 포괄적인 반환 값:
    { "success": true, "page_uid": "target-page-uid", "parent_uid": "parent-block-uid", "created_uids": ["uid1", "uid2", ...] }

매개변수:

  • content : 가져올 중첩된 마크다운 콘텐츠
  • page_uid : 부모 블록이 포함된 페이지의 UID
  • page_title : 부모 블록이 포함된 페이지의 제목(page_uid가 제공된 경우 무시됨)
  • parent_uid : 콘텐츠를 추가할 부모 블록의 UID
  • parent_string : 부모 블록의 정확한 문자열 내용(page_uid 또는 page_title을 제공해야 함)
  • order : 콘텐츠를 추가할 위치("first" 또는 "last", 기본값은 "first")

블록 참조 검색

페이지 내 또는 전체 그래프에서 블록 참조를 검색합니다.

use_mcp_tool roam-research roam_search_block_refs { "block_uid": "optional-block-uid", "page_title_uid": "optional-page-title-or-uid" }

특징:

  • 특정 블록에 대한 모든 참조 찾기
  • 페이지 내에서 블록 참조를 검색합니다.
  • 그래프 전체에서 검색
  • 직접 및 간접 참조를 모두 지원합니다.
  • 블록 콘텐츠와 위치 컨텍스트가 포함됩니다.

매개변수:

  • block_uid : 참조를 찾을 블록의 UID(선택 사항)
  • page_title_uid : 검색할 페이지의 제목 또는 UID(선택 사항)

보고:

{ "success": true, "matches": [ { "block_uid": "referenced-block-uid", "content": "Block content with ((reference))", "page_title": "Page containing reference" } ], "message": "Found N block(s) referencing..." }

텍스트로 검색

모든 페이지 또는 특정 페이지 내에서 특정 텍스트가 포함된 블록을 검색합니다.

use_mcp_tool roam-research roam_search_by_text { "text": "search text", "page_title_uid": "optional-page-title-or-uid", "case_sensitive": true }

특징:

  • 그래프의 모든 블록에서 모든 텍스트를 검색합니다.
  • 선택적인 페이지 범위 검색
  • 대소문자 구분 또는 대소문자 구분 안 함 검색
  • 페이지 컨텍스트를 사용하여 블록 콘텐츠를 반환합니다.
  • Datalog 쿼리를 사용한 효율적인 텍스트 매칭

매개변수:

  • text : 검색할 텍스트(필수)
  • page_title_uid : 검색할 페이지의 제목 또는 UID(선택 사항)
  • case_sensitive : 대소문자 구분 검색을 수행할지 여부(선택 사항, 기본값: Roam의 기본 동작과 일치하려면 true)

보고:

{ "success": true, "matches": [ { "block_uid": "matching-block-uid", "content": "Block content containing search text", "page_title": "Page containing block" } ], "message": "Found N block(s) containing \"search text\"" }

블록 콘텐츠 업데이트

직접 텍스트 교체나 패턴 기반 변환을 사용하여 블록의 콘텐츠를 업데이트합니다.

use_mcp_tool roam-research roam_update_block { "block_uid": "target-block-uid", "content": "New block content" }

또는 패턴 기반 변환을 사용합니다.

use_mcp_tool roam-research roam_update_block { "block_uid": "target-block-uid", "transform_pattern": { "find": "\\bPython\\b", "replace": "[[Python]]", "global": true } }

특징:

  • 두 가지 업데이트 모드:
    • 직접 콘텐츠 교체
    • 정규식을 사용한 패턴 기반 변환
  • 업데이트하기 전에 블록 존재 여부를 확인하세요
  • 업데이트된 콘텐츠를 응답으로 반환합니다.
  • 글로벌 또는 단일 매치 교체 지원
  • 블록 관계 및 메타데이터 보존

매개변수:

  • block_uid : 업데이트할 블록의 UID(필수)
  • content : 블록에 대한 새 콘텐츠(직접 교체를 사용하는 경우)
  • transform_pattern : 기존 콘텐츠를 변환하기 위한 패턴:
    • find : 찾을 텍스트 또는 정규식 패턴
    • replace : 바꿀 텍스트
    • global : 모든 항목을 바꿀지 여부(기본값: true)

보고:

{ "success": true, "content": "Updated block content" }

태그 검색

근처 태그로 선택적으로 필터링하여 특정 태그가 포함된 블록을 검색하세요.

use_mcp_tool roam-research roam_search_for_tag { "primary_tag": "Project/Tasks", "page_title_uid": "optional-page-title-or-uid", "near_tag": "optional-secondary-tag", "case_sensitive": true }

특징:

  • 특정 태그가 포함된 블록 검색
  • 다른 태그의 존재 여부에 따른 선택적 필터링
  • 페이지 범위 또는 그래프 전체 검색
  • 대소문자 구분 또는 대소문자 구분 안 함 검색
  • 페이지 컨텍스트를 사용하여 블록 콘텐츠를 반환합니다.
  • Datalog 쿼리를 사용한 효율적인 태그 매칭

매개변수:

  • primary_tag : 검색할 주요 태그(필수)
  • page_title_uid : 검색할 페이지의 제목 또는 UID(선택 사항)
  • near_tag : 결과를 필터링할 또 다른 태그(선택 사항)
  • case_sensitive : 대소문자 구분 검색을 수행할지 여부(선택 사항, 기본값: Roam의 기본 동작과 일치하려면 true)

보고:

{ "success": true, "matches": [ { "block_uid": "matching-block-uid", "content": "Block content containing #[[primary_tag]]", "page_title": "Page containing block" } ], "message": "Found N block(s) referencing \"primary_tag\"" }

정보 기억하기

자동 태그 지정 및 분류를 통해 추억이나 중요한 정보를 저장하세요.

use_mcp_tool roam-research roam_remember { "memory": "Important information to remember", "categories": ["Work", "Project/Alpha"] }

특징:

  • #[[LLM/Memories]] 태그로 정보를 저장합니다.
  • 조직을 위한 선택적 카테고리 태그 추가
  • 오늘의 일일 페이지에 자동으로 추가됩니다
  • 메모리당 여러 카테고리 지원
  • roam_search_for_tag를 사용하여 쉽게 검색
  • 기억의 연대순을 유지합니다

매개변수:

  • memory : 기억할 정보 (필수)
  • categories : 메모리에 태그를 지정할 카테고리의 선택적 배열

보고:

{ "success": true, "block_uid": "created-block-uid", "content": "Memory content with tags" }

날짜로 검색

생성 또는 수정 날짜를 기준으로 블록 및 페이지 검색:

use_mcp_tool roam-research roam_search_by_date { "start_date": "2025-01-01", "end_date": "2025-01-31", "type": "modified", "scope": "blocks", "include_content": true }

특징:

  • 생성 날짜, 수정 날짜 또는 둘 다로 검색
  • 블록, 페이지 또는 둘 다 필터링
  • 시작 및 종료 날짜가 포함된 선택적 날짜 범위
  • 결과에 블록/페이지 콘텐츠 포함 또는 제외
  • 타임스탬프별로 결과 정렬
  • Datalog 쿼리를 사용한 효율적인 날짜 기반 필터링

매개변수:

  • start_date : ISO 형식(YYYY-MM-DD)의 시작 날짜(필수)
  • end_date : ISO 형식(YYYY-MM-DD)의 종료 날짜(선택 사항)
  • type : '생성됨', '수정됨', '둘 다'로 검색할지 여부 (필수)
  • scope : '블록', '페이지' 또는 '둘 다'를 검색할지 여부(필수)
  • include_content : 일치하는 블록/페이지의 콘텐츠를 포함할지 여부(선택 사항, 기본값: true)

보고:

{ "success": true, "matches": [ { "uid": "block-or-page-uid", "type": "block", "time": 1704067200000, "content": "Block or page content", "page_title": "Page title (for blocks)" } ], "message": "Found N matches for the given date range and criteria" }

오늘 수정된 페이지 찾기

오늘 자정 이후 수정된 모든 페이지를 찾으세요:

use_mcp_tool roam-research roam_find_pages_modified_today {}

특징:

  • 자정 이후 페이지에 적용된 모든 수정 사항을 추적합니다.
  • 블록 계층의 모든 레벨에서 변경 사항을 감지합니다.
  • 수정된 페이지 제목의 고유한 목록을 반환합니다.
  • 수정된 페이지 수 포함
  • 매개변수가 필요하지 않습니다

보고:

{ "success": true, "pages": ["Page 1", "Page 2"], "message": "Found 2 page(s) modified today" }

데이터 쿼리 실행

고급 데이터 검색 및 분석을 위해 Roam 그래프에서 사용자 정의 Datalog 쿼리를 실행하세요.

use_mcp_tool roam-research roam_datomic_query { "query": "[:find (count ?p)\n :where [?p :node/title]]", "inputs": [] }

특징:

  • Roam의 쿼리 엔진에 직접 액세스
  • 모든 Datalog 쿼리 기능 지원:
    • 복잡한 패턴 매칭
    • 집계 함수(count, sum, max, min, avg, distinct)
    • 문자열 연산(includes?, starts-with?, ends-with?)
    • 논리 연산(<, >, <=, >=, =, not=)
    • 재귀 쿼리에 대한 규칙
  • 대소문자 구분 및 대소문자 구분 안 함 검색 기능
  • 그래프 전체에 걸친 효율적인 쿼리

매개변수:

  • query : 실행할 Datalog 쿼리(필수)
  • inputs : 쿼리에 대한 입력 매개변수의 선택적 배열

보고:

{ "success": true, "matches": [ { "content": "[result data]", "block_uid": "", "page_title": "" } ], "message": "Query executed successfully. Found N results." }

예시 쿼리:

  1. 모든 페이지 수 세기:
[:find (count ?p) :where [?p :node/title]]
  1. 대소문자를 구분하지 않는 텍스트 검색:
[:find ?string ?title :where [?b :block/string ?string] [(clojure.string/lower-case ?string) ?lower] [(clojure.string/includes? ?lower "search term")] [?b :block/page ?p] [?p :node/title ?title]]
  1. 날짜 이후에 수정된 블록 찾기:
[:find ?block_ref ?string :in $ ?start_of_day :where [?b :edit/time ?time] [(> ?time ?start_of_day)] [?b :block/uid ?block_ref] [?b :block/string ?string]]

더 많은 쿼리 예제와 구문 설명서는 Roam_Research_Datalog_Cheatsheet.md를 참조하세요.

검색 블록 계층 구조

블록 부모-자식 관계를 탐색하고 검색합니다.

use_mcp_tool roam-research roam_search_hierarchy { "parent_uid": "optional-parent-block-uid", "child_uid": "optional-child-block-uid", "page_title_uid": "optional-page-title-or-uid", "max_depth": 3 }

특징:

  • 블록 계층을 위아래로 검색
  • 특정 블록의 자식 찾기
  • 특정 블록의 부모 찾기
  • 검색 깊이 구성(1~10단계)
  • 선택적 페이지 범위 필터링
  • 각 결과에 대한 심층 정보가 포함되어 있습니다.

매개변수:

  • parent_uid : 자식을 찾을 블록의 UID(아래로 검색하는 경우 필수)
  • child_uid : 부모를 찾을 블록의 UID(위로 검색하는 경우 필수)
  • page_title_uid : 검색할 페이지의 제목 또는 UID(선택 사항)
  • max_depth : 검색할 깊이 수준(선택 사항, 기본값: 1, 최대: 10)

보고:

{ "success": true, "matches": [ { "block_uid": "related-block-uid", "content": "Block content", "depth": 2, "page_title": "Page containing block" } ], "message": "Found N block(s) as children/parents..." }

오류 처리

서버는 일반적인 시나리오에 대한 포괄적인 오류 처리를 제공합니다.

  • 구성 오류:
    • API 토큰 또는 그래프 이름이 없습니다.
    • 잘못된 환경 변수
  • API 오류:
    • 인증 실패
    • 잘못된 요청
    • 실패한 작업
  • 도구별 오류:
    • 페이지를 찾을 수 없습니다(대소문자 구분 없이 검색)
    • 문자열 일치로 블록을 찾을 수 없습니다.
    • 잘못된 마크다운 형식
    • 필수 매개변수가 없습니다
    • 잘못된 개요 구조 또는 내용

각 오류 응답에는 다음이 포함됩니다.

  • 표준 MCP 오류 코드
  • 자세한 오류 메시지
  • 해당되는 경우 해결을 위한 제안

개발

건물

서버를 빌드하려면:

npm install npm run build

이렇게 하면:

  1. 필요한 모든 종속성을 설치하세요
  2. TypeScript를 JavaScript로 컴파일
  3. 출력 파일을 실행 가능하게 만들기

개발 중에 npm run watch 사용하면 파일이 변경되면 자동으로 다시 컴파일할 수도 있습니다.

MCP Inspector로 테스트

MCP Inspector는 MCP 서버를 테스트하고 디버깅하는 데 도움이 되는 도구입니다. 서버를 테스트하려면 다음을 수행하세요.

# Inspect with npx: npx @modelcontextprotocol/inspector node build/index.js

이렇게 하면:

  1. 서버를 검사기 모드로 시작합니다.
  2. 다음에 대한 대화형 인터페이스를 제공합니다.
    • 사용 가능한 도구 및 리소스 나열
    • 사용자 정의 매개변수로 도구 실행
    • 도구 응답 및 오류 처리 보기

특허

MIT 라이센스

ID: fzfznyaflu