メインコンテンツへスキップ

AI を活用する開発チームのための、コントラクトファーストでセキュアバイデフォルトな TypeScript REST API

DaloyJS は安全なデフォルト設定を備え、本番環境で既知の設定ミスを見つけると起動を拒否し、ランタイム依存はゼロで、強化されたリリースパイプラインと署名付きの来歴証明を持っています。アプリを完全に安全にしたり、あらゆるサプライチェーン攻撃を防いだりできるフレームワークはありません。だからこそドキュメントでは、何がデフォルトで有効か、何をご自身で有効にする必要があるか、そして何のリスクが残るかを明記しています。

はじめに、インストール、チュートリアルと主要ガイド(ルーティング、検証、エラー、OpenAPI、型付きクライアント、セキュリティ)は日本語で読めます。その他のドキュメントとブログは英語のみです。

$ pnpm create daloy@latest my-api
  • 3,000 件以上のフレームワークテストがすべて成功
  • カバレッジ基準:行と関数 ≥90%、分岐 ≥92%
  • ランタイム依存 0 個
  • Node 24 LTS、Node 26+、Bun、Deno、Cloudflare
  • MIT ライセンス
ᜇᜎᜓᜌ᜔ Daloy はタガログ語で「流れ」を意味します(発音は da-loy)。概要名前の由来チュートリアル:書店 API

セキュリティとサプライチェーン

セキュアバイデフォルト:AI が生成したコードの防護層

コードを AI モデルが生成するようになった今、開発者のタイピング速度はもはやボトルネックではありません。本当に重要なのは、ランタイムのセキュリティとサプライチェーンの完全性です。DaloyJS はランタイムの層で防護を強制します。リクエストボディのサイズ上限、タイムアウト、プロトタイプ汚染の防止、5xx エラー詳細の秘匿、起動時の設定ミスの拒否、そして悪用されうる推移的依存はありません。

セキュアバイデフォルトなランタイム設定

基本的な防護をプラグインや手書きのエラールートに任せるフレームワークもありますが、DaloyJS のコアは最初から防護が有効です。リクエストボディのサイズ上限、リクエストタイムアウト、プロトタイプ汚染に強い JSON パース、正しい 405 Method Not Allowed レスポンス、そしてフェイルクローズドな 5xx エラー詳細の秘匿(明示的に宣言した開発・テスト環境以外では常に有効)。本番環境では、弱いセッションシークレットや、CSRF を有効にしていないセッション Cookie など、既知の設定ミスを見つけると起動を拒否します。
ボディ上限(デフォルト 1 MiB)リクエストタイムアウトプロトタイプ汚染の防止RFC 9457 problem+json厳格なスキーマ検証起動時の設定チェック

ランタイム依存ゼロ

@daloyjs/core をインストールしても、推移的依存パッケージは 1 つも増えません。監査すべき postinstall スクリプトも、選んだ覚えのない依存から突然現れる CVE もありません。フレームワーク自体は依存ツリーを持ち込みませんが、アプリのその他の依存は引き続きご自身で確認してください。
0@daloyjs/core に含まれる推移的依存パッケージ

サプライチェーンを強化したプロジェクトテンプレート

create-daloy で pnpm を選ぶと、pnpm-workspace.yaml は最初から強化済みです。ignoreScripts はインストールスクリプトに潜む悪意あるペイロードを遮断し(ただしインポート時に実行されるコードは防げません)、24 時間の minimumReleaseAge は公開直後に発見される悪意あるバージョンを避け、verifyStoreIntegrity はインストール結果の信頼性を確保します。オプションのセキュリティ一式には、強化された GitHub Actions、Dependabot、CODEOWNERS、SECURITY.md、lockfile の取得元検証、tini を使う非 root のコンテナテンプレート、そして本番設定をチェックする daloy doctor が加わります。
ignoreScripts24 時間の minimumReleaseAgeverifyStoreIntegritySHA で固定した Actionsdaloy doctor による監査

AI のためのプロジェクトテンプレート

create-daloy で作成するすべてのプロジェクトには AGENTS.md とコンテキスト用の skills が含まれ、これらのドキュメントは MCP からも読めます。AGENTS.md を読み込んだコーディングエージェントは、面倒なプロンプトエンジニアリングなしで、フレームワークの規約、ルーティングのルール、セキュリティの基本機能を把握します。
AGENTS.md 同梱コンテキスト用 skillsMCP で読み取り可能

ストリーミングとオブザーバビリティ

バックプレッシャーに対応した SSE と NDJSON のユーティリティ、そしてセマンティック規約の属性を持つ HTTP サーバースパンを出力する OpenTelemetry のトレースフックを備えています。
バックプレッシャー対応 SSENDJSON ストリーミングOTel HTTP サーバースパン

ランタイム間の移植性

コアが扱うのは Request → Response だけです。アダプターは外側の層にあります。Node、Bun、Deno、Cloudflare Workers、Vercel、Fastly Compute、AWS Lambda で、同じアプリ、同じテストが動きます。
Node 24+BunDenoCloudflare WorkersVercelAWS Lambda

コントラクトファーストの設計

1 つのルート定義が、検証、型、OpenAPI 3.1、型付きクライアント、組み込みのコントラクトテストの唯一の情報源になり、食い違いが入り込む余地をなくします。
ランタイム検証OpenAPI 3.1 仕様Hey API 型付きクライアント組み込みのコントラクトテスト

Hey API 型付きクライアント

pnpm gen を実行するだけで、実際の仕様から完全に型付けされた fetch SDK を生成でき、どんな呼び出し元、どんな TS プロジェクトでも使えます。プロセス内の型付きクライアントを使って、コード生成を完全に省くこともできます。
pnpm gen設定不要エンドツーエンドで型付けされた fetch SDK

必要なものはすべて同梱

エッジ対応のセッション、HTTP と同じレート制限枠を共有する WebSocket、構造化ログ、グレースフルシャットダウン。通常はプラグインを組み合わせて用意する本番向けの基盤がすべて含まれ、それでもランタイム依存はゼロです。
エッジセッションWebSocket のレート制限構造化ロググレースフルシャットダウン

ベンチマークとパフォーマンス

数字と、その注意事項

AI エージェントがループでツールを呼び出し、高い並列度でリクエストを送るとき、スループットとコールドスタートの遅延は極めて重要になります。DaloyJS はセキュリティチェックをデフォルトで有効にしており、これらのベンチマークはすべての防護を有効にした状態での性能を測っています。

DaloyJS の実力

リポジトリに含まれるベンチマークスイートの実測データです。どの指標でも選んで表示できますが、これらは厳密な同条件比較ではないため、下の注意事項もあわせてお読みください。

インストールされる推移的依存の数

インストールで取り込まれるパッケージは、どれも誰かが信頼しなければならない攻撃対象です。推移的依存をまったく取り込まないのは DaloyJS と Hono だけです。

あなたにとっての意味: 信頼すべきパッケージが少ないほど CVE も減り、予期しない postinstall スクリプトに出くわすこともありません。依存ゼロとは、フレームワーク自体がサプライチェーンに新たな穴を開けないという意味です。残りの依存ツリーは引き続きご自身で確認してください。

結論: DaloyJS がインストールする推移的依存は 0 個で、サプライチェーンの攻撃対象の小ささは Hono と並んで最小です。一方、安全に構成した NestJS アプリは 86 個を取り込みます。

Apple M3 Max · 16 cores · Node v26.4.0 · 2026年10月 · @daloyjs/core 1.5.4 · ソースコード: bench/cross-framework

同条件の比較ではない理由

これらのフレームワークは同じ種類の道具ではないため、並べた比較グラフは公平な競争というより、りんごとオレンジを比べるようなものです。数字が何を示し、何を示さないかを率直に説明します。
  • 同条件ではなく、りんごとオレンジの比較です。これらの道具は別物で、こなす仕事の量も違います。DaloyJS はリクエストごとに、Zod または Valibot のスキーマでリクエストボディを検証し、セキュリティヘッダー、リクエスト ID、ボディサイズ上限、リクエストタイムアウトを最初から適用します。他のフレームワークの「最小構成」アプリはこれらをほとんど行わず、「セキュア同等」構成でも一つひとつ揃えることはまれです。つまり DaloyJS の数字には、本来ご自身で実装するはずのセキュリティと検証の作業が含まれています。
  • サイズの数え方が異なります。DaloyJS は依存ゼロの単一パッケージですが、他のフレームワークは推移的な依存ツリーを解決する必要があり、その正確なサイズは lockfile がいつ生成されたかによって変わります。
  • スループットは負荷の形に左右されます。双方のミドルウェアスタックが同等の場合、DaloyJS はこれらの GET ルートで Hono を約 27%、ボディ付き POST ルートで約 58% 上回り、しかも DaloyJS は Zod によるボディ検証も行っています。実際のサービスはフレームワークのディスパッチではなく、データベースや I/O の時間に律速されることが多いため、こうしたマイクロベンチマークの数字が本番環境の性能を予測することはまれです。
  • 想定ランタイムが異なります。Elysia など一部のフレームワークは Bun 向けに最適化されていますが、ここでは公平な単一ランタイムの基準を得るため、すべて Node アダプターで計測しました。
  • 1 台のマシン、1 つの時点での計測です。Apple M3 Max、Node v26.4.0、2026年10月、@daloyjs/core 1.5.4 で、マシンには他のバックグラウンド負荷もありました(2 つのフレームワークは続けて計測したため、絶対値より相対比較のほうが信頼できます)。ハードウェア、ランタイム、バージョンが変われば数字も変わります。

機械のために:AI エージェントとツール向け

DaloyJS は MCP に対応しています

Model Context Protocol(MCP)は、Claude、Cursor、VS Code などの AI エージェントがツールを呼び出し、ドキュメントを読むためのオープン標準です。DaloyJS は両方に対応しています。あなたのアプリは MCP サーバーになれますし、このサイトのドキュメント(英語)自体も MCP サーバーです。

あなたの API を MCP サーバーに

DaloyJS は @daloyjs/core だけで MCP サーバーを構築でき、SDK は不要です。Streamable HTTP トランスポート、入力スキーマの検証、そして本番環境の起動時ガードを備えています。MCP エンドポイントの処理チェーンに認証フックがなければ、起動を拒否します。このガードが確認するのは、フックが存在し、本番環境ですべてのリクエストに対して実行されたかどうかであり、実際に誰かを拒否したかどうかではありません。認証ロジックのテストも忘れずに行ってください。

MCP サーバーを構築する →
ts
import { App, bearerAuth, createMcpHandler, mcpRoutes } from "@daloyjs/core";

const mcp = createMcpHandler({
  serverInfo: { name: "inventory-mcp", version: "1.0.0" },
  tools: [/* 入力スキーマを検証するあなたのツール */],
});

const app = new App();
app.use(bearerAuth({ validate: checkToken })); // 認証フックがなければ本番環境では起動を拒否
for (const route of mcpRoutes("/mcp", mcp)) {
  app.route(route); // これであなたの API は MCP サーバーにもなります
}

このサイトのドキュメントを MCP で読む

公開された読み取り専用のエンドポイントです。AI コーディングアシスタントが直接検索して読めるので、コピー&ペーストも API キーも不要です。

エンドポイント

MCP 対応のクライアントをこの URL に向けてください:
https://daloyjs.dev/mcp
  • search_docsすべてのドキュメントページをキーワードで検索し、関連度順に並べます。
  • get_docルートまたは slug を指定して、ページの全文を読みます。
  • list_docs1 回の呼び出しで、利用できるすべてのドキュメントページを一覧できます。

MCP クライアントの設定に追加

json
{
  "mcpServers": {
    "daloyjs-docs": {
      "url": "https://daloyjs.dev/mcp"
    }
  }
}

stdio にしか対応していないクライアントをお使いですか? 次のようにブリッジできます: npx -y mcp-remote https://daloyjs.dev/mcp.

影響範囲を限定する

コントラクトは飾りの構文ではなく、セキュリティの境界です

AI ファーストのワークフローでは、コントラクトは人間のための見た目の飾りではなく、ハルシネーションで生まれたデータ構造がコンポーネント間に漏れ出すのを防ぐ、機械が強制する境界です。1 つのルートコントラクトがリクエストを厳格に検証し、レスポンスの内容を制約し、OpenAPI 3.1 仕様と型付きクライアントをその場で生成します。

コントラクトの流れ一度定義すれば -> あとは自動生成
01コントラクトGET /books/:id + z.object(...)
02検証ランタイム、双方向
03OpenAPI 3.1ライブ仕様 + /docs UI
04型付きクライアントpnpm gen -> fetch SDK
ts
import { z } from "zod";
import { App, secureHeaders, rateLimit, requestId } from "@daloyjs/core";
import { serve } from "@daloyjs/core/node";

const app = new App({ bodyLimitBytes: 1 << 20, requestTimeoutMs: 5_000 });

// new App() は requestId() と secureHeaders() を自動で適用します。
// ここでの明示的な呼び出しは、デフォルト設定のカスタマイズ(置き換え)用です。
app.use(requestId());
app.use(secureHeaders());
app.use(rateLimit({ windowMs: 60_000, max: 120 })); // デフォルトはクライアント IP 単位。プロキシの背後では behindProxy か keyGenerator を設定

app.get(
  "/books/:id",
  {
    request: { params: z.object({ id: z.string() }) },
    responses: {
      200: { description: "見つかりました", body: z.object({ id: z.string(), title: z.string() }) },
      404: { description: "見つかりません" },
    },
  },
  async ({ params }) => ({
    status: 200,
    body: { id: params.id, title: `書籍 ${params.id}` },
  }),
);

serve(app, { port: 3000 });

Scalar API リファレンスを 1 行で

Scalar は Swagger UI の現代的な後継です。高速でシンプル、ダークモードにネイティブ対応し、リクエストをその場で試せます。DaloyJS では、これはプラグインではなくデフォルトのドキュメント UI です。App のコンストラクターで docs: true を設定すると、/docs にこのページが自動でマウントされ、/openapi.json でライブの OpenAPI 3.1 仕様が提供されます。

ルートコントラクトから自動生成され、追加のコードは不要です。Swagger UI や Redoc のほうがお好みなら、設定を 1 つ変えるだけです。 OpenAPI とドキュメント UI のガイド →

エコシステムのトレードオフ

各フレームワークの長所を取り入れ、妥協を減らす

DaloyJS は 1 つの項目だけで勝とうとはしていません。目指しているのは、さまざまな良いアイデアの間をつなぐグルーコードを書く手間を、開発者から取り除くことです。

求めるもの現在: pnpm のデフォルト設定 + ランタイム依存ゼロのコア

構築するアプリに移植可能なサプライチェーン強化

DaloyJS が提供するもの

強化された pnpm インストール設定、取得元を検証した lockfile、SBOM + npm の来歴証明

求めるもの現在: Hono

サーバーレス / エッジ環境への適合

DaloyJS が提供するもの

Web 標準ベースのコア、マルチランタイムのアダプター

求めるもの現在: Fastify

成熟した Node の運用機能とドキュメント

DaloyJS が提供するもの

カプセル化されたプラグイン、構造化ログ、グレースフルシャットダウン

求めるもの現在: Elysia

モダンな TS ファーストの開発体験、Bun 対応

DaloyJS が提供するもの

エンドツーエンドで型付けされたハンドラー、コンテキスト、クライアント

求めるもの現在: FastAPI

最高の OpenAPI 体験

DaloyJS が提供するもの

1 つのルート定義から OpenAPI 3.1 を組み込みで生成

求めるもの現在: Hey API

最高の型付きクライアントのコード生成

DaloyJS が提供するもの

pnpm gen → 完全に型付けされた fetch SDK

セキュアバイデフォルトで出荷する準備はできましたか?

数秒でプロジェクトを作成できます。パッケージマネージャーのインストール設定を強化し、インストールスクリプトを遮断する CI、バージョンを固定した GitHub Actions、Dependabot、CODEOWNERS、lockfile の取得元検証を生成します。アプリが成長してもコントラクトは一貫したまま、同じアプリが Node、Bun、Deno、Cloudflare Workers で動きます。

プロジェクトを支援する

DaloyJS で時間を節約できたら、コーヒーを 1 杯ごちそうしてください

DaloyJS は無料で、MIT ライセンスのオープンソースです。ドキュメント、記事、あるいはフレームワーク自体のおかげで少しでも楽に出荷できたなら、コーヒーを 1 杯ごちそうしていただくことが、この活動を続ける何よりの支えになります。