mcp_python

huntkil/mcp_python

3.2

If you are the rightful owner of mcp_python and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.

The Markdown MCP Server is designed to efficiently manage Markdown documents within the Cursor AI IDE, providing CRUD operations and advanced features.

Markdown MCP Server

Cursor AI IDE์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Markdown ๋ฌธ์„œ ๊ด€๋ฆฌ MCP (Model Context Protocol) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

๊ฐœ์š”

์ด ํ”„๋กœ์ ํŠธ๋Š” Cursor AI IDE์—์„œ Markdown ๋ฌธ์„œ์˜ CRUD ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” MCP ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ ์ƒ์„ฑ, ์ฝ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฒ€์ƒ‰, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋“ฑ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

๊ธฐ๋ณธ CRUD ์ž‘์—…

  • ๋ฌธ์„œ ์ƒ์„ฑ: ์ƒˆ๋กœ์šด Markdown ํŒŒ์ผ ์ƒ์„ฑ
  • ๋ฌธ์„œ ์ฝ๊ธฐ: ๊ธฐ์กด Markdown ํŒŒ์ผ ๋‚ด์šฉ ์ฝ๊ธฐ
  • ๋ฌธ์„œ ์ˆ˜์ •: ๊ธฐ์กด ํŒŒ์ผ ๋‚ด์šฉ ์ˆ˜์ • ๋˜๋Š” ์ถ”๊ฐ€
  • ๋ฌธ์„œ ์‚ญ์ œ: Markdown ํŒŒ์ผ ์‚ญ์ œ

๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

  • ๋ฌธ์„œ ๋ชฉ๋ก ์กฐํšŒ: ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด Markdown ํŒŒ์ผ ๋ชฉ๋ก ์กฐํšŒ
  • ๋‚ด์šฉ ๊ฒ€์ƒ‰: ํŒŒ์ผ ๋‚ด์šฉ์—์„œ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ: YAML frontmatter ๊ด€๋ฆฌ (์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ)

๊ธฐ์ˆ  ์Šคํƒ

  • ์–ธ์–ด: Python 3.9+
  • ํ”„๋ ˆ์ž„์›Œํฌ: MCP Python SDK
  • ๋ฌธ์„œ ํ˜•์‹: Markdown (.md, .markdown)
  • ์˜์กด์„ฑ: mcp, pyyaml, pathlib2, typing-extensions

์„ค์น˜

1. ์ €์žฅ์†Œ ํด๋ก 

git clone <repository-url>
cd markdown-mcp-server

2. ์˜์กด์„ฑ ์„ค์น˜

pip install -r requirements.txt

3. ๊ฐœ๋ฐœ ๋ชจ๋“œ ์„ค์น˜ (์„ ํƒ์‚ฌํ•ญ)

pip install -e .

์‚ฌ์šฉ๋ฒ•

Cursor AI IDE ์„ค์ •

Cursor AI IDE์˜ ์„ค์ • ํŒŒ์ผ์— MCP ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

{
  "mcp": {
    "servers": {
      "markdown-manager": {
        "command": "python",
        "args": ["-m", "src.server"],
        "cwd": "/path/to/markdown-mcp-server"
      }
    }
  }
}

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

  • MARKDOWN_MCP_BASE_PATH: ํŒŒ์ผ ์ž‘์—…์˜ ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ (๊ธฐ๋ณธ๊ฐ’: ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ)

API ์ฐธ์กฐ

1. read_markdown

Markdown ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • file_path (string): ์ฝ์„ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
  • encoding (optional, string): ํŒŒ์ผ ์ธ์ฝ”๋”ฉ (๊ธฐ๋ณธ๊ฐ’: "utf-8")

๋ฐ˜ํ™˜๊ฐ’:

{
  "success": true,
  "content": "ํŒŒ์ผ ๋‚ด์šฉ",
  "content_without_frontmatter": "frontmatter ์ œ์™ธํ•œ ๋‚ด์šฉ",
  "frontmatter": {"title": "์ œ๋ชฉ", "author": "์ž‘์„ฑ์ž"},
  "file_info": {"name": "ํŒŒ์ผ๋ช…", "size": 1024, ...},
  "encoding": "utf-8"
}

2. create_markdown

์ƒˆ๋กœ์šด Markdown ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • file_path (string): ์ƒ์„ฑํ•  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
  • content (string): ํŒŒ์ผ ๋‚ด์šฉ
  • overwrite (optional, boolean): ๊ธฐ์กด ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false)

๋ฐ˜ํ™˜๊ฐ’:

{
  "success": true,
  "message": "File created successfully: file.md",
  "file_path": "/full/path/to/file.md",
  "file_info": {"name": "file.md", "size": 1024, ...}
}

3. update_markdown

๊ธฐ์กด Markdown ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • file_path (string): ์ˆ˜์ •ํ•  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
  • content (string): ์ƒˆ๋กœ์šด ๋‚ด์šฉ
  • append (optional, boolean): ๋‚ด์šฉ ์ถ”๊ฐ€ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false)

๋ฐ˜ํ™˜๊ฐ’:

{
  "success": true,
  "message": "File updated successfully: file.md",
  "file_path": "/full/path/to/file.md",
  "file_info": {"name": "file.md", "size": 1024, ...}
}

4. delete_markdown

์ง€์ •๋œ Markdown ํŒŒ์ผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • file_path (string): ์‚ญ์ œํ•  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
  • confirm (optional, boolean): ์‚ญ์ œ ํ™•์ธ (๊ธฐ๋ณธ๊ฐ’: false)

๋ฐ˜ํ™˜๊ฐ’:

{
  "success": true,
  "message": "File deleted successfully: file.md"
}

5. list_markdown_files

์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ์˜ Markdown ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • directory (optional, string): ๊ฒ€์ƒ‰ํ•  ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ (๊ธฐ๋ณธ๊ฐ’: ".")
  • recursive (optional, boolean): ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ ํฌํ•จ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false)
  • pattern (optional, string): ํŒŒ์ผ ํŒจํ„ด (๊ธฐ๋ณธ๊ฐ’: "*.md")

๋ฐ˜ํ™˜๊ฐ’:

{
  "success": true,
  "files": [
    {
      "name": "file1.md",
      "size": 1024,
      "modified": 1234567890,
      "relative_path": "file1.md"
    }
  ],
  "count": 1,
  "directory": "."
}

6. search_markdown

Markdown ํŒŒ์ผ ๋‚ด์šฉ์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • directory (string): ๊ฒ€์ƒ‰ํ•  ๋””๋ ‰ํ† ๋ฆฌ
  • query (string): ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ
  • case_sensitive (optional, boolean): ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false)

๋ฐ˜ํ™˜๊ฐ’:

{
  "success": true,
  "results": [
    {
      "file_path": "file1.md",
      "matches": [
        {"line_number": 5, "line_content": "This line contains the keyword"}
      ],
      "match_count": 1
    }
  ],
  "total_files_searched": 10,
  "files_with_matches": 1,
  "query": "keyword",
  "case_sensitive": false
}

7. manage_frontmatter

Markdown ํŒŒ์ผ์˜ YAML frontmatter๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • file_path (string): ๋Œ€์ƒ ํŒŒ์ผ ๊ฒฝ๋กœ
  • action (string): ์ž‘์—… ์œ ํ˜• ("get", "set", "update", "remove")
  • metadata (optional, object): ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด (set/update ์ž‘์—… ์‹œ ํ•„์š”)

๋ฐ˜ํ™˜๊ฐ’ (get ์ž‘์—…):

{
  "success": true,
  "frontmatter": {"title": "์ œ๋ชฉ", "author": "์ž‘์„ฑ์ž"},
  "has_frontmatter": true
}

๋ฐ˜ํ™˜๊ฐ’ (๊ธฐํƒ€ ์ž‘์—…):

{
  "success": true,
  "message": "Frontmatter set completed successfully",
  "file_path": "/full/path/to/file.md",
  "action": "set"
}

์‚ฌ์šฉ ์˜ˆ์‹œ

Cursor AI IDE์—์„œ ์‚ฌ์šฉ

  1. ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ ์ƒ์„ฑ

    "์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”. ํŒŒ์ผ๋ช…: project-overview.md"
    
  2. ํ‚ค์›Œ๋“œ๋กœ ๋ฌธ์„œ ๊ฒ€์ƒ‰

    "'API ๋ฌธ์„œ' ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์„ ์ฐพ์•„์ฃผ์„ธ์š”"
    
  3. ๊ธฐ์กด ๋ฌธ์„œ์— ๋‚ด์šฉ ์ถ”๊ฐ€

    "README.md ํŒŒ์ผ์— ์„ค์น˜ ๊ฐ€์ด๋“œ ์„น์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”"
    
  4. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

    "project.md ํŒŒ์ผ์˜ frontmatter์— ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”"
    

๊ฐœ๋ฐœ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

markdown-mcp-server/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ server.py              # MCP ์„œ๋ฒ„ ๋ฉ”์ธ ๋กœ์ง
โ”‚   โ”œโ”€โ”€ markdown_manager.py    # Markdown ๋ฌธ์„œ ๊ด€๋ฆฌ ํด๋ž˜์Šค
โ”‚   โ””โ”€โ”€ utils.py              # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
โ”œโ”€โ”€ tests/
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ test_server.py
โ”‚   โ””โ”€โ”€ test_markdown_manager.py
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ setup.py
โ””โ”€โ”€ README.md

ํ…Œ์ŠคํŠธ ์‹คํ–‰

# ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‹คํ–‰
python -m unittest tests.test_markdown_manager

# ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹คํ–‰
python -m unittest tests.test_server

# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
python -m unittest discover tests

์„œ๋ฒ„ ์‹คํ–‰

# ์ง์ ‘ ์‹คํ–‰
python -m src.server

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‹คํ–‰
MARKDOWN_MCP_BASE_PATH=/path/to/docs python -m src.server

๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๊ฒฝ๋กœ ๊ฒ€์ฆ: ๋ชจ๋“  ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” path traversal ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์ฆ๋ฉ๋‹ˆ๋‹ค.
  • ๊ถŒํ•œ ํ™•์ธ: ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ๊ฒ€์ฆ: ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์€ ๊ฒ€์ฆ๋ฉ๋‹ˆ๋‹ค.
  • ์•ˆ์ „ํ•œ ํŒŒ์ผ ์ฒ˜๋ฆฌ: ํŒŒ์ผ ํฌ๊ธฐ ์ œํ•œ ๋ฐ ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์—๋Ÿฌ ์ฒ˜๋ฆฌ

๋ชจ๋“  API ํ˜ธ์ถœ์€ ์ผ๊ด€๋œ ์—๋Ÿฌ ์‘๋‹ต ํ˜•์‹์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

{
  "error": "์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์„ค๋ช…"
}

์ผ๋ฐ˜์ ์ธ ์—๋Ÿฌ ์ƒํ™ฉ:

  • ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ
  • ์ž˜๋ชป๋œ ํŒŒ์ผ ๊ฒฝ๋กœ
  • ์ธ์ฝ”๋”ฉ ์˜ค๋ฅ˜
  • ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

๋กœ๊น…

์„œ๋ฒ„๋Š” ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • INFO: ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ๋กœ๊ทธ
  • WARNING: ๊ฒฝ๊ณ  ์ƒํ™ฉ
  • ERROR: ์˜ค๋ฅ˜ ์ƒํ™ฉ

๋กœ๊ทธ ๋ ˆ๋ฒจ์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ LOG_LEVEL๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์—ฌํ•˜๊ธฐ

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ง€์›

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์งˆ๋ฌธ์ด ์žˆ์œผ์‹œ๋ฉด GitHub Issues๋ฅผ ํ†ตํ•ด ๋ฌธ์˜ํ•ด ์ฃผ์„ธ์š”.

๋ณ€๊ฒฝ ์ด๋ ฅ

v0.1.0

  • ์ดˆ๊ธฐ ๋ฒ„์ „ ๋ฆด๋ฆฌ์Šค
  • ๊ธฐ๋ณธ CRUD ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๊ฒ€์ƒ‰ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • MCP ์„œ๋ฒ„ ํ†ตํ•ฉ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ