Skip to content

feat: Markdownファイルから記事を作成する機能 (note_create_from_file) #73

Description

@drillan

概要

既存の.mdファイルを読み込み、note.comの下書き記事を作成する新しいMCPツール note_create_from_file を実装する。

モチベーション

現在、note_create_draftツールはタイトルと本文を直接引数として受け取る必要がある。ローカルで執筆した.mdファイルから直接記事を作成できれば、ワークフローが大幅に改善される。

機能要件

基本機能

  • Markdownファイルのパスを受け取り、下書き記事を作成
  • YAMLフロントマターからタイトル・タグを抽出
  • フロントマターがない場合、最初のH1/H2をタイトルとして使用(H1は本文から削除)

YAMLフロントマター形式

```markdown

title: 記事タイトル
tags:

  • タグ1
  • タグ2

本文...
```

画像処理

  • ローカル画像パス(./images/test.pngなど)を検出
  • 画像をnote.comにアップロード
  • 本文内のパスをアップロード後のURLに置換

既存機能との統合

  • TOC([TOC])対応(既存のブラウザ自動化を使用)
  • 埋め込みURL対応(YouTube、Twitter、note.com)
  • プレビュー表示

技術設計

新規ファイル

ファイル 目的
src/note_mcp/utils/file_parser.py Markdownファイル解析
tests/unit/test_file_parser.py ユニットテスト
tests/e2e/test_create_from_file.py E2Eテスト

変更ファイル

ファイル 変更内容
src/note_mcp/server.py MCPツール追加
pyproject.toml pyyaml依存関係追加

データモデル

```python
@DataClass
class LocalImage:
markdown_path: str # Markdown内のパス
absolute_path: Path # 絶対パス
alt_text: str = ""

@DataClass
class ParsedArticle:
title: str
body: str
tags: list[str] = field(default_factory=list)
local_images: list[LocalImage] = field(default_factory=list)
source_path: Path | None = None
```

MCPツールインターフェース

```python
@mcp.tool()
async def note_create_from_file(
file_path: Annotated[str, "Markdownファイルのパス"],
upload_images: Annotated[bool, "ローカル画像をアップロードするかどうか"] = True,
) -> str:
```

エッジケース

  • H1もH2もない → エラーメッセージ
  • 画像ファイル不存在 → 警告ログ、処理続行
  • 10MB超の画像 → 既存バリデーションでエラー

テスト計画

ユニットテスト

  • フロントマター付きファイル解析
  • H1からタイトル抽出(削除確認)
  • ローカル画像検出
  • エラーケース

E2Eテスト

  • フロントマター付き記事作成
  • H1のみの記事作成
  • TOC付き記事作成
  • 画像アップロード

依存関係

  • pyyaml>=6.0.0

関連

  • 既存ツール: note_create_draft, note_upload_body_image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions