Claude CodeでREST APIバックエンドを構築する方法:ステップバイステップガイド(2026年)
Claude CodeでREST APIバックエンドを構築するには、7つのステップを踏みます。エンドポイントとスキーマを設計し、プロジェクトとデータ層の雛形を作り、CRUDをリソースごとに1つずつ実装し、認証とバリデーションを追加し、テストし、本番向けに堅牢化し、そしてデプロイします。Claude Codeは定型作業(雛形、モデル、マイグレーション、テスト)を担い、認証とセキュリティのレビューはあなたが担当します。基本的なCRUD APIは、おおよそ30〜60分でできます。本ガイドでは、Express + Prisma + PostgreSQL上に実際の「tasks」APIを、動くコードと実際のJSONレスポンス付きで構築します。
執筆:Jasmine(Claude Codeで毎日バックエンドをリリースしている開発者)。
なぜClaude CodeでREST APIバックエンドを構築するのか?
Claude Codeはエージェント型のCLIです。リポジトリ全体を読み、複数のファイルを一度に生成し、さらにコマンドやテストを実行して自身の成果物を検証します(Anthropicの公式ドキュメントより、2026年更新)。この特性こそが、コードを貼り付けるだけのチャットボットよりもバックエンド作業に向いている理由です。REST APIとは、突き詰めれば反復の多い定型コードの山です。モデル、マイグレーション、CRUDコントローラー、バリデーション、テスト、ドキュメント。手間がかかり創造性の低い作業であり、まさにAIが最も高速化してくれる領域です。
最大の利点は雛形生成の速さです。ほぼ同じ6つのエンドポイントを手で打つ代わりに、リソースを一度説明すれば、Claude Codeがデータ層とREST層の両方を生成し、そのまま実行します。モデルに合ったZodやPydanticのスキーマを書く、各ルートのテストスイートを用意するといった「面倒な」部分も得意です。
ただし、自分で担い続けるべき部分があります。あなたは依然としてレビュアーです。Claude Codeはあなたのセキュリティ的な文脈を理解しません。ゆるいデフォルト(ルートの認可漏れ、コード内の秘密情報、形だけのバリデーション)を出しがちです。お金や権限に関わるものでは、AIが生み出すものは強力な初稿にすぎません。ツールが初めてなら、まずClaude Codeとは何かを読んで、バックエンド作業を任せる前に仕組みを把握しましょう。
始める前に準備しておくこと
Claude Codeを開く前に確認しておくチェックリストです。これらを整えておくと、セッション全体がスムーズに進みます。
- Claude Codeがインストール済みで、ターミナルで動作すること。未設定ならClaude Codeインストールガイドを参照してください。
- ランタイム:Node 20+(Express用)またはPython 3.11+(FastAPI用)。
- データベース:PostgreSQL(本番向け)またはSQLite(サーバー不要で開発が速い)。
- Gitリポジトリを
git initで初期化済みであること。各差分をレビューし、必要なときに戻せます。 - プロジェクトの規約を明記した
CLAUDE.mdファイル。これがきれいな出力と散らかった出力を分ける最大の違いです。
CLAUDE.mdをリポジトリのルートに置くと、Claude Codeが毎セッション自動で読み込みます。バックエンドでは、レイヤーの規約、バリデーション、エラーの形を最初に宣言しておけば、同じことを繰り返さずに済みます。
# CLAUDE.md - backend conventions
## Architecture
- Three layers: routes -> controllers -> services. No DB queries in controllers.
- ORM: Prisma. All queries go through a service; no raw SQL unless required.
## Validation & errors
- Validate input with Zod at the top of every handler.
- Errors return JSON: { "error": { "code": string, "message": string } }
- Status codes: 200/201 success, 400 validation, 401 unauthenticated,
403 forbidden, 404 not found, 500 server error.
## Security (REQUIRED, do not skip)
- NEVER hardcode secrets. Read them from process.env.
- Every write/update/delete route must pass through auth middleware.
- Never return sensitive fields (passwordHash) in a response.
## Tests
- Every endpoint has at least 1 happy-path test + 1 error test (Jest + Supertest).
このファイル1つで、Claude Codeの生成物の品質がひとつ上のレベルに跳ね上がります。あなたのスタイルを推測する代わりに、従うべき「契約」を持てるからです。
スタックの選択 — Node/ExpressかPython/FastAPIか?
唯一の「正解」スタックはありませんが、Claude Codeの動き方に合うものとそうでないものがあります。人気の4つの選択肢を手早く比較します。
| スタック | 雛形生成の速さ | 型安全性 | エコシステム | Claude Codeとの相性 |
|---|---|---|---|---|
| Express + Prisma | 非常に速い | 十分(TS + Prisma経由) | 巨大(JS) | 高い — 馴染みのあるパターンが豊富 |
| FastAPI + SQLAlchemy | 速い | 高い(Pydanticの型ヒント) | 大きい(Python) | 非常に高い — 型ヒントが幻覚を減らす |
| NestJS | 中程度 | 非常に高い | 大きい | 中程度 — 定型コードやデコレーターが重い |
| Django REST | 中程度 | 中程度 | 巨大(Python) | まずまず — 規約が厳格で柔軟性は低め |
本ガイド全体ではExpress + Prisma + PostgreSQLで進めます。JSファーストで広く使われ、PrismaがNestJSほどの重さなしに十分な型安全性を与えてくれます。チームがPythonなら、FastAPI + SQLAlchemyも優秀です。Pydanticの型ヒントは、実際にClaude Codeの型エラーを減らしてくれます。要点は、1つのスタックを選び、ビルド全体を通してそれを貫くことです。Claude Codeに途中で「自分で選ばせる」のはやめましょう。それは誰も保守したがらない混成の混乱を生むもとです。
ステップ1 — Claude Codeでエンドポイントとスキーマを設計する
Claude Codeに「APIを作って」と言っていきなりコーディングさせてはいけません。まず設計から始めます。リソース、エンドポイント、DBスキーマを先にブレインストーミングさせ、コードが1行も生まれる前に設計を承認できるようにします。コピペ用のプロンプト:
I want to build a REST API for managing "tasks" with Express + Prisma + PostgreSQL.
Before writing code, propose:
1. The endpoint list (method + path + description) for tasks CRUD.
2. The Task table schema (fields, types, constraints).
3. A sample response shape for each endpoint.
Present it as a table. DO NOT code yet - I want to review first.
Claude Codeは、あなたが承認できるよう次のようなエンドポイント表を返します。
| メソッド | パス | 説明 |
|---|---|---|
| GET | /tasks | タスク一覧(ページネーション付き) |
| GET | /tasks/:id | 単一タスクの取得 |
| POST | /tasks | タスクの作成 |
| PATCH | /tasks/:id | 部分更新 |
| DELETE | /tasks/:id | タスクの削除 |
ここで入念にレビューします。フィールドは揃っているか、statusのenumが必要か、ページネーションはカーソル方式かオフセット方式か。設計を言葉で直すほうが、生成後のコードを直すよりずっと安上がりです。ここはClaude Codeでのコード前設計という考え方が効いてくる場面でもあります。
ステップ2 — プロジェクトとデータ層の雛形を作る
設計が固まったら、Claude Codeに雛形を作らせます。プロンプト:
Scaffold an Express + TypeScript project per the plan we just approved:
- Install express, prisma, @prisma/client, zod, dotenv.
- Create the Prisma schema for the Task model as designed.
- Generate the first migration and a seed file with 3 sample tasks.
- Folder structure: src/routes, src/controllers, src/services, src/lib.
After creating it, STOP so I can read the migration before it runs.
生成されるPrismaスキーマは次のようになるはずです。
// prisma/schema.prisma
model Task {
id String @id @default(uuid())
title String
detail String?
status Status @default(TODO)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
enum Status {
TODO
DOING
DONE
}
マイグレーションは実行する前に読む — これは形式的な助言ではありません。Claude Codeは、余計なカラムを追加したり、誤ったデフォルトを設定したり、必要なインデックスを飛ばしたりすることがあります。npx prisma migrate dev --name initは差分を理解してから一度だけ実行してください。この部分を深掘りしたいならClaude Codeをデータベースと使うを参照してください。
ステップ3 — CRUDエンドポイントをリソースごとに1つずつ実装する
鉄則は、「一度に全部作る」のではなく、1エンドポイントずつです。Claude Codeに5つのルートを一気に頼むと、ぶれやすく、レビューにも苦労します。1つ実装し、レビューし、コミットし、次に進みます。まずはPOSTとGETから:
// src/controllers/task.controller.ts
import { Request, Response } from "express";
import { z } from "zod";
import * as taskService from "../services/task.service";
const createSchema = z.object({
title: z.string().min(1).max(200),
detail: z.string().max(2000).optional(),
status: z.enum(["TODO", "DOING", "DONE"]).optional(),
});
export async function createTask(req: Request, res: Response) {
const parsed = createSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({
error: { code: "VALIDATION_ERROR", message: parsed.error.message },
});
}
const task = await taskService.create(parsed.data);
return res.status(201).json(task);
}
export async function listTasks(req: Request, res: Response) {
const tasks = await taskService.findAll();
return res.status(200).json(tasks);
}
レビューで確認すべきことは2つ。レスポンスの形がCLAUDE.mdと一致しているか(エラーオブジェクトの形が正しいか)、そしてステータスコードが意味的に正しいか(作成は200ではなく201)です。ここはClaude Codeが雑になりがちな箇所で、明示しない限りたいてい何でも200を返します。
Claude Codeはこれらのパターンをスキルで標準化します。自前のバックエンドスキルがあれば、素のプロンプトよりずっと一貫した出力になります。
ステップ4 — 認証とバリデーション(JWTまたはAPIキー)
多くのチュートリアルは「必要ならJWTを追加」で止まります。それでは不十分です。書き込み/更新/削除ルートを保護する、実際のJWTミドルウェアがこちらです。
// src/lib/auth.ts
import { Request, Response, NextFunction } from "express";
import jwt from "jsonwebtoken";
export function requireAuth(req: Request, res: Response, next: NextFunction) {
const header = req.headers.authorization;
if (!header?.startsWith("Bearer ")) {
return res.status(401).json({
error: { code: "UNAUTHORIZED", message: "Missing token" },
});
}
try {
const payload = jwt.verify(header.slice(7), process.env.JWT_SECRET!);
(req as any).user = payload;
next();
} catch {
return res.status(401).json({
error: { code: "INVALID_TOKEN", message: "Invalid token" },
});
}
}
書き込みルートに付与します:router.post("/tasks", requireAuth, createTask)。単純な内部APIなら、定数のAPIキーを照合するだけでも十分ですが、素の===ではなく必ずタイミング安全な関数で比較してください。
手動レビューが必須:Claude Codeは弱いデフォルトを出しがちです。正しいルートに
requireAuthを付け忘れる、JWT_SECRETをハードコードされた文字列にフォールバックさせる、所有権チェックを飛ばす(ユーザーAがユーザーBのタスクを編集できる)など。AIがミドルウェアを生成したら、手で見直します。すべての機微なルートに認証があるか、秘密情報はenvから読まれているか、そして(認証だけでなく)認可が実際に正しいか。
ステップ5 — APIをテストする(TDDとAIの組み合わせ)
Claude Codeはテストを書くだけでなく、テストとcurlを自分で実行して検証します。これが本物のエージェント的な強みです。プロンプト:「POST /tasksとGET /tasksについて、ハッピーパスとバリデーションエラーのケースを含むJest + Supertestのテストを書き、それから実行して」。サンプルのテスト:
// tests/task.test.ts
import request from "supertest";
import app from "../src/app";
describe("POST /tasks", () => {
it("creates a valid task and returns 201", async () => {
const res = await request(app)
.post("/tasks")
.set("Authorization", `Bearer ${process.env.TEST_TOKEN}`)
.send({ title: "Write post F1" });
expect(res.status).toBe(201);
expect(res.body.title).toBe("Write post F1");
});
it("returns 400 when title is missing", async () => {
const res = await request(app)
.post("/tasks")
.set("Authorization", `Bearer ${process.env.TEST_TOKEN}`)
.send({});
expect(res.status).toBe(400);
});
});
curlで手動検証し、実際のJSONレスポンスを見ます。
$ curl -s -X POST http://localhost:3000/tasks \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"Write post F1","status":"DOING"}'
{
"id": "a3f1c9e2-...-8b71",
"title": "Write post F1",
"detail": null,
"status": "DOING",
"createdAt": "2026-08-09T04:12:30.882Z",
"updatedAt": "2026-08-09T04:12:30.882Z"
}
Claude Codeに実装前にテストを書かせることは、AIとTDDを実践する効果的な方法です。テストが「契約」として働き、AIはそれが緑になるまでコードを書きます。
ステップ6 — 本番のセキュリティとエラーハンドリング
ここは競合がほぼ空白のまま残す部分です。APIをインターネットに公開する前に、Claude Codeに次の層を追加させます。ただしチェックリストは自分でレビューしてください。
- レート制限:
express-rate-limitでブルートフォースや不正利用を防ぐ(例:100 req/分/IP)。 - CORS:特定のオリジンをホワイトリスト化する。認証付きAPIで
origin: "*"のまま放置しない。 - 環境変数/秘密情報:すべてのキーは
.env経由にし、.envを.gitignoreに追加し、.env.exampleのテンプレートを同梱する。 - 入力バリデーション:各ハンドラーでZodにより既に処理済み。クライアントのデータは決して信用しない。
- 中央エラーハンドラー:すべてのエラーを捕捉し、本番のレスポンスでスタックトレースを漏らさない最終ミドルウェア。
- Helmet:基本的なHTTPセキュリティヘッダーを設定する。
ざっと通すOWASPのチェックリスト:インジェクションはないか(Prismaはパラメータ化クエリでSQLiを防ぐ)、アクセス制御の破れはないか(各ルートの認可を確認)、機微データの露出はないか(余計なフィールドを返さない)。Claude Code自身に穴を走査させたいなら、Claude Codeでセキュリティ監査を行う方法を参照してください。
ステップ7 — APIを本番URLにデプロイする
このデモではRailwayを使います。Postgresを最初から用意でき、Gitから数分でデプロイできるからです。手順:
- リポジトリをGitHubにプッシュする。
- Railwayでリポジトリからプロジェクトを作成し、PostgreSQLサービスを追加する —
DATABASE_URLが自動生成される。 - 本番の環境変数を設定する:
JWT_SECRET、DATABASE_URL、NODE_ENV=production。 - ビルドコマンドを
npx prisma migrate deploy && npm run build、起動コマンドをnpm startに設定する。
より可搬にしたいなら(Render、Fly.io、VPSでも動くように)、最小限のDockerfileを追加します。
# Dockerfile
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npx prisma generate && npm run build
EXPOSE 3000
CMD ["npm", "start"]
デプロイ後、公開URL越しにエンドポイントを叩き、マイグレーションが走ったか、環境が正しいかを確認します。プラットフォーム別の詳細はClaude Codeでアプリをデプロイするのガイドにあります。
もっと速く:AgentKitがak-backend-developmentスキルを提供
混同を避けるため一言:ここでのAgentKitはClaude Code向けのキットバンドル(agentkit.best、ak CLI)であって、OpenAIのAgentKit(Agent Builder/ChatKit、2025年10月6日提供開始)ではありません。名前は同じでも、まったく別物です。
上記の7ステップはいずれも、CLAUDE.mdで規約を宣言し、毎セッション同じパターンを言い直すことを求めます。Claude Code向けAgentKit(リンク経由で20%オフ)はak-backend-developmentスキルをまとめており、その掲載情報によれば、Node/Python/Go(NestJS、FastAPI、Django)、OAuth/JWT認証、OWASPセキュリティチェックリスト、Docker/K8sに対応します。つまりClaude Codeは、この同じ7ステップを既製の標準規約に対して走らせるので、プロジェクトごとに「契約」をゼロから作り直さずに済みます。
正直な見解:キットは必須ではありません。すべて手作業でできますし、本記事がそれを証明しました。キットが節約してくれるのはセットアップの手間だけで、恩恵があるのはバックエンドを頻繁に作る場合です。Engineer Kitは$99(サイトに継続課金の記載はありません)で、「返金保証」と「生涯アップデート」が付きます。購入前に検討するには、AgentKitのEngineer Kitの中身をご覧ください。
実際の限界と、手で必ずレビューすべき場面
これはどの競合も持たないセクションで、最も重要なものです。Claude Codeで多くのバックエンドプロジェクトを経て、私が繰り返し捕まえ続けている失敗パターンはこれらです。
- 誤ったインポート/ORM呼び出し:存在しないPrismaメソッドを呼ぶ、あるいは誤ったバージョンのパッケージをインポートする。コードは正しそうに見えるが実行時に落ちる。
- ルートの認可漏れ:認証(あなたが誰か)はあるが認可(あなたが許可されているか)を飛ばす。ユーザーが他人のデータを編集できてしまう。
- ゆるいバリデーション:タイトルは検証するが長さ制限を忘れる、サニタイズを忘れる、妙なデータ型を通してしまう。
- N+1クエリ:1回のクエリで済むところを、アイテムごとにDBを叩くループにする。開発では平気でも本番で崩れる。
- ハードコードされた秘密情報:
JWT_SECRETや接続文字列を、フォールバックとしてコードに直書きする。 - 「動いてるように見える」が業務ロジックが誤り:コンパイルは通り、ハッピーパスのテストは緑だが、計算や状態のロジックが誤っている。ドメインを知る者しか気づけない。
私のルール:定型はClaude Code、認証・セキュリティ・お金のロジックは人間がレビュー。AIは全体量の80%を何倍も速く生成します。残りの20%こそ高リスクな部分で、そこは手放しにできません。それはツールの弱点ではなく、正しい使い方そのものです。
よくある質問(FAQ)
Claude Codeはバックエンドで本番運用に耐えますか?
完全自動ではありません。Claude Codeは実際に動く、よく構造化されたコードを生成しますが、認証、権限、セキュリティ、業務ロジックは本番前に人間による入念なレビューが必要です。出力は高品質な初稿として扱い、最終版とは見なさないでください。
コーディングの知識は必要ですか、それとも初心者でもできますか?
出力をレビューするには、コードを読め、HTTP/RESTとデータベースを基本レベルで理解できる必要があります。初心者でも動くAPIは得られますが、Claude Codeが埋め込むセキュリティやロジックのバグを見つけるのには苦労します。丸投げせず、一緒に学びながら進めてください。
GraphQLやgRPCも作れますか?
はい。本ガイドは最も一般的なのでRESTをデモしていますが、Claude CodeはGraphQL(Apollo)やgRPCも作れます。原則は同じです。先にスキーマを設計し、小さく分けて作り、認証/セキュリティは自分でレビューします。
Claude Codeに最も合うスタックは?
Express + Prisma(JS)とFastAPI + SQLAlchemy(Python)が二大有力候補です。馴染みのあるパターンが多く、幻覚を減らせるだけの型安全性があります。FastAPIは型ヒントが型エラーを減らすため一歩リードします。
Claude Codeが生成するコードは安全ですか?
デフォルトでは安全ではありません。Claude Codeはゆるいデフォルト(認可漏れ、コード内の秘密情報、薄いバリデーション)を出しがちです。セキュリティチェックリスト(レート制限、CORS、環境変数、OWASP)は自分で実施し、デプロイ前にすべての機微なルートをレビューする必要があります。
基本的なCRUD APIはどのくらい時間がかかりますか?
基本認証とテストを含む完全なCRUD REST APIで、レビュー時間込みでおよそ30〜60分です。雛形と定型は速く、実際の時間は認証、セキュリティのレビューと業務ロジックの調整にかかります。
まとめと次のステップ
7ステップの復習:エンドポイントとスキーマを設計 → プロジェクトとデータ層の雛形を作る → CRUDをリソースごとに1つずつ実装 → 認証/バリデーションを追加 → テスト → 本番向けに堅牢化 → デプロイ。Claude Codeが定型を担い、認証とロジックのレビューはあなたが担う。それが正しい分業です。次に読むとよいもの:APIをより堅牢にするテストの書き方とAIでのTDD、そして本番URLに載せるClaude Codeでアプリをデプロイする。
Claude Codeにもっと速くバックエンドを作らせたいですか?APIを頻繁に立ち上げるなら、既製のak-backend-developmentキットを使えば、毎回規約を宣言し直さなくてもClaude Codeが標準規約に従います。必須ではありません — 手作業でも問題なく動きます。