AIアシスタント×Qiita：Qiita MCP Serverで広がる新しい執筆体験

## はじめに

AIアシスタントの能力を拡張するための仕組みとして注目されている「Model Context Protocol (MCP)」は、AIアシスタントに外部サービスとの連携機能を提供できるようにするプロトコルです。

QiitaのAPIと連携するMCP Server「[Qiita MCP Server](https://github.com/2bo/qiita-mcp-server)」を開発しました。このサーバーを利用することで、AIアシスタントからQiita記事の取得・投稿・更新などの操作が可能になります。

:::note warn
注意：これはQiita公式が提供しているMCP Serverではありません。
:::

> MCPの詳細については、[Model Context Protocolの公式ドキュメント](https://github.com/modelcontextprotocol)を参照してください。

## Qiita MCP Serverでできること

Qiita MCP Serverは、以下の機能をAIアシスタントに提供します：

| ツール名 | 説明 |
|----------|------|
| `get_my_qiita_articles` | 認証ユーザーのQiita記事一覧を取得 |
| `get_qiita_item` | 特定のQiita記事をIDで取得 |
| `post_qiita_article` | 新しいQiita記事を投稿 |
| `update_qiita_article` | 既存のQiita記事を更新 |
| `get_qiita_markdown_rules` | Qiitaのマークダウン記法ルールを取得 |

これらの機能を活用することで、AIアシスタントとの会話の中でQiita記事の作成・編集をシームレスに行うことができます。例えば：

- 「この会話の内容をQiitaに投稿して」と指示するだけで記事を作成
- 「私の最新の記事を取得して」と言うだけで記事一覧を表示
- 「この記事を更新して」と言って既存記事の内容を変更

## 実例とそのキャプチャ

### 記事の取得

AIアシスタントに「私がqiitaに投稿した記事を取得して、最新の3件の内容をサマリして」と指示すると、以下のような処理が行われます：

![get_my_qiita_articles_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/3a2dda0f-c560-4b1e-850a-ae6e657cf574.png)

1. まず、`get_my_qiita_articles`ツールが呼び出され、認証済みユーザーの記事一覧が取得されます。このツールはページネーションに対応しており、必要に応じて複数ページの記事を取得できます。

   ![get_my_qiita_articles_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/c6c74abc-9085-4681-aa34-12cd0e630ff8.png)

2. 記事一覧から最新の3件の記事IDを特定し、`get_qiita_item`ツールを使って各記事の詳細情報を1件ずつ取得します。このツールは記事のタイトル、本文、タグ、作成日時など、記事に関する全ての情報を返します。

   ![get_my_qiita_articles_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/f8fe9415-ebdd-4d10-b50c-7b5aa20aec4f.png)

3. 全ての記事情報が取得できたら、AIアシスタントは各記事の内容を分析し、重要なポイントを抽出してサマリーを作成します。このサマリーは記事のタイトル、作成日、主要な内容を簡潔にまとめたものになります。

   ![get_my_qiita_articles_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/0ee31810-c83f-4658-8ee7-8e12d0776268.png)
この一連のプロセスにより、ユーザーは会話の中で簡単に自分の記事を振り返ることができます。また、長文の記事も要約されるため、内容の把握が容易になります。特に多くの記事を投稿しているユーザーにとって、過去の記事を素早く確認するのに役立ちます。

記事の取得と要約は完全に自動化されており、ユーザーは単純な指示だけで複雑な操作を実行できます。これはMCPの強みを活かした機能の一例です。

### 記事の投稿

AIアシスタントに「qiita-mcp-server-article.md をqiitaに投稿して」と指示すると、以下のような処理が行われます：

1. まず、`post_qiita_article`ツールが呼び出され、マークダウンファイルの内容がQiitaに投稿されます。このツールは記事のタイトル、本文、タグなどの情報を指定して記事を作成します。

   ![post_qiita_article_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/4938aeaa-aa9d-4e1d-a786-48c095f59546.png)

この機能により、AIアシスタントとの会話から直接Qiitaへの記事投稿が可能になります。記事はデフォルトで非公開（private）として投稿されるため、内容を確認した後で公開設定に変更できます。

### 記事の更新

AIアシスタントに「## はじめに より 上の部分不要だから削除して、qiitaの記事を更新して」と指示すると、以下のような処理が行われます：

   ![update_qiita_article_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/8c461271-1ffe-4247-821b-da6bf66fa29f.png)

1. まず、AIアシスタントはローカルのマークダウンファイルから指定された部分を削除します。
2. 次に、`update_qiita_article`ツールが呼び出され、Qiita上の記事が更新されます。このツールは記事ID、タイトル、更新後の本文内容、タグ情報などを指定して記事を更新します。

   ![update_qiita_article_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/b75a291c-522e-4b53-bf37-e225b88f9c08.png)

この機能を使うことで、記事の構成や内容を柔軟に変更できます。例えば、不要な部分の削除、新しい情報の追加、誤字脱字の修正などを簡単に行うことができます。また、更新履歴はQiita上で管理されるため、変更内容を後から確認することも可能です。

### Markdownルールの取得

以下は実際にAIアシスタントとのやり取りでマークダウンルールを取得し、記事をフォーマットした例です：

1. まず「Qiitaのマークダウンルールを確認して、記事のマークダウンをフォーマットして」と指示します。
2. AIアシスタントは`get_qiita_markdown_rules`ツールを使用してQiitaのマークダウンルールを取得します。

   ![get_qiita_markdown_rules_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/4bf02dc6-ee8a-4c39-8151-0f52640ee0d7.png)

3. 取得したルールに基づいて、AIアシスタントは記事のマークダウンを適切にフォーマットします。
   - 見出しの後にスペースを追加
   - コードブロックに言語指定を追加
   - 引用やリストの書式を調整
   - 注意書きや補足説明に適切な記法を使用

   ![get_qiita_markdown_rules_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33324/4d4df1ac-28ee-4b32-abd2-8e7dd3fe546f.png)

## 実装上の工夫

### ToolベースのAPI実装

開発中に気づいたのですが、現在のVSCodeのMCP実装はResourceに完全対応していません。そのため、Qiita MCP Serverのすべての機能をToolとして実装することにしました。これにより、AIアシスタントからQiita APIの機能を簡単に利用できるようになっています。

### 非公開投稿のデフォルト化

QiitaのAPIは下書き保存に対応していないという制限があります。この問題を解決するため、Qiita MCP Serverで新規投稿時のデフォルト設定を「非公開」としました。これにより、記事の内容を確認してから公開設定に変更するという運用が可能になっています。

```typescript
// 新規投稿時のデフォルト設定（非公開）
const postArticleSchema = z.object({
  // ...
  private: z.boolean().optional().default(true).describe("Whether the article is private"),
  // ...
});
```

### LLM入力トークン数の最適化

`get_my_qiita_articles`ツールの実装では、記事一覧を取得する際に記事本文（`body`や`rendered_body`）などの大きなデータを含めると、LLMへの入力token数が増大し、特に多数の記事を扱う場合にトークン制限に近づくリスクがあります。このリスクを極力軽減するため、APIレスポンスから記事本文や必須でないユーザー情報フィールドを削除して返すようにしています。

### 記事削除機能の意図的な非実装

Qiita APIは記事削除機能を提供していますが、Qiita MCP Serverではあえてこの機能を実装しませんでした。これはLLMが意図せぬ操作により、誤って重要な記事が削除されるリスクを避けるためです。記事の削除は取り返しのつかない操作であり、特にAIアシスタントを介した操作では、ユーザーの意図が正確に伝わらない場合や、LLMの誤解釈によって意図しない削除が発生する可能性があります。このようなリスクを最小限に抑えるため、記事の削除操作はQiitaの公式サイトから直接行うことを推奨しています。

```typescript
// 記事リストから不要なフィールドを削除
private filterItems = (items: any[]): any[] => {
  return items.map(item => {
    const { rendered_body, body, ...rest } = item;
    
    if (rest.user) {
      const {
        facebook_id,
        followees_count,
        followers_count,
        github_login_name,
        profile_image_url,
        team_only,
        twitter_screen_name,
        website_url,
        ...userRest
      } = rest.user;
      rest.user = userRest;
    }
    
    return rest;
  });
};
```

この最適化により、必要な情報だけをLLMに渡すことができ、トークン使用量を効率化しています。これは特に多数の記事を一度に扱う場合や、複数の操作を連続して行う場合に、トークン制限に余裕を持たせる効果があります。また、応答速度の向上にも寄与しています。

## セットアップ方法

### 事前準備

1. QiitaのAPIトークンを取得します
   - [Qiita設定ページ](https://qiita.com/settings/tokens/new)にアクセス
   - 適切な説明を入力し、権限は「read_qiita」と「write_qiita」のスコープを設定してトークンを発行
   - 発行されたトークンをコピー（このトークンは一度しか表示されないので注意）

### Clineでの設定

ClineでQiita MCP Serverを利用するには、MCP設定ファイルに以下の設定を追加します：

1. `cline_mcp_settings.json`を開く
2. `mcpServers`セクションに以下を追加：

```json
"qiita-mcp-server": {
  "command": "npx",
  "args": [
    "-y",
    "@2bo/qiita-mcp-server"
  ],
  "env": {
    "QIITA_API_TOKEN": "あなたのQiitaAPIトークン"
  },
  "transportType": "stdio"
}
```

### VSCodeでの設定

VSCode + GitHub Copilot Agent でQiita MCP Serverを利用するには：

1. プロジェクトの`.vscode`ディレクトリに`mcp.json`ファイルを作成
2. 以下の内容を記述：

```json
{
  "inputs": [
    {
      "type": "promptString",
      "id": "qiita-api-token",
      "description": "Qiita API Token",
      "password": true
    }
  ],
  "servers": {
    "qiita-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["@2bo/qiita-mcp-server"],
      "env": {
        "QIITA_API_TOKEN": "${input:qiita-api-token}"
      }
    }
  }
}
```

この設定により、VSCodeのMCP対応AIアシスタント拡張機能でQiita MCP Serverを利用できるようになります。

## 所感

### シームレスな執筆体験

このツールを使ってみて感じたのは、ClineなどのAIアシスタントと会話しながら記事の内容を相談し、そのままシームレスにQiitaへ投稿できる体験の効率性です。特に技術記事の執筆では、AIアシスタントに技術的な内容を確認しながら記事を作成できるため、執筆プロセスが大幅に改善されました。実際、この記事自体もClineとQiita MCP Serverを使って執筆しています。

### 公式サポートへの期待

この実装はサードパーティのものですが、個人的には将来的にQiita公式からMCP Serverが提供されると嬉しいなと思っています。公式サポートにより、より安定した機能と拡張性が提供されるだけでなく、セキュリティの観点からも安心して利用できるようになるでしょう。

### 現状の制限

開発を進める中で、いくつかの制限に直面しました：

- **画像のアップロードができない**: QiitaのAPI制限により、画像の直接アップロードには対応していません。画像は別途アップロードする必要があります。
- **下書きで投稿できない**: QiitaのAPIが下書き機能に対応していないため、非公開投稿をデフォルトとする回避策を採用しました。

---

## 参考リンク


https://github.com/2bo/qiita-mcp-server


https://github.com/modelcontextprotocol


https://qiita.com/api/v2/docs