StitchAPI Docs について
StitchAPIは、個々のAPIエンドポイントを型付き関数として宣言するTypeScript開発者向けライブラリです。呼び出し時のレスポンス検証やリトライなどに対応し、コード生成やサーバーのデプロイなしで、同じ定義をコード、CLI、HTTP、MCPから利用できます。
主な機能
- 01APIエンドポイントを型付き関数として宣言
- 02レスポンス検証とスキーマドリフト検出
- 03リトライ、スロットリング、タイムアウト、サーキットブレーカーの設定
- 04認証と認証情報の境界を管理
- 05関数、CLI、HTTP、MCPで定義を公開
活用シーン
- 01OpenAPI仕様のないエンドポイントの呼び出しを構築
- 02APIレスポンス変更時のスキーマドリフトを検出
- 03API呼び出しのリトライとスロットリングを設定
- 04同じエンドポイント定義をエージェントやMCPクライアントに提供
MCP 対応
`stitch mcp`を使って、エンドポイント定義をMCPツールとして公開できます。同じstitch定義は関数、CLIコマンド、HTTPエンドポイントとしても利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://stitchapi.dev/api/mcpclaude mcp add --transport http dev-stitchapi-docs https://stitchapi.dev/api/mcp{"mcpServers":{"dev-stitchapi-docs":{"type":"http","url":"https://stitchapi.dev/api/mcp"}}}Cursor で開く{"servers":{"dev-stitchapi-docs":{"type":"http","url":"https://stitchapi.dev/api/mcp"}}}VS Code で開く{"mcpServers":{"dev-stitchapi-docs":{"type":"http","url":"https://stitchapi.dev/api/mcp"}}}{"mcpServers":{"dev-stitchapi-docs":{"serverUrl":"https://stitchapi.dev/api/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
2| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 返す結果の最大数(既定値は 5)。 |
| query | string | はい | 自然言語の検索クエリ。 |
詳細
API のステッチング:あらゆる API を型安全で堅牢な関数に変換します。エンドポイントを一度定義すれば、型、認証、堅牢性が整い、ローカル関数のように呼び出せます。サーバーも、コード生成も、設定ファイルも不要です。同じ定義をコード、CLI、AI エージェントのいずれからも利用できます。
📚 stitchapi.dev — ドキュメント、ガイド、ライブプレイグラウンド
実行時依存関係ゼロ · ~21 kB min+gzip — 一般的な import { stitch } はツリーシェイク後に ~19 kB になり、依存関係のツリーがないため、追加でインストールや監査が必要なものはありません。キャッシュエンジンと OTLP エクスポーターは初回使用時に遅延読み込みされるため、これらの数値には含まれていません。このサイズは目標ではなく、CI で強制される予算です。
検証可能なサプライチェーン — すべてのパッケージは GitHub Actions から OIDC を介して公開され、署名付きのnpm ビルド来歴証明が付与されます。これにより、インストールした tarball を生成したコミットとワークフローを確認できます。各リリースには SPDX と CycloneDX の両形式でSBOMも同梱され、リポジトリはOpenSSF Scorecardによって公開スコアが付けられています。
メモ
StitchAPI は
1.0.0-rc.9です。 コアランタイムは機能が完成しており、依存関係はゼロで、テストゲートもすべて合格し、すでに2つのプロジェクトで本番稼働しています。安定版1.0.0をリリースする前に実環境で検証を進めています。正確なバージョンを固定し、小規模で文書化された変更のみを想定してください。フィードバックをお待ちしています。
目次
- stitch とは?
- 動機
- StitchAPI を選ぶ理由
- StitchAPI が対象としないもの
- 機能
- インストール
- クイックスタート
- 合成:seam、extends、
.with() - 検証と段階的なドリフト
- 耐障害性:再試行、スロットリング、タイムアウト
- キャッシュ
- 境界としての認証
- リクエスト形式:あらゆるスタイルに対応
- 4つの入り口
- エージェントネイティブ
- エラーと落とし穴
- インフラ不要の可観測性
- パッケージ
- ドキュメント
- コントリビューション
- ライセンス
stitch とは?
stitch は StitchAPI の中核となるプリミティブです。単一のエンドポイントを受け取り、呼び出し可能なものを返します。入力、出力、認証、耐障害性といったコントラクトを一度だけ宣言すれば、ローカル関数のように呼び出せます。コードが呼び出す定義と同じものを、CLI が実行し、AI エージェントが呼び出します。そして、すべての呼び出し元に渡されるのは認証情報ではなく、機能です。複数のエンドポイントを持つサービスは seam です。これは、ベース URL、認証、1つのランタイム(スロットリング予算、ストア、トレースシンク)を共有する stitch のグループです。
import { stitch } from 'stitchapi';
import { z } from 'zod';
const getUser = stitch({
path: 'https://api.example.com/users/{id}',
output: z.object({ id: z.number(), name: z.string() }),
pick: 'data',
});
const user = await getUser({ params: { id: 1 } }); // typed · validated
既存の fetch や axios はそのまま使えます。これらは下層のアダプターです。stitch はトランスポートの_上位_に位置し、呼び出しを置き換えるのではなく、エンドポイントを関数に変換します。
動機
ほとんどすべてのプロジェクトには、HTTP リクエストを送信し、レスポンスからペイロードを取り出すだけの薄い関数をまとめた src/api/ フォルダーがあります。認証のライフサイクル、再試行、レート制限、タイムアウト、レスポンスの検証、ドリフトの検出、可観測性など、統合の信頼性を実際に支える仕組みはすべて、呼び出し箇所ごとに再実装され、それぞれのラッパーが独立して劣化していきます。fetch が返すのは不透明なバイト列であり、アプリケーションコード(または AI エージェント)が必要とするのは生のバイト列ではありません。どちらも、構造化され、検証済みで、可観測な結果を必要とします。
stitch はこうした仕組みをすべて呼び出しにまとめます。
生の fetch を使う場合、自分で実装するもの… | …stitch なら一度宣言するだけです |
|---|---|
| 解析して正しい形式か期待する、不透明なバイト列 | スキーマで検証された型付きの結果。呼び出しごとにドリフトを検出 |
| 最初の失敗で例外が発生し、あとは自分で対処 | バックオフとジッターによる再試行。Retry-After を尊重 |
| 思い出した場合に限り、単一の大まかなタイムアウト | 実際の中断を伴う、全体/試行ごとの多層タイムアウト |
| レート制御なし。本番環境で 429 エラーに直面 | 積極的なスロットリング:ホストごとに共有されるレートと同時実行数の上限 |
| 自分でフレーム化し、ページネーションする生のバイトストリーム | SSE のフレーミング、差分の連結、自動ページネーション |
| 呼び出しで何が起きたかを把握できない | 型付きイベントストリームとオプトインのトレース:レイテンシ、再試行、ドリフト |
StitchAPI を選ぶ理由
型付き API クライアントを手に入れる方法はたくさんあります。仕様ベースのジェネレーター、手書きのコントラクトクライアント、ワークフロープラットフォーム、あるいは手作りの fetch ラッパーを集めたフォルダーなどです。StitchAPI は、それらのどれもカバーしていない領域を担います。一度に 1 つのエンドポイントを、堅牢で検証可能、かつ観測可能な関数に変換します。仕様も、コード生成も、設定ファイルも、サーバーも不要で、明示的な合成だけで実現します。
- 仕様優先ではなく、アトミックです。 仕様ベースのジェネレーター(openapi-generator、Orval、Kubb、…)は、まず完全な OpenAPI ドキュメントを必要とします。しかし、実際の API の多く(社内向け、ドキュメント化されていないもの、ニッチなもの)には、そもそもドキュメントがありません。スティッチに必要なのは URL とレスポンスの例 1 つだけです。
- コードジェネレーターではなく、ランタイムです。 コミットし、差分を確認し、再生成する必要のある生成済み SDK はありません。宣言そのものがクライアントであり、実際の呼び出しごとに検証されます。そのため、フィールド名がひそかに変更された場合でも、下流の 3 層先で
undefinedになるのではなく、明確なレベル付きのドリフトシグナルとして検知できます。 - 堅牢性は自分で実装するのではなく、宣言します。 リトライ、スロットリング、タイムアウト、サーキットブレーカー、ページネーションをスティッチに設定すれば、すべての統合で一貫して適用されます。
- 認証は境界です。 スティッチは自身の認証情報とライフサイクルを管理し、呼び出し側に渡すのは認証情報ではなく、機能へのアクセス権です。呼び出し側が AI エージェントの場合は、特に重要です。
- エージェントは第一級の呼び出し元です。 1 つの定義から、関数、CLI コマンド、HTTP エンドポイント、MCP ツールが生成されます。返されるのは不透明なバイト列ではなく、構造化され、スキーマ検証済みで、追跡可能な結果です。
- プラットフォームではなく、ライブラリです。 ランタイム依存関係はゼロで、プロジェクトに組み込め、運用するものはありません。
| 代替手段 | 必要なもの | 管理するもの | StitchAPI が提供するもの |
|---|---|---|---|
| 仕様ベースのコード生成(openapi-generator、Orval、Kubb、…) | 完全な OpenAPI 仕様 | API の変更ごとに再生成する SDK | 一度に 1 つのエンドポイントを扱い、ランタイムで実際に検証 |
| 型付きランタイムクライアント(Zodios、ts-rest、…) | 手書きのコントラクト | 独自のリトライ/認証/レート制限のコード | 堅牢性、認証ライフサイクル、ドリフト検出をプリミティブに組み込み |
| ワークフロープラットフォーム(Windmill、n8n、…) | デプロイするサーバー | 他者のランタイム内にあるフロー | 依存関係ゼロのライブラリ。合成はコードだけで実現 |
手作りの fetch ラッパー | なし | プロジェクトごとに独自の認証、リトライ、制限を再実装 | 同じ懸念事項を各スティッチで一度だけ宣言 |
競合状況とポジショニングの全容については、概要をご覧ください。
StitchAPI が目指さないもの
ツールが何にならないことを選んでいるかを知ることが、それが何であるかを信頼する方法です。
- HTTP クライアントや
fetchの代替ではありません —fetch/axios は基盤であり、スティッチはトランスポートの上位に位置します。 - コードジェネレーターではありません — コミットし、差分を確認し、再生成する SDK はありません。宣言がランタイムとなり、実際の呼び出しで検証されます。
- 仕様優先ではありません — OpenAPI ドキュメントは不要です。URL とレスポンスの例 1 つで十分です。
- デプロイするサーバーではありません — 自分で管理していない API のためにインポートして使う、依存関係ゼロのライブラリです。
- ワークフローエンジンや iPaaS ではありません — オーケストレーション、キュー、ビジュアルビルダーはありません。合成はプレーンな TypeScript で行います。
- 設定ファイルや隠れた継承はありません — スティッチがひそかに読み込む暗黙の設定はありません。
サーバーも、コード生成も、設定ファイルも、暗黙の継承もなく、明示的な合成だけです。
機能
- サーフェスごとにスコープされた単一のプリミティブ —
stitch(url | config)は型付きの呼び出し可能な値を返します。複数のエンドポイントを持つサービスはseamとなり、メンバー間でベース URL、認証、スロットル予算、ストア、トレースシンクを共有します。 - イベントストリームを中核に設計 — すべての呼び出しは型付きストリーム(
start → progress → drift → result → done)を生成します。最終的な検証済みの値を返すawaitは糖衣構文です。 - バリデーションは自由に選択 — Zod または任意の Standard Schema バリデーター(Valibot、ArkType、…)を使用できます。型はスキーマから推論されます。
- 段階的なドリフト検出 — 実際のレスポンスを宣言済みスキーマ(コントラクト)に照らして検証します。必須フィールドの欠落や不整合は 例外をスロー します。一方、ソフトドリフト(型変換、未宣言フィールド、デフォルト値が設定されたフィールド)は、
undefinedを黙って返すのではなく、致命的ではないwarn/info/verboseの検出結果として通知されます。 - 宣言的な耐障害性 — バックオフと
Retry-Afterによる再試行、先行スロットリング、階層型タイムアウト、サーキットブレーカー、冪等性キーを備えています。 - 読み取り時キャッシュ — オプトイン方式のレスポンスキャッシュとプロセス内のリクエスト集約を提供します。派生したプリンシパルスコープのキーを使い、
stitchapi/cacheから遅延ロードされます。 - 境界としての認証 —
bearer、apiKey、basic、cookieSession(自動ログイン/再ログイン)、oauth2に対応しています。シークレットは呼び出し時に解決され、呼び出し元に渡ることはありません。 - あらゆるリクエスト形式に対応 — デフォルトは
httpです。graphql、sse、stream、download、llm、shell、postmessageはサブパスインポートから利用できる、同等のサーフェスです。 - プラガブルな状態ストア — スロットル状態、キャッシュ、セッションは、任意のアトミック操作を備えた
get/setストアで管理できます。Redis/Postgres に切り替えれば、分散環境で利用できます。 - インフラ不要の可観測性 — トレースは デフォルトでオフ です。スティッチごと、または
STITCH_TRACE_*環境変数で有効化できます。コレクターもダッシュボードも不要です。 - 4 つの入口、定義は 1 つ — プロセス内関数、CLI(
stitch run)、HTTP(stitch serve)、MCP(stitch mcp)から利用できます。 - ランタイム依存関係ゼロ —
"dependencies": {}で、グローバルなfetchを使用し、ツリーシェイク可能です。エントリー全体で min+gzip 約 21 kB、一般的なimport { stitch }では 約 19 kB です(キャッシュエンジンと OTLP エクスポーターは初回使用時に遅延ロードされます)。
インストール
npm install stitchapi@rc # or: pnpm add stitchapi@rc · yarn add stitchapi@rc
バリデーションは自由に選択できます。Zod のスキーマまたは任意の Standard Schema バリデーターを渡してください。どちらも同梱されていません。以下の例では、わかりやすさのために Zod を使用し、例示用ホストとして api.example.com を使っています。実行するには、ご自身の API に向けるか、プレイグラウンドでそのままお試しください。プレイグラウンドでは、ブラウザー内シミュレーターからこのホストにアクセスできます。
クイックスタート
最もシンプルなスティッチは URL です。一度宣言すれば、何度でも呼び出せます。
import { stitch } from 'stitchapi';
const getUsers = stitch('https://api.example.com/users');
const users = await getUsers(); // GET, parsed JSON
パスパラメーターには RFC 6570 URI テンプレートを使用します。params、query、headers、body はすべて 1 つの入力オブジェクトで渡します。
const getUser = stitch('https://api.example.com/users/{id}');
await getUser({ params: { id: 1 }, query: { expand: 'roles' } });
// → GET https://api.example.com/users/1?expand=roles
必要な場合に限り、各種オプションをすべて設定できます。デフォルトでは無効です。
const getUser = stitch({
path: 'https://api.example.com/users/{id}',
output: User, // a validator of your choice
pick: 'data',
retry: 3, // ≡ { attempts: 3 }
timeout: '5s', // ≡ { total: '5s' }
cache: '1m', // ≡ { ttl: '1m' }
});
const user = await getUser({ params: { id: 42 } });
// → typed · validated · retried · cached
スティッチは型付きの イベントストリーム を生成します。await はストリームを消費して最終的な値を返します。一方、.safe() は { ok, data, error } を返し、.stream() は進行状況、スロットル待機、再試行、ドリフトを発生時に逐次出力します。
合成:seam、extends、.with()
再利用可能なものはすべて名前付きの値であり、スティッチはそれらを組み合わせます。グローバル設定は一切不要です。 複数のエンドポイントを持つサービスは seam です。共通のベース URL、認証、予算を一度だけ宣言すれば、各エンドポイントがその設定を継承し、1 つのランタイム(スロットルバケット、ストア、トレースシンク)を共有します。
import { seam } from 'stitchapi';
const api = seam({
baseUrl: 'https://api.example.com',
retry: { attempts: 3, on: [429, 503] },
timeout: { total: '30s' },
});
const listUsers = api.stitch({
path: '/users',
output: User.array(),
pick: 'data',
});
const getUser = api.stitch({
path: '/users/{id}',
output: User,
pick: 'data',
});
より軽い再利用には、extends: [fragment | stitch] で設定を左から右へマージできます(自身のフィールドが優先されます)。また、.with() は入力の一部を事前にバインドし、同じランタイムを再利用します。詳細なガイド:オーサリング。
検証と段階的なドリフト
宣言された output スキーマが契約そのものです。これを drift() でラップします。レスポンスが検証され(呼び出しは検証済みの値を返します。値は型変換され、デフォルト値が設定され、未知のキーは除去されます)、生の本文と検証済みの値との差分が、致命的ではない段階的なシグナルとして報告されます。
| 変更 | 意味 | レベル |
|---|---|---|
| invalid | 必須フィールドがない、または互換性がない — 例外が発生します | error |
| coerced | 型変換("42"→42):ワイヤー上の型の変化が検証によって隠された状態 | warn |
| undeclared | スキーマによって除去されるキー | info |
| defaulted | .default() が適用された(フィールドが存在しない) | verbose |
import { drift, stitch } from 'stitchapi';
import { z } from 'zod';
const listOrders = stitch({
path: 'https://api.example.com/users/{id}/orders',
pick: 'data',
output: drift(
z.array(z.object({ id: z.number(), total: z.number().optional() })),
{
ignore: ['[].meta'], // acknowledged, unconsumed — don't report it
level: { coerced: 'info' }, // re-level a kind, or pass a level/list to filter
},
),
});
ドリフトはスキーマを基準とするため、管理するスナップショットは不要です。重大度はスキーマに基づきます。必須フィールドがない、または互換性がない場合は、致命的な invalid となり、例外が発生します。それ以外はすべて、イベントストリーム上の致命的ではないドリフトです。宣言された差異(オプションフィールド、nullable、空の配列)は問題なく検証されるため、誤検知にはなりません。ignore は既知だが使用されないフィールドを無視し、level はソフトシグナルをフィルタリングするか、レベルを変更します。リクエスト側も検証されます。input にはパートごとにスキーマを指定でき、リクエストの送信前にすばやく失敗します。詳細なガイド:検証とドリフト。
レジリエンス:リトライ、スロットリング、タイムアウト
すべての src/api/ フォルダーで独自に実装されがちな機能を、ここでは設定として用意し、すべてのスティッチで統一しています。
const listUsers = stitch({
baseUrl: 'https://api.example.com',
path: '/users',
retry: { attempts: 4, on: [429, 502, 503] },
throttle: { rate: '1/s', concurrency: 2, pool: 'host' },
timeout: { total: '30s', each: '10s' },
});
throttle は事前に制御します(制限に達する前に上限以下に保ちます。pool: 'host' はスティッチ間でリミッターを共有します)。retry は事後に対応します(バックオフと Retry-After)。timeout は実際の AbortSignal で中断します。さらに、3 つの設定があります。circuit はすでに停止している依存先への処理を即座に失敗させ、idempotency は書き込み時に安定した Idempotency-Key を挿入し、verdict は成功とみなす条件を宣言します。accept は 404 などの非2xxを例外ではなく通常の結果として扱い、flag は本文が失敗を示す 200 を失敗とします。詳細なガイド:レジリエンス。
キャッシュ
読み取り時に使用するレスポンスキャッシュで、プロセス内のリクエストを集約します。デフォルトでは無効で、スティッチに cache が設定された場合にのみ stitchapi/cache から遅延読み込みされます。キーは解決済みのリクエストから導出されるため、呼び出し側で作成するキーのドリフトを防げます。また、デフォルトでプリンシパルごとに分離されるため、ユーザーAにユーザーBのキャッシュ済みレスポンスが返されることはありません。
const getUser = stitch({
path: 'https://api.example.com/users/{id}',
output: User,
pick: 'data',
cache: '5m',
});
const listAnnouncements = stitch({
path: 'https://api.example.com/announcements',
output: z.array(z.object({ id: z.number(), title: z.string() })),
pick: 'data',
cache: {
ttl: '1h',
tenancy: 'app',
vary: ['accept-language'],
entries: 500,
fingerprint: 1, // pins the shape — cacheable without a fingerprinter
},
});
キャッシュは設計上、安全です。output スキーマを持つスティッチでは、そのスキーマのフィンガープリントを計算できる場合、または fingerprint タグを固定した場合にのみキャッシュします。それ以外の場合、古い形状のデータを返すのではなく、キャッシュを拒否します。機密データには sensitive: true を設定して、キャッシュを完全に無効にしてください。
境界としての認証
認証はスティッチのフィールドであり、グローバル設定ではありません。シークレットは呼び出し時(env()、credential.file())に解決され、宣言はコミット可能で、呼び出し側は認証情報を見ることなくデータを取得できます。
import { stitch } from 'stitchapi';
import { bearer, env } from 'stitchapi/auth';
const getUser = stitch({
path: 'https://api.example.com/users/{id}',
auth: bearer(env('API_TOKEN')), // resolved per call; the caller passes no secret
});
bearer、apiKey、basic はヘッダー方式です。oauth2() はクライアントクレデンシャルグラントを実行し、トークンをキャッシュして更新します。cookieSession はログインを実行してCookieを取得し、それを再送信します。また、セッションの期限が切れると再ログインします。呼び出し側がパスワードを見ることも、Cookieをやり取りする処理を書くこともありません。詳細なガイド:認証。
サーフェス:あらゆるリクエスト形式
サーフェスとは、stitch が扱うリクエストの 形式 です。デフォルトは http で、その他は同じエンジン上で対等なサーフェスです。auth、retry、throttle、timeout、バリデーション、イベントストリームは、どのサーフェスとも組み合わせられます。それぞれが独立したサブパスからインポートされるため、import { stitch } では http のみが読み込まれます。
| サーフェス | インポート | 形式 | await の戻り値 |
|---|---|---|---|
http | stitch (デフォルト) | JSON over HTTP の呼び出し | バリデーション済みの本文 |
graphql | stitchapi/graphql | POST { query, variables }、data を取得 | data ペイロード |
sse | stitchapi/sse | text/event-stream リーダー(fetch 経由) | 解析済みの各イベントを収集 |
stream | stitchapi/stream | 生の ReadableStream リーダー | デコード済みの各チャンクを収集 |
download | stitchapi/download | バッファリングされたバイナリ GET | { blob, filename } |
llm | stitchapi/llm | プロバイダーコントラクトを介したチャット補完 | 正規化された { text, … } |
shell | @stitchapi/shell (ピアパッケージ) | ローカルコマンド、引数+stdin | コマンドの stdout |
postmessage | stitchapi/postmessage | 型付き iframe ↔ 親間の RPC/イベント呼び出し | 型付き RPC レスポンス |
詳細ガイド:サーフェス。
4 つの呼び出し方法
同じ型付きユニットには 4 つの方法でアクセスできるため、人間もエージェントも、まったく同じバリデーション済みで観測可能な処理を呼び出せます。
| 呼び出し方法 | 方法 | 例 |
|---|---|---|
| プロセス内関数 | インポートして呼び出す | await listUsers() |
| CLI コマンド | stitch run | $ stitch run listUsers |
| HTTP エンドポイント | stitch serve | POST /stitch/listUsers |
| MCP/エージェントツール | stitch mcp | run_stitch { "name": "listUsers" } |
関数以外の 3 つの呼び出し方法では、stitch のエクスポート名で指定します。この名前は、list_stitches と GET / が一覧表示する名前と同じです。
stitch run はすべてのイベントを stdout に 1 行 1 件の JSON としてストリーム出力するため(jq ですぐに処理できます)。stitch trace は実行ログの概要として、実行、失敗、再試行、ドリフト、レイテンシのパーセンタイルを表示します。詳細ガイド:サーフェス → CLI。
エージェントネイティブ
stitch は AI エージェントから呼び出されることを前提に構築されています。認証情報は stitch に紐付けられるため、エージェントが得るのは認証情報ではなく、機能です。また、エンドポイントごとに MCP ツールを 1 つ用意するのではなく(モデルのコンテキストがあふれるため)、エージェントは単一のコードモードツール run_stitch を操作します。このツールは stitchapi をインポートして stitch を呼び出す短い TypeScript スニペットを記述します。list_stitches と describe_stitch による検出機能も備えているため、カタログが拡大してもコンテキストの使用量は一定に保たれます。
エージェントにとって作成も簡単です。curl/HAR/ドキュメントの例を 1 つエージェントに渡すと、stitch 宣言が生成されます。よくあるケースには、決定論的なショートカットも用意されています。
$ stitch from-curl 'curl https://api.example.com/users/7 -H "authorization: Bearer …"'
# prints a ready-to-commit stitch: id-like segments lifted to {params}, secrets → env()
stitch init は、「fetch を手書きせず、stitch を宣言する」というルールを、コーディングエージェントが読むファイル(AGENTS.md、Cursor/Windsurf/Cline のルール、CLAUDE.md のセクション)に書き込みます。また、ドキュメントのビルド時に、自動生成される llms.txt も出力されます。詳細ガイド:エージェントからの利用。
エラーと注意点
ステッチに失敗すると、.status、.attempts、および(レスポンスエラーの場合は).body(解析済みのエラーペイロード。トレースシンクには決して送られない、列挙不可のチャネル上にあります)と .url を持つ Error のサブクラス、StitchError がスローされます。分岐したい場合は、.safe() を使うと { ok, data, error } が返されます。.status と .attempts(および instanceof RateLimitError)で分岐してください。以下の STITCH_* 名はドキュメント上の ID であり、実行時の値ではないため、照合する error.code はありません。
| カタログ ID | 該当する状況 |
|---|---|
STITCH_VALIDATION | レスポンスが出力スキーマに適合しなかった場合 |
STITCH_DRIFT | レスポンスのドリフトが許容したレベルを超えた場合 |
STITCH_AUTH_WALL | 認証に失敗した場合、またはソフトな 200 のログイン画面を再読み込みできなかった場合 |
STITCH_TIMEOUT | 呼び出しがタイムアウト予算を超過した場合 |
STITCH_CIRCUIT_OPEN | 繰り返し失敗した結果、サーキットブレーカーがオープン状態になった場合 |
STITCH_GRAPHQL | GraphQL レスポンスが 200 で返されたものの、errors 配列を含んでいた場合 |
RateLimitError | デリゲートバックオフを使うステッチで、外側のゲートにレート制限が表面化した場合 |
カタログ全体:エラーと注意点。
インフラ不要の可観測性
可観測性はイベントストリームの利用者であり、独立したシステムではありません。また、デフォルトではオフです。ステッチごとに(trace: 'console'/fileSink(path)/TraceSink)、または環境変数でグローバルに有効化できます。コレクターも、ダッシュボードも、デプロイするものも必要ありません。
STITCH_TRACE_CONSOLE=1 node app.js # live, colored, one line per event on stderr
STITCH_TRACE_FILE=./run.jsonl node app.js # append JSONL to a path
STITCH_EXPORT=otlp node app.js # also fan events to an OTLP collector
組み込みシンクはシンクの境界でシークレットをマスキングします(実行中のリクエストには決して触れません)。stitch trace は JSONL を要約します。@stitchapi/pino は同じイベントを構造化ログとして出力します。
パッケージ
このリポジトリは pnpm ワークスペースです。公開ライブラリは stitchapi です。それ以外は、独自の機能を追加しない、依存関係をピアとして持つ薄い統合パッケージです。以下の表は pnpm gen:readme によって生成され(CI では pnpm check:readme によって検証されます)、公開可能なワークスペースパッケージをすべて一覧表示するため、パッケージが追加されても内容が古くなりません。各パッケージの README から npm 上のページにリンクしています。
| パッケージ | 説明 |
|---|---|
| コア | |
stitchapi | あらゆる API を型安全で回復力のある関数に変換します |
| サーバーフレームワーク | |
@stitchapi/elysia | コンテキスト上の Web 標準のシーム。SSE とエラーマッピングに対応します |
@stitchapi/express | req 上のリクエストスコープのシーム。SSE とエラーマッピングに対応します |
@stitchapi/fastify | アプリ/リクエストのシーム。SSE、エラー、Pino ロガーのブリッジに対応します |
@stitchapi/hono | リクエストコンテキスト上のエッジ対応シーム。SSE とエラーに対応します |
@stitchapi/nest | Nest の DI グラフに接続されたインジェクション可能な Stitch |
@stitchapi/next | App Router で Stitch を SSE Response としてストリーミングします |
| クライアントと UI バインディング | |
@stitchapi/angular | Stitch のライフサイクルを Angular シグナルと RxJS オブザーバブルとして提供します |
@stitchapi/expo | セキュアストアのトークンストアを使い、expo/fetch 経由でストリーミングします |
@stitchapi/query-core | UI バインディングを支えるフレームワーク非依存のリアクティブストア |
@stitchapi/react | ティアリングのない useStitch / useStitchStream フック |
@stitchapi/react-native | ストリーミング対応の XHR アダプターと AsyncStorage ベースのストア |
@stitchapi/solid | createStitch プリミティブを Solid ストアに調整して取り込みます |
@stitchapi/svelte | Svelte 4 と 5 向けの Stitch ストア(一方向+ストリーミング) |
@stitchapi/vue | リアクティブな useStitch / useStitchStream コンポーザブル |
| データ取得ライブラリ | |
@stitchapi/rtk-query | ストリーム更新に対応し、Stitch を RTK Query エンドポイントとして実行します |
@stitchapi/swr | Stitch を SWR フェッチャーとして実行し、キャッシュは SWR が管理します |
| 状態ストア | |
@stitchapi/cloudflare-kv | Workers KV によるエッジキャッシュと共有セッション |
@stitchapi/deno-kv | Deno KV による分散スロットリングとセッション |
@stitchapi/redis | Redis による分散スロットリングと共有セッション |
| 認証 | |
@stitchapi/aws-sigv4 | AWS SigV4 でリクエストに署名します(エッジ対応の Web Crypto) |
| AI | |
@stitchapi/vercel-ai | 認証情報を安全に保ちながら、Stitch をモデルから呼び出し可能なツールとして公開します |
| オブザーバビリティ | |
@stitchapi/pino | Stitch のイベントストリームを構造化された Pino ログとして出力します |
@stitchapi/sentry | エラーのキャプチャに対応し、Stitch のイベントを Sentry のブレッドクラムとして記録します |
| サーフェス | |
@stitchapi/shell | 静的なローカルコマンドを Stitch として実行します(インジェクションを防止) |
| キャッシュフィンガープリントアダプター | |
@stitchapi/fingerprint-arktype | ArkType スキーマ向けのキャッシュフィンガープリント戦略 |
@stitchapi/fingerprint-effect | Effect Schema 向けのキャッシュフィンガープリント戦略 |
@stitchapi/fingerprint-typebox | TypeBox スキーマ向けのキャッシュフィンガープリント戦略 |
@stitchapi/fingerprint-valibot | Valibot スキーマ向けのキャッシュフィンガープリント戦略 |
@stitchapi/fingerprint-zod | Zod スキーマ向けのキャッシュフィンガープリント戦略 |
| その他 | |
@stitchapi/docs-mcp | MCP stdio 経由でローカル実行する StitchAPI ドキュメント検索 |
@stitchapi/json-schema | 実行時に検出された JSON Schema を、StitchAPI が受け入れる Standard Schema バリデーターに変換します |
@stitchapi/openapi | OpenAPI ドキュメントから選択したオペレーションを切り出し、そのまま所有できる StitchAPI ソースとして生成します |
ドキュメントサイトの全内容は stitchapi.dev にあります。クイックスタート、機能ごとのガイド、概念、サーフェス、エージェント向け、および生成されたリファレンスをご覧ください。
公開ライブラリ自体の README(npm に表示されるもの)は packages/core/README.md にあります。設計ノートは docs/ にあります:Feature Lenses、概要、設計。
コントリビューション
ローカル環境のセットアップ、開発ループ、バンドルサイズの予算、worktree と PR のワークフローについては CONTRIBUTING.md に記載されています。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。