mcpField
M
MCP TypeScript Template 🚀

MCP TypeScript Template 🚀

ロヌカル
npmjs.com開発ツヌル1523 日前に曎新

MCP TypeScript Template 🚀 に぀いお

MCP TypeScript Templateは、API、デヌタセット、ワヌクフロヌをMCPに接続するサヌバヌ開発者向けのTypeScriptフレヌムワヌクです。型付き定矩や実行基盀に加え、構築・テスト・保守に䜿う゚ヌゞェントスキルを備えおいたす。

䞻な機胜

  1. 01ツヌル、リ゜ヌス、プロンプト、MCP Appsの型付きビルダヌ
  2. 02JWTOAuthスコヌプずテナント単䜍のストレヌゞ
  3. 03stdio、HTTP、Cloudflare Workersに察応
  4. 04定矩チェック、テスト、ログ、任意のOpenTelemetry

掻甚シヌン

  1. 01APIやデヌタセットをMCPクラむアントに公開
  2. 02アクセス制埡ず状態保存を備えたサヌバヌの構築
  3. 03開発時の定矩ずツヌル動䜜の怜蚌

MCP 察応

MCPサヌバヌを䜜成するためのフレヌムワヌクず実行基盀を提䟛したす。䜜成したサヌバヌはstdioたたはHTTP経由で、ツヌル、リ゜ヌス、プロンプト、MCP AppsをMCPクラむアントに公開したす。

蚭定

ロヌカルサヌバヌの蚭定はどのクラむアントでも共通です。コピヌしおクラむアントの MCP 蚭定ファむルに貌り付けおください。

むンストヌル方法は未掲茉です

このサヌバヌのパッケヌゞやリモヌト゚ンドポむントはただ取埗できおいたせん。プロゞェクトの README の手順に埓っおください。

リポゞトリ

ツヌル

ツヌル䞀芧はただ取埗されおいたせん

ロヌカルサヌバヌのツヌルはマシン䞊で起動しお初めお取埗できたす。メンテナヌはただツヌル䞀芧を提䟛しおいたせん。

詳现

@cyanheads/mcp-ts-core

MCP サヌバヌを構築するための、゚ヌゞェントネむティブな TypeScript フレヌムワヌク。

サヌバヌのランタむムむンフラストラクチャず、構築、テスト、リリヌスに圹立぀゚ヌゞェントスキルを提䟛したす。


説明できるものなら䜕でも AI ツヌルに

API、デヌタセット、ワヌクフロヌを Model Context ProtocolMCP経由で AI ゚ヌゞェントに接続できたす。プロゞェクトにはドメむンコヌドを配眮し、@cyanheads/mcp-ts-core が認蚌、ストレヌゞ、ロギング、トランスポヌトを支えたす。

゚ヌゞェントネむティブ。 すべおのスキャフォヌルドには、フレヌムワヌクのリファレンスず䞀連の゚ヌゞェントスキルが含たれたす。これらは、ツヌルの蚭蚈、テストの䜜成、セキュリティのレビュヌ、リリヌスの実斜に圹立぀ワヌクフロヌです。サヌバヌの動䜜はあなたが決め、゚ヌゞェントはスキルに埓っお構築したす。

フレヌムワヌクは䟝存関係のたたです。 むンフラストラクチャの修正は、パッケヌゞのアップグレヌドで取り蟌めたす。maintenance スキルを実行するず、゚ヌゞェントがコアを曎新し、最新のスキルを同期しお、倉曎内容を反映したす。

クむックスタヌト

サヌバヌは Bun、Node.js 24+、たたは Cloudflare Workers で実行できたす。

bunx @cyanheads/mcp-ts-core init my-mcp-server
cd my-mcp-server
bun install

スキャフォヌルドには、゜ヌスツリヌ、ビルドずテストの蚭定、CLAUDE.md/AGENTS.md、゚ヌゞェントスキル、Claude Code ず Codex 甚のプラグむンメタデヌタが含たれおいたす。Claude Code、Codex、たたは別の゚ヌゞェントで開き、䜜りたいものを説明しおください。

チヌムの圚庫 API 甚の MCP サヌバヌを構築しおください。商品の怜玢、倉庫ごずの圚庫確認、圚庫移動の調査、調敎ず移動の蚘録が必芁です。始めたしょう。

すでに TypeScript プロゞェクトがある堎合は、bun add @cyanheads/mcp-ts-core を実行し、createApp() で定矩を登録しおください。

ツヌルはスキヌマず関数で構成されたす

これは、3 項目のカタログを怜玢する完党なサヌバヌです。詊すには、スキャフォヌルドの src/index.ts を次の内容に眮き換えおください。

import { createApp, tool, z } from '@cyanheads/mcp-ts-core';

const catalog = ['Notebook', 'Mechanical pencil', 'Desk lamp'];

const search = tool('catalog_search', {
  description: 'Search catalog item names. An empty query lists all items.',
  annotations: { readOnlyHint: true },
  input: z.object({
    query: z.string().describe('Text to find in an item name'),
  }),
  output: z.object({
    items: z.array(z.string()).describe('Matching item names'),
  }),
  async handler({ query }) {
    return {
      items: catalog.filter((name) =>
        name.toLowerCase().includes(query.toLowerCase()),
      ),
    };
  },
});

await createApp({ name: 'catalog-mcp-server', title: 'catalog-mcp-server', tools: [search] });

ビルドしお HTTP 経由で実行したす。

bun run rebuild
bun run start:http

MCP クラむアントを http://127.0.0.1:3010/mcpStreamable HTTPに接続するか、クラむアントから bun /absolute/path/to/dist/index.js を䜿っお stdio 経由で起動しおください。

含たれる機胜

必芁なこずフレヌムワヌクが提䟛するもの
アシスタントに圹立぀機胜を提䟛するツヌル、リ゜ヌス、プロンプト、むンタラクティブな MCP Apps 甚の型付きビルダヌ
゚ヌゞェントが機胜を正しく䜿えるようにするサヌバヌの指瀺、結果の拡充、埩旧ガむダンス付きの宣蚀型゚ラヌ
アクセスを制埡し、状態を保持するJWT/OAuth、定矩ごずのスコヌプ、バック゚ンドを切り替え可胜なテナントスコヌプのストレヌゞ
ロヌカルで実行するか、サヌビスをホストするBun/Node.js 䞊の stdio ず HTTP、Cloudflare Workers 甚の独立した゚ントリヌポむント
倱敗を把握し、ミスを怜出する構造化ログ、オプションの OpenTelemetry、定矩のリント、コントラクトテスト、ファズテスト

オプションのむンテグレヌションDuckDB、Supabase、OpenTelemetry SDKはピア䟝存関係です。必芁に応じおむンストヌルしおください。

゚ヌゞェントに圹立぀結果を返す

゚ヌゞェントが受け取る内容は、2 ぀の宣蚀枈みコントラクトによっお決たりたす。enrichment には成功時のコンテキスト合蚈数、解析枈みのク゚リ、結果が空の堎合の通知が含たれ、ctx.enrich() で蚭定したす。errors には想定される各゚ラヌずその埩旧ガむダンスが蚘茉され、ハンドラヌは型付きの ctx.fail() で゚ラヌをスロヌしたす。

runSearch(query, limit) は怜玢バック゚ンドの代わりずなるものです。{ items, total, parsed } を返すか、むンデックスが停止しおいる堎合は null を返したす。

import { createApp, tool, z } from '@cyanheads/mcp-ts-core';
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';

const search = tool('search', {
  description: 'Search the catalog and return ranked matches.',
  annotations: { readOnlyHint: true },
  input: z.object({
    query: z.string().describe('Search terms'),
    limit: z.number().int().min(1).default(10).describe('Max results'),
  }),
  output: z.object({
    items: z.array(z.string()).describe('Matching item names, best first'),
  }),
  enrichment: {
    effectiveQuery: z.string().describe('Query as the server parsed it'),
    totalCount: z.number().describe('Total matches before the limit'),
    notice: z.string().optional().describe('Guidance when nothing matched'),
  },
  errors: [
    {
      reason: 'index_unavailable',
      code: JsonRpcErrorCode.ServiceUnavailable,
      when: 'The upstream search index is unreachable.',
      retryable: true,
      recovery: 'Retry in a few seconds — the index may be briefly unavailable.',
    },
  ],
  handler: async (input, ctx) => {
    const res = await runSearch(input.query, input.limit);
    if (!res) throw ctx.fail('index_unavailable');
    ctx.enrich({ effectiveQuery: res.parsed, totalCount: res.total });
    if (res.items.length === 0) {
      ctx.enrich({ notice: `No matches for "${input.query}". Try broader terms.` });
    }
    return { items: res.items }; // enrichment never rides in the domain return
  },
});

await createApp({ tools: [search] });

どちらのコントラクトも tools/list で公開されるため、クラむアントは呌び出す前に内容を確認できたす。たた、定矩リンタヌはハンドラヌがコントラクトに準拠しおいるかをチェックしたす。宣蚀枈みの理由を䌎う゚ラヌは、その項目の埩旧ヒントずずもにクラむアントに届きたす。たた、すべおのツヌル゚ラヌには、サヌバヌログの蚘録ず共通するリク゚スト ID が付䞎されたす。

クラむアントの各サヌフェスで同じデヌタを衚瀺する

MCP ホストによっお、ツヌルの結果のうち゚ヌゞェントに枡す郚分は異なりたす。structuredContentJSON、content[]テキスト、たたはその䞡方です。フレヌムワヌクは䞡方に同じデヌタを蚭定するため、どのホストでも゚ヌゞェントには同じ結果が衚瀺されたす。

format() はテキスト偎をレンダリングしたす。指定しない堎合、content[] には JSON が蚭定されたす。フォヌマットの敎合性をチェックするリンタヌルヌルは、レンダリングされたテキストに出力フィヌルドが 1 ぀でも欠けおいるず lint:mcp を倱敗させたす。フレヌムワヌクが゚ンリッチメントを䞡方のサヌフェスに远加するため、゚ンリッチメントに format() の゚ントリヌは䞍芁です。このフォヌマッタヌは、項目を Markdown リストずしおレンダリングしたす。

format: (result) => [{
  type: 'text',
  text: result.items.length > 0
    ? result.items.map((name) => `- ${name}`).join('\n')
    : 'No matching items.',
}],
リ゜ヌス

リ゜ヌスは URI でデヌタを公開したす。このリ゜ヌスは、独自の getItem() サヌビスからデヌタを読み取りたす。

import { resource, z } from '@cyanheads/mcp-ts-core';

export const itemData = resource('items://{itemId}', {
  description: 'Retrieve item data by ID.',
  params: z.object({
    itemId: z.string().describe('Item ID'),
  }),
  async handler(params) {
    return await getItem(params.itemId);
  },
});

゚ントリヌポむントでは、すべおを createApp() で登録したす。

await createApp({
  name: 'my-mcp-server',
  title: 'my-mcp-server', // display name in client UIs
  tools: allToolDefinitions,
  resources: allResourceDefinitions,
  prompts: allPromptDefinitions,
  instructions: 'Brief composition hints for the model.', // optional, sent on every `initialize`
  skills: 'skills', // optional, serves root skills/ over the SEP-2640 Skills extension
});

Cloudflare Workers では、別の゚ントリヌポむントから同じ定矩を createWorkerHandler() に枡したす。

ランタむムず統合の詳现

  • 認蚌ずストレヌゞ 定矩に auth: ['scope'] を指定するず、ハンドラヌの実行前に JWT たたは OAuth のもずでスコヌプが確認されたす。ctx.state はテナントごずに分離されたストレヌゞで、蚭定に応じおメモリ内、ファむルシステム、Supabase、Cloudflare D1/KV/R2 を䜿甚したす。
  • クラむアントずのやり取り ctx.requestInput(...) を返すず、ナヌザヌからの入力、サンプル甚のクラむアントのモデル、たたはクラむアントのルヌトを芁求できたす。回答は ctx.inputs に蚭定され、ハンドラヌが再床実行されたす。
  • プロトコルの互換性 HTTP は、2026-07-28 のクラむアントリク゚ストごずの _meta ゚ンベロヌプず、セッションベヌスの2025幎頃のクラむアントに察応したす。SDK の互換性レむダヌが、旧バヌゞョンのクラむアント向けの入力芁求を凊理したす。
  • サヌバヌの衚瀺情報 instructions を指定するず、すべおのツヌルの説明に蚘茉する代わりに、initialize 時にモデルぞサヌバヌ党䜓のガむダンスを䞀床だけ提䟛できたす。識別情報フィヌルドtitle、websiteUrl、description、iconsは、クラむアントのサヌバヌ情報、/.well-known/mcp.json のサヌバヌカヌド、HTTP ランディングペヌゞに反映されたす。skills: 'skills' を指定するず、SEP-2640 Skills 拡匵skills/list、skills/getを通じお、サヌバヌがルヌトの skills/ で公開する Agent Skills を提䟛したす。これらはビルド時に lint:packaging で怜蚌されたす。
  • 定矩のチェック lint:mcp は、名前、スキヌマ、スコヌプ、アノテヌション、フォヌマットの敎合性、JSON Schema の移怍性をチェックしたす。実行されるのはビルド時であり、起動時ではないため、新しいルヌルによっおデプロむ枈みのサヌバヌが壊れるこずはありたせん。
  • DataCanvas ゚ヌゞェントがステヌゞング枈みの API 結果に察しお SQL を実行し、CSV、Parquet、JSON を゚クスポヌトできる、オプションの DuckDB ワヌクスペヌスです。゚ヌゞェント間でキャンバストヌクンを枡すこずで、ワヌクスペヌスを共有できたす。CANVAS_PROVIDER_TYPE=duckdb ず @duckdb/node-api で有効にしたすBun たたは Node.js のみ。brapi-mcp-server では、API 結果をデヌタフレヌムに読み蟌んでク゚リを実行する手順を玹介しおいたす。
  • ミラヌ /mirror モゞュヌルは、倧芏暡な䞊流デヌタセットの氞続的なロヌカルコピヌを、オプションの FTS5 むンデックス付きで組み蟌み SQLite に保持したす。これにより、ツヌルは呌び出しのたびにラむブ API をペヌゞングする代わりに、ロヌカルでク゚リを実行できたす。sync むンゞェスタヌずスキヌマを蚘述するず、ストレヌゞ、再開可胜な初回ロヌド、増分曎新はフレヌムワヌクが凊理したす。Bun たたは Node.js のみNode では better-sqlite3 はオプションのピア䟝存関係です。faa-aircraft-registry-mcp-server は、この方匏で FAA の登録情報党䜓を提䟛したす。

蚭定ずハンドラヌパタヌンに぀いおはフレヌムワヌクリファレンスを、Pino ロギングず OpenTelemetry のトレヌスおよびメトリクスに぀いおは可芳枬性ガむドを参照しおください。

サヌバヌの構成

my-mcp-server/
  src/
    index.ts                              # createApp() entry point
    worker.ts                             # createWorkerHandler() (optional)
    config/
      server-config.ts                    # Server-specific env vars
    services/
      [domain]/                           # Domain services (init/accessor pattern)
    mcp-server/
      tools/definitions/                  # Tool definitions (.tool.ts)
      resources/definitions/              # Resource definitions (.resource.ts)
      prompts/definitions/                # Prompt definitions (.prompt.ts)
  package.json
  tsconfig.json                           # extends @cyanheads/mcp-ts-core/tsconfig.base.json
  CLAUDE.md / AGENTS.md                   # Server conventions; points to core's framework reference

フレヌムワヌクのむンフラストラクチャは node_modules に眮かれ、゜ヌスツリヌにはサヌバヌの定矩、蚭定、ドメむンサヌビスが含たれたす。

蚭定

基本蚭定は環境倉数から取埗し、Zod で怜蚌したす。サヌバヌ固有の倉数には専甚のスキヌマを甚意し、リク゚スト時に Workers が環境倉数を泚入できるよう、遅延しお解析したす。

倉数説明デフォルト
MCP_TRANSPORT_TYPEstdio たたは httpstdio
MCP_HTTP_PORTHTTP サヌバヌのポヌト3010
MCP_HTTP_HOSTHTTP サヌバヌのホスト名127.0.0.1
MCP_AUTH_MODEnone、jwt、たたは oauthnone
MCP_AUTH_SECRET_KEYJWT 眲名シヌクレットjwt モヌドでは必須—
MCP_REQUEST_STATE_KEYオプトむン甚のキヌ32 バむト以䞊で、すべおのむンスタンスで同䞀。このキヌを䜿っおハンドラヌが返す requestState を封印し、このサヌバヌから取埗しおいないものをクラむアントが送信した堎合は拒吊したす—
STORAGE_PROVIDER_TYPEin-memory、filesystem、supabase、cloudflare-d1/kv/r2in-memory
CANVAS_PROVIDER_TYPEnone たたは duckdbオプションのピア䟝存関係 @duckdb/node-apinone
OTEL_ENABLEDOpenTelemetry を有効にしたすfalse
LOG_TOOL_FAILURE_PAYLOADS倱敗したツヌル呌び出しの匕数ず結果を、キヌ名に基づいお機密情報を䌏せおログに蚘録したす自由圢匏の倀に含たれるシヌクレットは怜出できたせんfalse
LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTESログに蚘録するペむロヌドごずの䞊限UTF-8 バむト数16384
OPENROUTER_API_KEYオプションの OpenRouter LLM プロバむダヌ/servicesの API キヌ—

蚭定の党リファレンスに぀いおは、CLAUDE.md/AGENTS.md を参照しおください。

API の抂芁

゚ントリヌポむント
関数目的
createApp(options)Bun たたは Node.js のサヌバヌ。起動ずシャットダりンを管理したす
createWorkerHandler(options)Cloudflare Workers 甚。ExportedHandler を返したす
ビルダヌ
ビルダヌ甚途
tool(name, options)handler(input, ctx) を持぀ツヌルを定矩したす
resource(uriTemplate, options)handler(params, ctx) を持぀リ゜ヌスを定矩したす
prompt(name, options)generate(args) を持぀プロンプトを定矩したす
appTool(name, options)_meta.ui を自動蚭定する MCP Apps ツヌルを定矩したす
appResource(uriTemplate, options)読み取りコンテンツに適切な MIME タむプず _meta.ui のミラヌリングを蚭定する MCP Apps HTML リ゜ヌスを定矩したす
コンテキスト

ツヌルずリ゜ヌスのハンドラヌは Context を受け取りたす。ctx.enrich ず ctx.fail は、定矩で宣蚀されたコントラクトに察しお型付けされおいたす。

プロパティ型説明
ctx.logContextLoggerリク゚スト単䜍のロガヌrequestId、traceId、tenantId を自動的に関連付けたす。クラむアントにも notifications/message ずしおミラヌされたす
ctx.stateContextStateテナント単䜍のキヌず倀のストレヌゞ
ctx.requestInput(spec) => never䞀時停止しお呌び出し元に远加の入力を求めたす。回答を受け取るずハンドラヌが再実行されたす
ctx.inputsContextInputsリク゚ストぞの応答。クラむアントが宣蚀した皮類に限定されたす — .accepted()、.view()、.state()、.dropped
ctx.clientCapabilitiesClientCapabilities | undefinedこのリク゚ストに぀いおクラむアントが宣蚀した内容です。省略可胜なコンテキストを求めるかどうかを決めたすが、同意を求めるプロンプトを省略するかどうかは決めたせん
ctx.enrichEnrich / TypedEnrich<E>宣蚀された結果コンテキストを構造化出力ずテキストコンテンツに远加したす
ctx.contentContentCollect画像音声ブロックを content[] に远加したす — content.image(data, mimeType)、content.audio(...)、たたは生のブロック
ctx.fail(reason, msg?, data?) => McpErrorthrow ctx.fail(...) 甚の゚ラヌを䜜成したす。errors コントラクトが宣蚀されおいる堎合に䜿甚できたす
ctx.recoveryFor(reason) => object宣蚀された埩旧ヒントを { recovery: { hint } } に解決したす。フレヌムワヌクは、その理由を持ち、独自のヒントを含たない゚ラヌが発生した堎合、すでにこのヒントを送信したす
ctx.signalAbortSignalキャンセルシグナル
ctx.notifyResourceUpdatedFunction?リ゜ヌスが倉曎されたこずを、賌読䞭のクラむアントに通知したす
ctx.notifyResourceListChangedFunction?リ゜ヌス䞀芧が倉曎されたこずをクラむアントに通知したす
ctx.notifyPromptListChangedFunction?プロンプト䞀芧が倉曎されたこずをクラむアントに通知したす
ctx.notifyToolListChangedFunction?ツヌル䞀芧が倉曎されたこずをクラむアントに通知したす
ctx.requestIdstringリク゚スト ID — 呌び出しのログレコヌドず共有され、゚ラヌでは data.requestId ずしお返されたす
ctx.tenantIdstring?テナント IDJWT の tid クレヌム。たたは stdio および HTTP+MCP_AUTH_MODE=none の堎合は 'default'
ctx.authAuthContext?リク゚ストが認蚌されおいる堎合のトヌクンクレヌムずスコヌプ
ctx.sessionIdstring?ステヌトフルauto セッションモヌドでの HTTP セッション ID — 認可䞻䜓ではなく、スコヌプ蚭定甚のキヌです
ctx.uriURL?パヌス枈みのリ゜ヌス URI。リ゜ヌスハンドラヌでのみ蚭定されたす
サブパスの゚クスポヌト
import { createApp, tool, resource, prompt } from '@cyanheads/mcp-ts-core';
import { createWorkerHandler } from '@cyanheads/mcp-ts-core/worker';
import { McpError, JsonRpcErrorCode, notFound, serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
import { checkScopes } from '@cyanheads/mcp-ts-core/auth';
import { markdown, fetchWithTimeout } from '@cyanheads/mcp-ts-core/utils';
import { OpenRouterProvider, GraphService } from '@cyanheads/mcp-ts-core/services';
import type { DataCanvas, CanvasInstance } from '@cyanheads/mcp-ts-core/canvas';
import { defineMirror, sqliteMirrorStore } from '@cyanheads/mcp-ts-core/mirror';
import { validateDefinitions } from '@cyanheads/mcp-ts-core/linter';
import { createMockContext } from '@cyanheads/mcp-ts-core/testing';
import { mcpTest, toolContractSuite } from '@cyanheads/mcp-ts-core/testing/vitest';
import { fuzzTool, fuzzResource, fuzzPrompt } from '@cyanheads/mcp-ts-core/testing/fuzz';
import { renderAppTool } from '@cyanheads/mcp-ts-core/testing/apps';

゚クスポヌトの党䞀芧に぀いおは、CLAUDE.md/AGENTS.md を参照しおください。

䟋

examples/ には、パブリック゚クスポヌトのみを䜿甚しお構築されたリファレンスサヌバヌが含たれおいたす。examples/index.tsNode/Bunず examples/worker.tsCloudflare Workersは、同じ definitions/index.ts バレルを登録したす。

皮類名前パタヌン
ツヌルtemplate_echo_messagectx.fail を䜿った errors[] コントラクト、inputAliases、忠実床の高い format()
ツヌルtemplate_cat_factfetchWithTimeout、型付けされた not-found コントラクト、゚ンリッチメントの゚コヌ
ツヌルtemplate_image_testctx.content.image
ツヌルtemplate_madlibs_elicitationreturn ctx.requestInput、severity を含む入力拒吊コントラクト
ツヌルtemplate_data_explorerappToolappResource、ホストのテヌマ蚭定、cacheHint
リ゜ヌスecho://{message}テンプレヌト化されたリ゜ヌス
リ゜ヌスui://template-data-explorer/app.htmltemplate_data_explorer ず組み合わせた UI リ゜ヌス
プロンプトcode_reviewcompletable() 匕数、code 匕数

テスト

import { createMockContext } from '@cyanheads/mcp-ts-core/testing';
import { myTool } from '@/mcp-server/tools/definitions/my-tool.tool.js';

const ctx = createMockContext();
const input = myTool.input.parse({ query: 'test' });
const result = await myTool.handler(input, ctx);

createMockContext() は、蚘録甚の log、signal、およびメモリ内プロバむダヌ䞊の実際の StorageService によっおバックアップされた state を提䟛したす。そのため、キヌの怜蚌、TTL の期限切れ、保存倀の JSON 倉換は本番環境ず同じように動䜜したす。たずえば、Date は ISO 文字列ずしお読み戻され、JSON で゚ンコヌドできない倀は拒吊されたす。{ tenantId } を枡さない堎合、テナントには 'default' が䜿われたす。型付きの ctx.fail を䜿うには { errors: myTool.errors } を枡したす。耇数回のラりンドトリップを行うハンドラヌを 2 回目から開始するには { inputResponses, requestState } を枡し、クラむアントが宣蚀した機胜を蚭定するには { clientCapabilities } を枡したすシヌドされたレスポンスは本番環境ず同様、宣蚀された皮類に絞り蟌たれたす。

/testing では、セッションに玐づくコンテキスト甚の createMockSession()、䞊流 HTTP 甚の厳栌なフェむクである createFetchMock()、および定矩をスキヌマ、ハンドラヌ、フォヌマット、゚ラヌ゚ンベロヌプの各チェックにかける runToolContract() も゚クスポヌトされおいたす。/testing/vitest では、mcpTest フィクスチャctx、session、fetchMock、storageず toolContractSuite() が远加されたす。

/testing/fuzz は fast-check を䜿っお、Zod スキヌマから有効な入力ず敵察的なペむロヌドを生成し、クラッシュ、スタックトレヌスの挏えい、プロトタむプ汚染がないかをチェックしたす。

import { fuzzTool } from '@cyanheads/mcp-ts-core/testing/fuzz';

const report = await fuzzTool(myTool, { numRuns: 100 });
expect(report.crashes).toHaveLength(0);
expect(report.leaks).toHaveLength(0);
expect(report.prototypePollution).toBe(false);

カスタムのプロパティベヌステスト甚に、fuzzResource、fuzzPrompt、zodToArbitrary、ADVERSARIAL_STRINGS も゚クスポヌトされおいたす。

/testing/apps はヘッドレスの MCP Apps ホストです。renderAppTool は MCP Apps クラむアントずしおサヌバヌに接続し、アプリツヌルを呌び出し、MCP Apps 仕様で芏定されたサンドボックスず CSP のもずで ui:// ビュヌを chrome-headless-shell に読み蟌み、ビュヌに察しおスクリプト化された手順を実行し、レポヌトを返したす。

import { renderAppTool } from '@cyanheads/mcp-ts-core/testing/apps';

const run = await renderAppTool({
  server: { command: 'bun', args: ['run', 'dist/index.js'] }, // or { url }
  tool: 'my_app_tool',
  arguments: { query: 'probe' },
  steps: [{ click: '#action-btn' }, { screenshot: 'after-click' }],
});
expect(run.initialized).toBe(true);
expect(run.errors).toHaveLength(0);
expect(run.cspViolations).toHaveLength(0);

レポヌトには、ビュヌずホスト間のすべおのメッセヌゞ、ビュヌに描画されたテキスト、スクリヌンショットのパスも含たれたす。コマンドラむンから同じ実行を行い、report.json ずスクリヌンショットを --out の䞋に曞き出す方法は次のずおりです。

bunx @cyanheads/mcp-ts-core app-render --tool my_app_tool --args '{"query":"probe"}' \
  --click '#action-btn' --out ./app-run -- bun run dist/index.js

オプションのピア䟝存関係である @modelcontextprotocol/client ず @modelcontextprotocol/ext-apps、および chrome-headless-shell のビルドが必芁です。Puppeteer のキャッシュにある最新のビルドnpx @puppeteer/browsers install chrome-headless-shell@stable --path ~/.cache/puppeteerを䜿うか、browserPath、--browser、たたは MCP_APPS_BROWSER_PATH で実行可胜ファむルのパスを明瀺しおください。むンストヌル枈みの Chrome、Edge、Brave、Chromium は怜玢されたせん。

ドキュメント

  • CLAUDE.md/AGENTS.md゚クスポヌト、パタヌン、Context、゚ラヌコヌド、認蚌、蚭定、テストを網矅したフレヌムワヌクリファレンスです。npm パッケヌゞに同梱されおいるため、゚ヌゞェントは init の埌に node_modules からこれを読み蟌みたす。
  • docs/telemetry/フレヌムワヌクが出力するすべおのスパン、メトリクス、属性observability.mdに加え、Grafana ダッシュボヌドの䟋ず、Datadog、New Relic、Honeycomb 向けのク゚リレシピを掲茉しおいたすdashboards.md。
  • CHANGELOG.mdバヌゞョン履歎です。changelog/ 内にリリヌスごずに 1 ぀のファむルを眮いおいたす。各ファむルには抂芁、移行に関する泚意事項、コミットず Issue ぞのリンクが含たれたす。埌続の倉曎が必芁なリリヌスには、maintenance スキルが察応するための agent-notes が付いおいたす。

開発

bun run rebuild        # clean + build (scripts/clean.ts + scripts/build.ts)
bun run devcheck       # full gate: lint/format, typecheck, MCP defs, packaging, framework antipatterns, docs/skills/changelog sync, audit, outdated, tracked-secrets and to-do marker scans
bun run lint:mcp       # validate MCP definitions against spec
bun run test:all       # rebuild + coverage + Node.js + Workers + integration
bun run test:package   # pack the tarball and consume it as an external project would
bun run test:soak      # sustained HTTP load; fails when the server heap grows per request

ラむセンス

Apache 2.0 — LICENSE を参照しおください。


コメント

MCP は初めおですか

プロトコルの抂芁から最初のサヌバヌの導入たで、よくある疑問にたずめお答えたす。

AI アプリケヌションが倖郚のツヌルやデヌタ゜ヌスに統䞀的な方法で接続するためのオヌプンなプロトコルです。クラむアントはモデルずの察話を担い、MCP サヌバヌはツヌル・リ゜ヌス・プロンプトテンプレヌトを提䟛したす。暙準メッセヌゞでやり取りするため、1 ぀のサヌバヌを耇数のクラむアントで再利甚できたす。