1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeに社内限のQiita:Teamのドキュメントを読ませる

Posted at

はじめに

Claude Code便利なんだけど、社内ドキュメントがQiita:Teamで管理されていると、Claude君にもコンテキストとして読んでほしい場合にちょっと困ります。
Qiitaさんが公式でMCPサーバを提供してくれればすべて解決なんだけど、残念ながら本稿執筆時点では野良のMCPサーバしか存在しなさそうでした。
ただ公式のAPIは生えているので、APIを叩けばドキュメントを取得できそうです。

というわけで、社内Qiita:Teamのドキュメントを取得するClaudeスキルを書いてみた。

TL;DR

  • Qiita APIを叩くのに、increments/qiita-rbを使用
  • Qiita:Teamの記事のURLからteam_iditem_idを抽出して、qiitaコマンドに渡す
  • Claude Code経由で叩く場合は、標準入力に空のJSONオブジェクト{}を渡す必要があることに注意

例えば、記事URLが https://[team_id].qiita.com/[user_id]/items/[item_id] の場合は、以下のようにコマンドを組み立てればよい。

echo '{}' | qiita get_item [item_id] --team [team_id] | jq -r .body

これを必要なタイミングで勝手に読んでくれるようにClaudeスキルとして作成し、
~/.claude/skills/qiita_team_get_item/SKILL.md あたりに配置すればOK。

むしろqiita-rbの標準入力の取り扱いのところで若干ハマったのでこの記事を書いてるだけで、やってること自体はシンプルです。

実装

環境

手元の環境は以下のとおりです。

  • Claude Code: v2.0.28
  • qiita-rb: v.1.6.0
  • Ruby: v3.4.5

事前準備

qiita-rbのインストール

Qiita APIを叩くコマンドには increments/qiita-cliincrements/qiita-rb の2種類が存在しますが、今回はAPIの単純なラッパーであるqiitaコマンドが付属しているqiita-rbを使用します。

$ gem install qiita

アクセストークンの発行

Qiita:Teamの設定画面からアクセストークンを発行します。

  1. Qiita:Team 設定 > 開発者向け設定 > アクセストークン
  2. 「トークンを発行する」ボタンを押下
  3. アクセストークンの説明: (適当な文字列を入力)
  4. スコープを選択: read_qiita_team
  5. 「アクセストークンを発行する」ボタンを押下

発行されたアクセストークンを環境変数QIITA_ACCESS_TOKENに設定します。

$ export QIITA_ACCESS_TOKEN="your_access_token"

※Qiita:Teamの管理設定により、一般ユーザのアクセストークン発行には管理者の承認が必要な場合あり。

疎通確認

qiitaコマンドの疎通確認をしておきましょう。
まずは自分のユーザ情報を取得してみる。

$ qiita get_user [your_user_id]

次に、適当な記事のURLを指定して、記事が取得できるかを試す。

例えば、記事URLが https://[team_id].qiita.com/[user_id]/items/[item_id] の場合は、以下のようにコマンドを組み立てて下さい。

echo '{}' | qiita get_item [item_id] --team [team_id] | jq -r .body

補足として、ターミナルで直接qiitaコマンドを実行する場合は、echo '{}' |の部分は不要ですが、Claude Code経由で実行する場合には標準入力の取り扱いが異なり必要です。
最初これに気づかなくて若干ハマりました。

スキルの作成

Claude Codeにはスキル機能があり、特定の条件下で追加のプロンプトを読み込ませることができます。

Slashコマンドのように明示的な実行は不要で、Claude Codeが必要と判断したタイミングで発動します。
つまり、プロンプト内で参考資料として渡したURLや、コード内のコメントにQiita:Teamの記事URLが含まれている場合に、自動的にスキルを呼び出して記事を取得するという使い方ができます。
MCPとの違いは、マークダウンのプロンプトだけで簡単に実装できるのと、
デフォルトではスキルのdescriptionしか読み込まれず、必要と判断されたタイミングで詳細を読み込むのでコンテキストを節約できます。

Claude Codeのスキルはプロジェクト配下にも作成できますが、プロジェクト横断で利用する汎用的なスキルとして、ユーザ管理の ~/.claude/skills/配下に配置しておきます。今回はqiita_team_get_itemというスキルを作成しました。

~/.claude/skills/qiita_team_get_item/SKILL.mdを作成し、スキルの説明と使用するコマンドを記述します。
詳細は長いので折りたたんでおきます。
※この記事の原稿のマークダウンの中にスキルのマークダウンを埋め込んでいる都合上、普通にWebブラウザで表示すると変な感じになりますが、Qiita記事はURLの末尾に .md を付けてアクセスすると原稿の生のマークダウンを取得できるので、コピペする場合は生データをご利用下さい。

SKILL.md

name: qiita_team_get_item
description: 社内Qiita:Teamのドキュメントコンテンツを取得する。コード内のコメントやドキュメントにQiita:TeamのURL(https://[team_id].qiita.com/[user_id]/items/[item_id]形式)が含まれている場合に使用する
allowed_tools:

  • Bash(qiita get_item:*)

Qiita:Team ドキュメント取得

このスキルは、認証が必要な社内Qiita:Teamのドキュメントを取得します。

概要

  • 公開Qiita(https://qiita.com/)の記事は標準のWebFetchツールで取得可能
  • 社内Qiita:Team(https://[team_id].qiita.com/[user_id]/items/[item_id])の記事は認証が必要なため、このスキルを使用する

使用タイミング

以下のような場合にこのスキルを使用する:

  1. コード内のコメントにQiita:TeamのURLが含まれている
  2. ユーザーがQiita:Teamの記事を参照するよう指示した
  3. 実装の参考資料としてQiita:Teamのドキュメントを確認する必要がある

Instructions

1. URLの解析

Qiita:TeamのURLから以下の情報を抽出する:

  • URL形式: https://[team_id].qiita.com/[user_id]/items/[item_id]
  • team_id: チームID(サブドメイン部分)
  • user_id: 投稿ユーザーID(共同編集の場合はshared
  • item_id: 記事ID(パスの最後の部分)

2. コンテンツの取得

Bashツールを使用して以下のコマンドを実行する:

echo '{}' | qiita get_item [item_id] --team [team_id] | jq -r .body

パラメータ:

  • [item_id]: 手順1で抽出した記事ID
  • [team_id]: 手順1で抽出したチームID
  • 注意: [user_id]部分はコマンドには不要(item_idのみで記事を特定できる)

3. 結果の処理

  • コマンドが成功した場合: 記事本文(Markdown形式)が出力される
  • コマンドが失敗した場合: エラーメッセージを確認し、ユーザーに報告する

Examples

Example 1: コード内のコメントから記事を取得

# コード内のコメント:
# 参考: https://myteam.qiita.com/user_id/items/abc123def456
# または: https://myteam.qiita.com/shared/items/789abc012def

# 実行するコマンド(ユーザー投稿でも共同編集でも同じ形式):
echo '{}' | qiita get_item abc123def456 --team myteam | jq -r .body
echo '{}' | qiita get_item 789abc012def --team myteam | jq -r .body

注意: URLのユーザーID部分(user_idshared)はコマンドには不要です。item_idteam_idのみを使用します。

Example 2: ユーザーの直接指示

ユーザー: 「このQiita:Teamの記事を確認して: https://myteam.qiita.com/shared/items/789abc012def

echo '{}' | qiita get_item 789abc012def --team myteam | jq -r .body

注意事項

  • 認証設定済みのqiitaコマンドが必要(事前設定済み)
  • qiitaコマンドの実装にはincrements/qiita-cliとincrements/qiita-rbの2種類が存在するが、このスキルではqiita-rbを使用
  • echo '{}' | の部分は、Claude Code経由でqiitaコマンドを使用する場合の標準入力の取り扱いに関する技術的な制約に対する回避策であり、省略不可

稼働確認

Claude Codeを起動して、Qiita:Teamの記事URLを読めているか確認して下さい。

自動承認の設定

毎回スキルの実行を手動承認するのは面倒な場合は、~/.claude/settings.jsonpermissionsに追加しておくと確認を省略できます。

~/.claude/settings.json
{
  "permissions": {
    "allow": [
      "Bash(qiita get_item:*)",
      "Skill(qiita_team_get_item)"
    ]
  }
}

おわりに

Claude Codeのスキル機能を使うことで、社内Qiita:Teamのドキュメントを読ませることができました。

ちなみに記事の検索はWeb画面からだと関連度順などソート順が選べますが、API経由だと投稿日順しか取れなさそうでした。Qiita:Teamの記事が多いと実用上はだいぶ厳しそうなかんじです。
記事をどこかにキャッシュして検索を自分で作り込むのはさすがにコレジャナイ感があるので、Qiitaさん検索APIをなにとぞ :pray:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?