mcpField
O
Octonet Mcp

Octonet Mcp

リモート
github.com/apolocineデータベース021 週間前に更新

Octonet Mcp について

Octonet は、単一の ORM スキーマを 11 種類のネットワークプロトコルで公開する Node.js サーバーです。13 種類のデータベースを使うアプリや AI エージェント向けに、マルチテナント認証と RBAC、MCP を含む自動生成インターフェースを提供します。

主な機能

  1. 01単一スキーマを 11 プロトコルで公開
  2. 0213 種類のデータベースに対応
  3. 03CRUD とクエリツールの自動生成
  4. 04マルチテナント API キーと RBAC
  5. 05複数プロジェクトの DB ルーティング

活用シーン

  1. 01MCP 経由で AI エージェントに DB エンティティを公開
  2. 02REST と GraphQL で同じデータを提供
  3. 03プロジェクトを分離された DB に振り分け

MCP 対応

Octonet はスキーマから生成したエンティティツールを MCP エンドポイントで公開します。API キーのスコープでプロジェクト、操作、トランスポートごとにアクセスを制限でき、公開キーのフォールバックは読み取り専用です。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"apolocine-mosta-net": {
"command": "npx",
"args": [
"-y",
"@mostajs/net"
]
}
}
}
起動コマンドnpx -y @mostajs/net

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@mostajs/net2.0.42

ツール

45

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
filterstringいいえJSON フィルターオブジェクト(MongoDB 形式)
limitnumberいいえ返す結果の最大数
skipnumberいいえスキップする結果数
sortstringいいえJSON ソートオブジェクト。例:{"name":1}

詳細

@mostajs/net — Octonet

1つのスキーマ、11種類のトランスポート、13種類のデータベース、マルチテナント認証を標準搭載。 @mostajs エコシステム向けの、スキーマ駆動型マルチプロトコル API サーバーです。Fastify 上に TypeScript で構築され、さまざまな言語からの利用を想定して設計されています(ネイティブ NetClient 14 種類)。

Octonet ロゴ

npm License mcp.so

作者:Dr Hamid MADANI <[email protected]> ホームページ:octonet.amia.fr · mcp.amia.fr


電源ソケットに見立てた Octonet のスタック:@mostajs/orm は 13 種類のデータベースに接続し、@mostajs/net(Octonet)は 11 種類のトランスポートでそれらを再公開します。Data-Plug が両者をつなぎ、NetClient は 18 言語のクライアントに展開され、あらゆる外部アプリから利用できます。

ソケットボード。 @mostajs/orm は 13 種類のデータベースに接続し、Octonet (@mostajs/net)は同じエンティティを 11 種類のトランスポート(REST、 WebSocket、gRPC、MQTT、AMQP など)で再公開します。さらに NetClient が 18 言語の クライアントに展開するため、どのランタイムからでも外部アプリをデータに接続できます。


目次

  1. Octonet とは
  2. 2 クリックで試す(T1 サンドボックス)
  3. 3 段階のオンボーディングモデル
  4. 11 種類のトランスポート
  5. 13 種類のデータベース
  6. マルチテナント認証
  7. 汎用スコープレジストリ
  8. マルチプロジェクト対応
  9. クイックスタート(セルフホスト)
  10. 設定(.env)
  11. API エンドポイントリファレンス
  12. アーキテクチャ
  13. 起動シーケンス
  14. 14 種類の多言語対応 NetClient
  15. 本番環境へのデプロイ(amia.fr)
  16. ライセンス

Octonet とは

Octonet(@mostajs/net)は、単一の @mostajs/orm スキーマを 11 種類のネットワークプロトコルとして同時に公開する、Node.js のマルチトランスポートサーバーです:REST、GraphQL、WebSocket、SSE、JSON-RPC、MCP、gRPC、tRPC、OData、NATS、Arrow Flight。

同じ User エンティティには、次のようにアクセスできます:

curl https://octonet.amia.fr/api/v1/User              # REST
curl https://octonet.amia.fr/graphql -d '{"query":...}'  # GraphQL
wscat -c wss://octonet.amia.fr/ws                     # WebSocket
curl -N https://octonet.amia.fr/mcp                   # MCP (Claude Desktop)
# … 7 more

@mostajs/orm(13 種類の SGBD 方言)を基盤としています。マルチテナントの ID 管理には @mostajs/rbac、@mostajs/auth、@mostajs/api-keys を使用します。マルチプロジェクトのルーティングには @mostajs/mproject を使用します。

Octonet は @mostajs 三部作の 第 2 の中枢です:

  • #1 — @mostajs/orm:データ永続化(13 種類のデータベース)
  • #2 — Octonet:マルチプロトコルトランスポート(11 種類のワイヤープロトコル)
  • #3 — 多言語対応 NetClients:ネイティブクライアントライブラリ 14 種類(Java、.NET、Python、Go、Swift、Kotlin、Dart、Rust、PHP、Ruby、Elixir、Lua、Delphi、Unity)

2 クリックで試す(T1 サンドボックス)

14 種類のランタイムのいずれからでも、Octonet を最速で試す方法:

  1. https://octonet.amia.fr/try を開きます
  2. エイリアスを選択します(例:alice-42)
  3. サンドボックス専用のスコープが設定された apikey を取得します
curl -X POST https://octonet.amia.fr/try \
  -H "Content-Type: application/json" \
  -d '{"alias":"alice-42"}'

# Response:
{
  "status": "ok",
  "data": {
    "alias": "alice-42",
    "projectSlug": "sandbox-alice-42",
    "apiKey": "sk_test_…(64 chars, shown ONCE)",
    "permissions": { "projects":["sandbox-alice-42"], "operations":["read","write"], "transports":["rest","mcp"] },
    "expiresAt": "2026-05-02T18:38:19.920Z",
    "quota": { "reqPerDay": 500 },
    "exampleCurl": "curl https://octonet.amia.fr/api/v1/sandbox-alice-42/User -H \"X-API-Key: sk_test_…\"",
    "mcpUrl": "https://octonet.amia.fr/mcp"
  }
}

サンドボックスの内容:

  • 他のエイリアスから分離されたプライベートな SQLite ファイル
  • User、Product、Order エンティティが事前に登録されています
  • REST と MCP 経由で読み書き可能な CRUD
  • 1 日あたり 500 リクエストの上限
  • TTL は 7 日(アイドル状態の場合は自動削除)
  • 無料、メールアドレス不要、不正利用防止のレート制限あり(IP あたり 1 時間に 10 個のサンドボックス)

apikey は 14 種類の NetClient のいずれでも使用できます:

# Java / .NET / Python / Go / etc.
export MOSTAJS_NET_URL=https://octonet.amia.fr
export MOSTAJS_NET_API_KEY=sk_test_…

3 層オンボーディングモデル

層対象認証クォータユースケース
T1 — パブリックサンドボックス /try「10 分で試してみたい」エイリアスのみ(メールアドレス不要)500 リクエスト/日、TTL 7 日NetClients のデモ、統合テスト
T2 — 登録済みアカウント octocloud.amia.fr「実際に使いたい。無料で」メールアドレス+パスワード10,000 リクエスト/日個人用アプリ、サイドプロジェクト
T3 — セルフホスト npx @mostajs/net init「データを自分の手元に置きたい」ローカル管理者なしエンタープライズ、オンプレミス、AGPL

11 種類のトランスポート

登録済みスキーマから自動生成されます。環境変数で個別に切り替えられます(デフォルトではすべて有効)。

#トランスポートエンドポイントユースケース備考
1REST/api/v1/{Entity} · /api/v1/{project}/{Entity}汎用エンティティごとに 15 個のルート(CRUD + count + search + aggregate + bulk + relations)
2GraphQL/graphql (POST)高機能なフロントエンドmercurius 経由でスキーマと GraphiQL IDE を自動生成
3WebSocketwss://…/wsリアルタイムイベント entity.created/updated/deleted/upserted をブロードキャスト
4SSE/events (GET stream)モバイル/ブラウザー対応サーバー送信イベント
5JSON-RPC/rpc (POST)EVM 隣接、従来型JSON-RPC 2.0 + メソッド検出
6MCP/mcp (POST/GET SSE)AI エージェント(Claude、ChatGPT)エンティティごとに 15 個のツールを自動生成(mcp.so に掲載)
7gRPC:50051低レイテンシのサービス間通信.proto を自動生成、エンティティごとに 6 個の RPC
8tRPC/trpc/{Entity}.{op}TypeScript フルスタッククライアント側の型生成
9OData/odata/{Collection} (+ $metadata)SAP/Microsoft DynamicsOData v4 ($filter、$select、$orderby)
10NATSmostajs.{Entity}.{op}エッジでの Pub/Subリクエスト・リプライメッセージング
11Arrow Flight/arrow/*列指向分析ゼロコピーのストリーミング

同じスキーマで 11 種類の入口を利用でき、コード生成は不要です。


13 種類のデータベース

@mostajs/orm が提供する永続化ダイアレクト:

カテゴリーデータベースダイアレクト ID
主流の SQLPostgreSQL、MySQL、MariaDB、SQLitepostgres、mysql、mariadb、sqlite
エンタープライズ向け SQLOracle、SQL Server、DB2、SAP HANA、HSQLDB、Sybaseoracle、mssql、db2、hana、hsqldb、sybase
NewSQL/クラウドCockroachDB、Google Cloud Spannercockroachdb、spanner
NoSQLMongoDBmongodb

ダイアレクトの切り替えは、環境変数の 1 行を変更するだけです:

DB_DIALECT=postgres → DB_DIALECT=mongodb
SGBD_URI=postgresql://… → SGBD_URI=mongodb://…

マルチテナント認証

Octonet は、**スコープ付き API キー(マシン間通信向け)**に基づく認証ミドルウェアと、人間による管理向けの RBAC を使用します。アグノスティックなオーケストレーターは @mostajs/auth/lib/check-request.ts にあります。

リクエストの認証フロー
HTTP Request
  │
  ▼
authGuard (Fastify adapter)
  │
  ▼
checkRequest (@mostajs/auth — framework-agnostic)
  │
  ├─ extract X-API-Key from header / Bearer token / ?apikey=
  ├─ resolveApiKey (@mostajs/api-keys) — DB lookup + bcrypt verify
  ├─ isScopeAuthorized (@mostajs/api-keys) — check scope.values
  │     for each (scope, value) pair :
  │       checks: [{scope:'projects', value:slug},
  │                {scope:'operations', value:'read'|'write'|'admin'},
  │                {scope:'transports', value:'rest'|'mcp'|...}]
  ├─ touchApiKey — fire-and-forget : lastUsedAt, usageCount, lastIp
  │
  ▼
ormHandler (entité CRUD) ─→ sanitizer (strip password/hash/tokens)
  │
  ▼
HTTP Response
スコープベースの権限(汎用、拡張可能)

API キーの形状は次のとおりです:

{
  permissions: {
    scopes: {
      projects:   ['my-project','demo'] | '*',     // declared by @mostajs/mproject
      operations: ['read','write','admin'] | '*',  // declared by @mostajs/orm
      transports: ['rest','graphql','mcp'] | '*',  // declared by @mostajs/net
      // anything: any module can register a new scope
    },
    rateLimit: 500,
  }
}

@mostajs/api-keys は projects/operations/transports という名前を認識しません。これは意図的な設計です。各モジュールは起動時に registerScope(dialect, {name, label, …}) を使ってスコープを登録します。チェックは汎用的です:isScopeAuthorized(perms, scope, value)。

HTTP ステータスの対応
ケースHTTP コード本文
API キーなし401{error: {code:'UNAUTHORIZED', message:'API key required…'}}
API キーが無効/失効済み401{error: {code:'UNAUTHORIZED', message:'Invalid or revoked API key'}}
API キーは有効だがスコープ外403{error: {code:'FORBIDDEN', message:'API key not authorized for X="Y"'}}
API キーは有効200/201{status:'ok', data: …}(サニタイズ済み — パスワード/ハッシュなし)
MCP フォールバック(mcp.so との互換性)

/mcp エンドポイントでは、キーが提示されない場合、public-default というラベルの API キーへの自動フォールバックが許可されます。これにより、mcp.so/Claude Desktop との互換性が保たれます。公開キーはプロジェクト default のみで読み取り専用となるため、書き込みはブロックされます。

サニタイザー

password、hash、verifyToken、resetToken、apiKeyHash、secret、privateKey の各フィールドは、グローバルミドルウェアによってすべての JSON レスポンスから自動的に除去されます。/api/v1/User?limit=1 を通じて漏えいする心配はありません。


汎用スコープレジストリ

スコープのカタログは、ホストプロジェクトのデータベースに保存されます(JSON ファイルやハードコードされた定数は使用しません)。

-- Auto-créées au boot via @mostajs/api-keys
CREATE TABLE api_key_scopes (
  id, name, label, description, icon, cardinality,
  valuesSource ('static' | 'dynamic'), dynamicSourceRef
);

CREATE TABLE api_key_scope_values (
  id, scopeName, value, label, sortOrder, metadata
);

各モジュールは起動時にスコープを登録します。

import { registerScope } from '@mostajs/api-keys/server'

// Dans mosta-net/src/server.ts (boot)
await registerScope(dialect, {
  name: 'transports', label: 'Network transports',
  cardinality: 'low', valuesSource: 'static',
  staticValues: [
    {value:'rest', sortOrder:1},
    {value:'graphql', sortOrder:2},
    // … 9 more
  ],
})

await registerScope(dialect, {
  name: 'projects', label: 'Projects',
  cardinality: 'high', valuesSource: 'dynamic',
  dynamicSourceRef: 'Project.slug',  // queried at runtime
})

管理 UI は GET /api/api-keys/scopes を通じて動的なカタログを読み込み、マトリックスを表示します(@mostajs/api-keys/components/ の React コンポーネント ApiKeyScopeMatrix)。


マルチプロジェクト対応

@mostajs/mproject を利用します。同一サーバー上に、互いに分離されたデータベースを複数構成できます。

パスプレフィックス付きルート
# Default project (DB_DIALECT + SGBD_URI au boot)
curl http://localhost:4488/api/v1/User

# Project nommé 'analytics'
curl http://localhost:4488/api/v1/analytics/events

# Ou via header (équivalent)
curl http://localhost:4488/api/v1/events -H "X-Project: analytics"
実行中にプロジェクトを追加する
curl -X POST http://localhost:4488/api/projects \
  -H "X-API-Key: <admin-key>" \
  -d '{
    "name": "analytics",
    "dialect": "mongodb",
    "uri": "mongodb://localhost:27017/analytics",
    "schemas": [{"name":"Event", "fields":{"type":"string","ts":"date"}}]
  }'

projects-tree.json に保存されます(パス:MOSTA_PROJECTS 環境変数)。


クイックスタート(セルフホスト)

インストール
npm install @mostajs/net @mostajs/orm @mostajs/mproject \
            @mostajs/rbac @mostajs/auth @mostajs/api-keys \
            @mostajs/config better-sqlite3
SQLite で実行する(インフラ不要)
DB_DIALECT=sqlite \
SGBD_URI=./data/octonet.db \
DB_SCHEMA_STRATEGY=update \
[email protected] \
OCTONET_ADMIN_PASSWORD=ChangeMe123! \
npx mostajs-net serve

コンソール出力:

Loaded 3 schemas from schemas.json
[DAL:SQLite] INIT_SCHEMA strategy=update {"entities":["User","Product","Order"]}
✓ Apikey scopes registered (projects, operations, transports)
✓ RBAC ready — [email protected] trial=…  public=…
⚠ public demo apikey emitted ONCE → sk_live_xxxxxxxx…  (save it!)
✓ Sanitizer middleware on rest, graphql, ws, sse, trpc, mcp, odata, jsonrpc
✓ ApiKey middleware on rest, graphql, ws, sse, trpc, mcp, odata, jsonrpc
✓ Protected ormHandler ready (sanitizer + apikey global wrapper)
✓ T1 sandbox endpoint /try ready (rate-limited 10/h/IP, TTL 7d)

  @mostajs/net  v2.6.x
  ─────────────────────────────────────────────────
  Dialect:    sqlite (./data/octonet.db)
  Entities:   User, Product, Order  (3)
  Port:       4488
  Strategy:   update
  Transports: rest, graphql, ws, sse, trpc, mcp, odata, jsonrpc  (8)
  Ready.  3 entities × 8 transports = 24 endpoints
テスト
# Sans apikey → 401
curl http://localhost:4488/api/v1/User
# {"error":{"code":"UNAUTHORIZED","message":"API key required…"}}

# Avec apikey publique (depuis les logs ↑)
curl http://localhost:4488/api/v1/User -H "X-API-Key: sk_live_…"
# {"status":"ok","data":[{"id":"…","email":"[email protected]",…}]}  ← password absent

設定(.env)

データベース(必須)
DB_DIALECT=postgres                                # any of 13 dialects
SGBD_URI=postgresql://user:pass@localhost:5432/db
DB_SCHEMA_STRATEGY=update                          # 'update' (recommandé prod) | 'create' (drop+recreate, dev only)
DB_SHOW_SQL=false
システムダイアレクト(本番環境で推奨、任意)— v2.7.5+

システムデータベース(apikeys、RBAC ユーザー、監査、プラン、支払い、プロジェクトのライフサイクルメタデータ)を、変更可能なビジネスダイアレクトから分離します。これらの変数が設定されていない場合、ビジネスシングルトンへの透過的なエイリアスとなります(単一データベース構成との後方互換性)。

MOSTA_SYSTEM_DIALECT=postgres                       # any of 13 dialects
MOSTA_SYSTEM_URI=postgresql://user:pass@localhost:5432/octonet_system

背景と使用方法については、以下の「システムダイアレクト(ビジネスシングルトンから分離)」のセクションをご覧ください。

サーバー
MOSTA_NET_PORT=4488
MOSTA_PROJECTS=./projects-tree.json                # path to multi-project config
SCHEMAS_PATH=./schemas                              # directory scanning fallback
トランスポート(個別に切り替え可能)
MOSTA_NET_REST_ENABLED=true
MOSTA_NET_GRAPHQL_ENABLED=true
MOSTA_NET_WS_ENABLED=true
MOSTA_NET_SSE_ENABLED=true
MOSTA_NET_JSONRPC_ENABLED=true
MOSTA_NET_MCP_ENABLED=true
MOSTA_NET_TRPC_ENABLED=true
MOSTA_NET_ODATA_ENABLED=true
MOSTA_NET_GRPC_ENABLED=false
MOSTA_NET_NATS_ENABLED=false
MOSTA_NET_ARROW_ENABLED=false

MOSTA_NET_CORS_ORIGIN=*
MOSTA_RATE_LIMIT_CLIENT=1000
RBAC の初期設定(@mostajs/config 経由で読み込み — プロファイルのカスケード MOSTA_ENV=DEV に対応)
[email protected]               # 1er boot only ; ignored after
OCTONET_ADMIN_PASSWORD=secret-12345
OCTONET_ADMIN_FIRSTNAME=Admin                       # optional
OCTONET_ADMIN_LASTNAME=Octonet                      # optional
OCTONET_BOOTSTRAP_VERBOSE=false                     # detailed bootstrap logs
OCTONET_OPEN_MODE=false                             # dev only — passe sans apikey
T1 サンドボックス(任意)
OCTONET_TRIAL_DATA_DIR=./data/trials                # SQLite files per alias
クラウドミドルウェア(任意、将来対応 — Octocloud とメタデータ DB を共有)
OCTONET_META_URI=postgresql://user:pass@localhost:5432/octonet_meta   # shared meta DB
PORTAL_DB_URI=postgresql://user:pass@localhost:5432/octonet_cloud     # legacy octocloud DB

API エンドポイントのリファレンス

パブリック
エンドポイントメソッド認証説明
/healthGETオープンサーバーのステータス、トランスポート、エンティティ
/tryGETオープンT1 サンドボックスを作成する HTML フォーム
/tryPOSTオープン(IP あたり 10 回/時のレート制限)サンドボックスを作成し、使い切りの apikey を返す
/api/v1/healthGETオープンAPI バージョン付きパスでのヘルスチェック
プロジェクト/エンティティの CRUD(apikey が必要)
エンドポイントメソッド操作説明
/api/v1/{Entity}GETfindAllデフォルトプロジェクトのエンティティ一覧
/api/v1/{Entity}/:idGETfindByIdエンティティを 1 件取得
/api/v1/{Entity}/countGETcount件数を取得
/api/v1/{Entity}/oneGETfindOne最初に一致したエンティティを取得
/api/v1/{Entity}/searchGETsearchテキスト検索
/api/v1/{Entity}POSTcreate挿入
/api/v1/{Entity}/:idPUTupdate置換
/api/v1/{Entity}/:idDELETEdelete削除
/api/v1/{Entity}/:id/addToSetPOSTaddToSet配列に追加
/api/v1/{Entity}/:id/pullPOSTpull配列から削除
/api/v1/{Entity}/:id/incrementPOSTincrement数値を加算
/api/v1/{Entity}/upsertPOSTupsert挿入または更新
/api/v1/{Entity}/aggregatePOSTaggregateパイプライン
/api/v1/{Entity}/updateManyPOSTupdateMany一括更新
/api/v1/{Entity}/deleteManyPOSTdeleteMany一括削除
/api/v1/{project}/{Entity}/…**プロジェクトをスコープとする同じルート
スキーマ管理(管理者 apikey が必要)
エンドポイントメソッド説明
/api/upload-schemas-jsonPOST実行時にスキーマを送信(再読み込みを実行)
/api/apply-schemaPOSTスキーマ差分を適用
/api/compare-schemaPOSTスキーマ差分をドライラン
/api/schemas-configGET現在登録されているスキーマ
認証と API キー(管理者権限が必要)
エンドポイントメソッド説明
/api/api-keysGET / POSTキーの一覧表示/発行
/api/api-keys/:idPUT / DELETE更新/無効化
/api/api-keys/scopesGET登録済みスコープと値を一覧表示(管理者向けマトリックス UI 用)
/api/api-keys/scopesPOST新しいスコープを登録(管理者)
/api/api-keys/scopes/:name/valuesPUT / DELETEスコープ値を管理
ネイティブトランスポート
エンドポイント説明
/graphqlGraphQL エンドポイント + GraphiQL IDE
/wsWebSocket 接続(エンティティイベント)
/eventsSSE ストリーム
/rpcJSON-RPC 2.0
/mcpModel Context Protocol(Claude/Smithery など)
/trpc/{Entity}.{op}tRPC プロシージャ
/odata/{Collection} · /odata/$metadataOData v4
マルチプロジェクト管理
エンドポイントメソッド説明
/api/projectsGETプロジェクトを一覧表示
/api/projectsPOSTプロジェクトを追加
/api/projects/:namePUT / DELETE編集/削除
オブザーバビリティ
エンドポイント説明
/api/performanceライブメトリクス(req/s、p50、p99)
/api/config-tree設定ツリー(インタラクティブ)
/api/live-logストリーミングログフィード

アーキテクチャ

                                 ┌──────────────────────────────────┐
                                 │       Fastify (port 4488)        │
                                 └────────────────┬─────────────────┘
                                                  │
       ┌─────────────────────────────────────────┴──────────────────────────────┐
       │                                                                        │
       ▼                                                                        ▼
┌────────────────────────┐                                       ┌────────────────────────┐
│  Transports (11)       │                                       │  Direct Fastify routes │
│  - REST                │                                       │  - /try                │
│  - GraphQL (mercurius) │                                       │  - /api/projects/*     │
│  - WS                  │                                       │  - /api/api-keys/*     │
│  - SSE                 │                                       │  - /health, /metrics   │
│  - JSON-RPC            │                                       └────────────────────────┘
│  - MCP (SDK Anthropic) │
│  - gRPC                │              ┌─────────────────────────────────────┐
│  - tRPC                │              │  Auth pipeline                      │
│  - OData               │              │  ┌──────────────┐                   │
│  - NATS                │              │  │ extractAuth  │ ←  HTTP request   │
│  - Arrow               ├──────────────┤  │ Context      │                   │
└────────────────────────┘              │  └──────┬───────┘                   │
                                        │         ▼                           │
                                        │  ┌──────────────┐                   │
                                        │  │ checkRequest │ ←  scope-checks   │
                                        │  │ (mosta-auth) │                   │
                                        │  └──────┬───────┘                   │
                                        │         ▼                           │
                                        │  ┌──────────────┐                   │
                                        │  │ checkApiKey  │ ←  resolve+verify │
                                        │  │ (api-keys)   │                   │
                                        │  └──────┬───────┘                   │
                                        └─────────┼───────────────────────────┘
                                                  ▼
                                        ┌────────────────────────┐
                                        │ Sanitizer middleware   │
                                        │ strips password/hash/  │
                                        │ tokens before response │
                                        └────────┬───────────────┘
                                                 ▼
                                        ┌────────────────────────┐
                                        │ ormHandler             │
                                        │ → ProjectManager.resolve│
                                        │ → EntityService.execute │
                                        └────────┬───────────────┘
                                                 ▼
                                        ┌────────────────────────┐
                                        │ @mostajs/orm dialect   │
                                        │ (13 SGBD)              │
                                        └────────────────────────┘
利用するエコシステムモジュール
モジュールOctonet での役割
@mostajs/orm永続化(13 dialects)
@mostajs/mprojectマルチプロジェクト管理(default + sandbox + サブスクライバー)
@mostajs/rbacID 管理(User、Role、Permission、Account)+ AccountSchema + OCTONET_RBAC_SEED
@mostajs/authフレームワークに依存しない checkRequest オーケストレーター、hashPassword
@mostajs/api-keysapikey の CRUD + スコープ(Scope/ScopeValue schemas)+ checkApiKey + ApiKeyScopeMatrix 管理者 UI
@mostajs/configMOSTA_ENV によるカスケード対応の環境変数ヘルパー
@mostajs/cloud-middlewareクォータ/サブスクリプション(オプション — Octocloud 接続時に有効)
@mostajs/replicatorCQRS マルチレプリカ(オプション)
@mostajs/project-lifeProject 永続化スキーマ(オプション — JSON ではなく DB ストレージを使用する場合)

システム dialect(業務シングルトンとは分離)

v2.7.5 から利用可能 — 本番環境で確認された 「/api/change-dialect 後に apikey が見つからない」 バグを解決します。

dialect を 2 つに分ける理由

Octonet は、実行時に DB 接続を変更する管理者向けルート(/api/change-dialect、/api/reload-config、/api/reconnect)を公開しています。業務側では、これは正当な動作です(現在のプロジェクトの userland エンティティは、管理者のニーズに応じて postgres → sqlite → mongodb に移行できます)。

しかし、システムモジュール(apikey、RBAC users、audit、サブスクリプションプラン、payments、project-life metadata)は、これらの変更に追従しない安定したデータベースで稼働する必要があります。そうでない場合、業務 dialect の変更によって apikey が見つからなくなり、管理者は UI から締め出されます。

役割環境変数実行時に変更可能?読み取り元
業務(userland エンティティ)DB_DIALECT + SGBD_URIはい(管理者 UI)EntityService、トランスポート、データルート
システム(Octonet インフラ)MOSTA_SYSTEM_DIALECT + MOSTA_SYSTEM_URIいいえ(安定)RBAC、apikey-middleware、account-scope、auth guards、sandbox /try
推奨設定(複数 DB の本番環境)
# Métier — peut bouger via /api/change-dialect
DB_DIALECT=postgres
SGBD_URI=postgresql://hmd:***@127.0.0.1:5432/octonet_business

# Système — stable, jamais touché par les routes admin
MOSTA_SYSTEM_DIALECT=postgres
MOSTA_SYSTEM_URI=postgresql://hmd:***@127.0.0.1:5432/octonet_system
単一 DB の設定(開発/シンプルなデプロイ)

MOSTA_SYSTEM_* を空のままにすると、自動的に業務シングルトンのエイリアスになります(後方互換性 100%、v2.7.5 より前と同じ動作)。

手順
1. 既存のデプロイを複数 DB モードに移行する
# 1. Sauvegarder la base actuelle
pg_dump octonet_business > backup-pre-split.sql

# 2. Créer la base système (vide — RBAC seed re-exécute au boot)
createdb octonet_system

# 3. Ajouter MOSTA_SYSTEM_* dans .env
echo 'MOSTA_SYSTEM_DIALECT=postgres' >> .env.local
echo 'MOSTA_SYSTEM_URI=postgresql://hmd:***@127.0.0.1:5432/octonet_system' >> .env.local

# 4. Restart Octonet — le bootstrap RBAC + scopes seed sur octonet_system
pm2 restart octonet-mcp

# 5. Restaurer les apikeys et RBAC users de l'ancienne base
#    (à scripter selon convention métier — typiquement export/import des
#    tables api_keys, users, roles, permissions, scopes, scope_values)
2. システムが業務から適切に分離されていることを確認する
# Avant /api/change-dialect : apikey doit fonctionner
curl -H "X-API-Key: sk_live_…" http://localhost:4488/api/auth/verify
# → 200 OK

# Bouger le dialect métier vers SQLite
curl -X POST -H "Content-Type: application/json" \
  -d '{"dialect":"sqlite","uri":":memory:","connect":true}' \
  http://localhost:4488/api/change-dialect
# → "Dialecte changé et connecté : sqlite"

# Re-tester l'apikey — DOIT toujours fonctionner (système intact)
curl -H "X-API-Key: sk_live_…" http://localhost:4488/api/auth/verify
# → 200 OK (bug résolu en v2.7.5)

v2.7.5 より前では、2 つ目の curl は 503 metadata DB unavailable または 401 PostgreSQL not connected. Call connect() first. を返していました。

3. アプリケーションコードからシステム dialect を読み取る
import { getSystemDialect } from '@mostajs/data-plug'

const sysDialect = await getSystemDialect()
// Utiliser comme un dialect normal pour requêter les tables système
// (apikeys, users, roles, audit_log, plans, etc.)
4. 起動時のブートストラップを確認する

octonet-mcpの起動時に、次の2つのログが表示されます。

✓ DB connectée: postgres                            ← métier
✓ System dialect: postgres (octonet_system)         ← système (si MOSTA_SYSTEM_* défini)
✓ RBAC ready — admin=… trial=… public=…             ← seed côté système
✓ ApiKey middleware on REST/SSE/GraphQL/...         ← câblé sur système
src/server.tsのシステム関連箇所 (参考)

18か所の呼び出し元で、ビジネス用シングルトンの代わりにgetSystemDialect()からダイアレクトを取得するようになりました。

ブロック箇所数呼び出し元
RBACのブートストラップ1bootstrapRbac(systemDialect, …)
スコープの登録4registerScope(systemDialect, …) × 3 + systemDialect.initSchema(scopeTables)
グローバルミドルウェア2createApiKeyMiddleware(() => systemDialect, …) + createAccountScopeMiddleware(() => systemDialect)
トランスポートごとのミドルウェア2各transport.use(…)に同様に適用
トランスポートの認証ガード6authGuard(systemDialect, …) × 6 (SSE、GraphQL、JSON-RPC、gRPC、tRPC、OData)
カスタムの/api/auth/verify2checkApiKey(systemDialect, …) + new UserRepository(systemDialect)
サンドボックス/try2registerTryRoutes({ dialect: systemDialect, … }) + startTrialCleanupJob({ dialect: systemDialect, … })

ビジネス用ダイアレクト*(dialect)*は、引き続き次の用途で正当に使用されます。

  • ビジネス用シングルトンの初期ブートストラップ*(L98)* + pm.setDefault('default', dialect, …) (L126、L240)
  • 管理ルート/api/reconnect、/api/change-dialect、/api/reload-config、/api/test-connection、/api/truncate-tables、/api/drop-tables — いずれも明示的にビジネス関連の操作です
  • ユーザー領域のエンティティを提供するEntityService (保護されたトランスポート経由のCRUD操作)
作業の各ステップ (履歴)
ステップリポジトリ成果物
1@mostajs/data-plug v1.2.2-1.2.4 (APIgetSystemDialect + ORMファサード)npm
2@mostajs/net v2.7.5 (起動時のbootstrapSystemDialect)git
3@mostajs/api-keys 0.2.3、@mostajs/payment 0.4.1、@mostajs/project-life 0.1.3、@mostajs/subscriptions-plan 0.3.5 (WeakMapリポジトリ + ファサード)npm
4@mostajs/net v2.7.5 (利用側をgetSystemDialect()に切り替え — 18か所)git
5/api/change-dialectのpostgres → sqliteシナリオの統合テスト⏳
6amiaへのデプロイ + MOSTA_SYSTEM_URIのスモークテスト⏳

起動シーケンス

  1. @mostajs/config を介して .envを読み込みます(プロファイルのカスケード MOSTA_ENV)
  2. メインの方言に接続します(SGBD_URI)
  3. スキーマを読み込みます(優先順位:getAllSchemas() レジストリ → schemas.json → SCHEMAS_PATH ディレクトリのスキャン)
  4. 戦略 update/create を使用して dialect.initSchema(schemas) を実行します
  5. RBACをブートストラップします(octonet-rbac-bootstrap.ts):
    • UserSchema/RoleSchema/PermissionSchema/PermissionCategorySchema/AccountSchema/ApiKeySchema を登録します
    • seedRBAC(OCTONET_RBAC_SEED) — 6カテゴリ、25権限、4ロール(admin/subscriber/trial/public)
    • OCTONET_ADMIN_EMAIL/PASSWORD から createAdmin() を実行します
    • Account trial-playground(type='trial')を作成します
    • User public-demo(role=public)を作成します
    • Account public-system(type='system')を作成します
    • default プロジェクトにスコープを限定した ApiKey public-default(読み取り専用、REST + MCP)を生成します — 平文で一度だけ出力されます
  6. 正規スコープを登録します:projects(動的、Project.slug)、operations(静的:read/write/admin)、transports(静的:11個の値)
  7. デフォルトプロジェクトを projects-tree.json に追加します(ownerId=admin、visibility=public)
  8. projects-tree.json から追加のプロジェクトを読み込みます
  9. ormHandler を composeMiddleware([sanitizer, apikey], ormHandler) でラップします → protectedOrmHandler
  10. 有効な各トランスポートを起動します:
    • transport.use(loggingMiddleware)
    • transport.use(sanitizerMiddleware)
    • transport.use(apiKeyMiddleware)
    • transport.setHandler(ormHandler)
    • transport.start(config)
  11. Fastifyルートを登録します:
    • registerDynamicRestRoutes(app, protectedOrmHandler, pm) — /api/v1/...
    • registerProjectRoutes(app, pm, protectedOrmHandler) — /:project/*
    • registerTryRoutes(app, {dialect, pm}) — /try POST
    • registerTryPage(app) — /try GET(HTML)
    • startTrialCleanupJob({dialect, pm}) — TTL 7日間の毎時cron
  12. ポートでリッスンします(MOSTA_NET_PORT)

14言語対応のNetClient

Octonetは14種類のネイティブランタイムから利用でき、同じAPIキー、同じURLを使用できます:

ランタイムパッケージレジストリ
Node/TS@mostajs/net/client (built-in)npm
Javacom.mostajs:mostajs-net-clientMaven Central
Java + Spring Bootcom.mostajs:mostajs-net-client-spring-boot-starterMaven Central
.NETMostaJs.Net.ClientNuGet
Pythonmostajs-net-clientPyPI
Gogithub.com/apolocine/mosta-net-client-gopkg.go.dev
Swiftmosta-net-client-swiftSwift Package Index
Kotlinio.github.apolocine:mostajs-net-client-ktMaven Central
Dart / Fluttermostajs_net_clientpub.dev
Rustmostajs-net-clientcrates.io
PHPmostajs/net-clientPackagist
Rubymostajs-net-clientRubyGems
Elixirmostajs_net_clientHex.pm
Luamostajs-net-clientLuaRocks
DelphiMostaJsNetClientGetIt
Unity (C#)com.mostajs.net-clientOpenUPM

モノレポ: github.com/apolocine/mosta-net-clients

各NetClientは同じAPI契約に従います:

NetClient.create()
  .url(...)
  .apiKey(...)
  .build()
  .findAll(entity, filter, options)
  .findById(entity, id)
  .create(entity, data)
  .update(entity, id, data)
  .delete(entity, id)
  .uploadSchemasJson(schemas)
  .health()

本番環境へのデプロイ(amia.fr)

リファレンスデプロイは、PostgreSQLバックエンドで octonet.amia.fr + mcp.amia.fr(互換エイリアス)上で稼働します:

URL役割
https://octonet.amia.frOctonetサーバー(REST、MCP、GraphQL、WS、SSE、tRPC、OData、JSON-RPC)
https://mcp.amia.fr互換性のためのDNSエイリアス — 旧mcp.so
https://octocloud.amia.frOctocloud — SaaSポータル Next.js(サブスクリプション、管理UI)

デプロイキット一式は Entreprise/octonet-mcp/ にあります:

  • apache/mcp.amia.fr.conf — Apache2 vhost(SSEプロキシ、WSアップグレード、Let's Encrypt SAN証明書)
  • ecosystem.config.cjs — PM2設定
  • deploy.sh / install.sh / update.sh — オーケストレーションスクリプト
  • tests/smoke-all.sh — スモークテスト一式(DNS、TLS、/health、SSE MCP、REST、/try、Java NetClient)

CLI

npx mostajs-net serve                      # Start server
npx mostajs-net mcp                        # MCP-only mode
npx mostajs-net generate-apikey <label>    # Émettre une apikey via CLI
npx mostajs-net hash-password <password>   # Hash bcrypt
npx mostajs-net info                       # JSON config dump

npx octonet-mcp --dialect=X --uri=Y        # Standalone MCP server (process séparé)

ライセンス

AGPL-3.0-or-later — 派生コードをオープンソースのままにする限り、自由に利用できます。 商用ライセンスもご利用いただけます:[email protected]。料金はプロジェクト単位で、シート単位ではありません。

— (c) 2026 Dr Hamid MADANI <[email protected]>

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。