doc-platform
@ingadhoc/docs-platform
Adhoc のドキュメントプラットフォーム: 1つの検索エンジン、1つのMCPコア、1つのアクセスゲート、1つの漏洩ガード。これらはコンテンツリポジトリ(oba-docs、odumbo-docs、adhoc-docs)によってピン留めされて消費されます。
これ以前は、4つの部品が3つのリポジトリにフォークされていました。同じファイルが3つの方言を持ち、各修正は手動で伝播されるか、あるいは伝播されませんでした。測定は docs/unificacion/ にあります: lib/mcp/indice.mjs は3つのコピー間で 41の差分 があり、17はあるリポジトリが持っていて他の2つが持っていない修正 でした。最もコストがかかったケース: 漏洩ガードは2つのリポジトリでバイト単位で同一でしたが、3つ目には存在しませんでした。
knowledge-managementの ADR 0006 — コンテンツ本文ごとに1つのリポジトリ、プラットフォームは別パッケージとして: コンテンツとエンジンはライフサイクルと所有者が異なります。knowledge-managementの ADR 0007 — ゲートと漏洩ガードは各サイトではなくプラットフォームのもの: 各リポジトリが再実装する保護は、一部のリポジトリが持たない保護です。spec
arquitectura-plataforma-docsのステージA: このパッケージ、2つのバージョン管理された契約、そしてピンの遅延を可視化するドリフトチェック。
消費方法
npm i --ignore-scripts github:ingadhoc/doc-platform#v0.1.0正確なピン、常にタグで。 ^ も main もブランチもなし: ピンはプラットフォームの修正が同時に3つのサイトを壊すのを防ぎ、1行でのロールバックを可能にします。範囲を指定すると docs-drift-check が意図的に失敗します — ピン留めしないピンはピンではありません。
--ignore-scripts 推奨。 このパッケージにはインストールスクリプトはなく、今後も追加される予定はありません。フラグはツリー全体に適用されます。これは 公開 サイトの buildCommand で実行されるためです。同じ理由で、パッケージには 単一の依存関係(検索エンジンが必要とする minisearch)と ゼロの devDependencies があります: ビルドでの最小限の表面積。
コンシューマーがすでに持っていて、このパッケージが宣言しないもの: mcp-handler と zod。これらは lib/mcp/mcp-handler.mjs がインポートします。これらは意図的にリポジトリの依存関係です: リポジトリがどのバージョンのMCPフレームワークでデプロイするかを決定し、パッケージはそれを強制しません。3つのリポジトリは現在これらを持っています。
npm i の後、コンシューマーリポジトリには3行の接着コードが残ります:
// api/mcp.mjs
import { crearMcp } from '@ingadhoc/docs-platform/mcp-handler';
import { crearFeedback } from '@ingadhoc/docs-platform/feedback';
import * as indice from '@ingadhoc/docs-platform/indice';
import { config } from '../docs.mcp.config.mjs';
export const { handler, default: fetchHandler } = crearMcp({
config,
indice,
crearIssue: crearFeedback(config.feedback),
});// middleware.js — en la RAÍZ del repo (Vercel lo exige ahí)
import { next } from '@vercel/functions';
import { decidir } from '@ingadhoc/docs-platform/gate';
const AUDIENCIAS = ['publico', 'interno']; // adhoc-docs: ['interno']
export default function middleware(request) {
return decidir(request, process.env, { audiencias: AUDIENCIAS }) ?? next();
}// package.json del consumidor — el guard, dentro del buildCommand
"build:publico": "node tools/build.mjs --audience=publico && npm --prefix site run build && npx docs-guard-fuga --salida=dist/publico"&& は装飾ではありません: ガードが1で終了したときにデプロイを中止するものです。; に変更しないでください。
エクスポート内容
インポート | 内容 |
| 検索エンジン: ビルドが生成するインデックスに対する |
|
|
|
|
| 定数時間でのトークン比較( |
|
|
|
|
|
|
|
|
| 参照用の |
bin | 漏洩ガード、 |
bin | ドリフトチェック、コンシューマーのCI用 |
2つの契約
両方とも schemaVersion を持ち、両方のリーダーは、発行者が自分たちが読めるバージョンより新しいバージョンを宣言した場合、または宣言しなかった場合に 例外を投げます。静かに劣化することはありません: 間違って応答するインデックスは、応答しないインデックスよりも悪いです。
config ↔ プラットフォーム:
docs.config.json。スキーマはschema/docs.config.schema.jsonで公開され、バリデータはlib/config.mjs(独自、依存関係なし:ajvは公開サイトのビルドには入りません)。各フィールドの設計と測定された証拠はdocs/unificacion/diseno-eje.mdにあります。現在の3つのconfigの翻訳はmapeo-configs.mdにあります。インデックス ↔ エンジン: 各リポジトリの
tools/build.mjsが生成し、lib/mcp/indice.mjsが読み取ります。これはdocs/unificacion/contrato-indice.mdで仕様化されています。
軸、表で
コーパスは 1つの 軸をオブジェクトとして宣言します: { tipo, default?, valores[] }。
| corpus | tools のパラメータ | 値なしの | ワイルドカード(軸外の記事) |
| oba-docs |
|
| はい( |
| adhoc-docs |
| 構造化された曖昧さ( | いいえ |
| odumbo-docs | (公開されない) | — | — |
leer() のルールは 1つ で、軸のタイプごとの if はありません: config が誰を選ぶかを宣言した場合のみ選択します。動作を変えるのは eje.default の存在であり、タイプではありません — そして、軸 project のコーパスに default を設定してそれをテストするテストがあります。
テストの実行
npm install && npm test # 227 casosbloques はコンテンツリポジトリを必要とし(実際の tools/build.mjs をインシデントフィクスチャに対して実行します)、存在しない場合は 理由付きでスキップ されます:
DOCS_REPO=~/repositorios/oba-docs node --test tests/bloques.test.mjsmcp.test.mjs のHTTPハンドラーの部分(16ケース)も、チェックアウトに mcp-handler/zod がない場合は理由付きでスキップされます。これらはこのパッケージではなくコンシューマーの依存関係です。両方がインストールされている場合、mcp は57になります。ケーパビリティのないケースは明示的にスキップされます。劣化して実行されることはありません。
jjs 向け — 未解決の決定
このアセンブリが 単独では解決しない こと。最初の3つは diseno-eje.md §7 のもので、契約に関わります。残りは4つの分析から出てきて、統合後も存続しています。
1. コーパスごとに1つの軸: 上限を受け入れるか?
schemaVersion: 1 はconfigごとに 1つの 軸を許可し、現在は3つのリポジトリで十分です。コーパスが project × version を同時に必要とする日には、スキーマはそれを表現できず、出力は ejes: [...](複数形)の schemaVersion: 2 になります。
設計の推奨: 上限を明示的に受け入れ、実際のニーズが証拠を持ってそれを再開させる(ステージBのバンプアラームと同じ基準)。これはメジャーに関わるため、あなたの判断です。
2. metadata.types: コーパスごとの語彙か、Adhoc全体の語彙か?
現在、types を持っているのは adhoc-docs だけで、その6つの値は knowledge-management の標準(concepto、referencia、procedimiento、troubleshooting、guia、indice)に非常に似ています。語彙がAdhocのものであれば、各リポジトリのconfigには入らず、パッケージに入り、configはそれを要求するかどうかのみを指定します。これはスキーマではなくコンテンツガバナンスの決定です。裁定が下されるまで、スキーマはそれをコーパスごとのリストとして残します(両方の出力と互換性があります)。
3. adhoc-docs の漏洩ガードのオプトアウト: 署名しますか?
スキーマは deploy.guardDeFuga の宣言を 必須 にしているため、黙って省略することはもうできません。2つの出力が残り、どちらも擁護可能です: {"activo": false, "motivo": "…"}(そのリポジトリには公開ビルドがありません: そのゲートは無条件であり、ガードは 公開ビルドへの 漏洩を防ぎます)、またはガードをベルトとしてそのまま入れる。現在 mapeo-configs.md にある motivo は文字通り "PENDIENTE DE FIRMA (jjs)" と書かれています。
そして、ファイルをコピーしても解決しない技術的な部分があります(analisis-04-seguridad.md の DUDA 1): adhoc-docs には :::interno ブロックがなく、オーディエンス付きの site/generated.json を生成せず、deploy.proyectos マップもありません。ガードをそのまま有効にすると、ビルドは "site/generated.json が存在しない" で最初から失敗します。厳密な方法は、それらの2つを生成することです。
4. オーディエンスリストはまだ重複しており、ドリフトチェックはまだそれを比較していません
docs.config.json → audiences と middleware.js → AUDIENCIAS は一致する必要がありますが、重複を避ける方法はありません: エッジはファイルシステムから読み取らないからです。これは、フォークが始まったまさにその種の静かなドリフトです。それらを比較するCIケースが欠けています(現在の docs-drift-check はピンを測定しており、その一貫性は測定していません)。
5. タグ付けの前にリポジトリで確認すべき3つのこと
各Vercelプロジェクトの3つの環境(Production、Preview、Development)の
DOCS_AUDIENCEを、パッケージを採用するマージ の前に。フェイルクローズでは、変数のないプロジェクトは503を返します。これは安全な方向ですが、無料ではありません。現在の
buildCommandの--esperada: 現在、ガードはVercelで実行されることを 拒否 します。今日それを渡すbuildCommandがある場合、そのデプロイは失敗し始めます。スナップショットからは検証できませんでした。MCPのGETは503を返します デプロイメントが提供可能なオーディエンスを宣言していない場合。これはコンシューマーにとって観察可能な変更です: Claude Code のプリフライトは、デプロイメントが誤って設定されている場合、バナーではなく503を受け取ります。
6. このパッケージが閉じることができない測定された負債
プリプロセッサのフェイルクローズは出力してから失敗する。 誤って書かれたディレクティブ (
::: interno)があると、build.mjsは内部の行を含むsite/docs/**を書き出し、 その後 終了コード1で終了します。現在は漏れません。buildCommandが&&で連結しているからです。保護は演算子にあり、プログラムにはありません。これはtests/bloques.test.mjsにtodoとして宣言されており、build.mjsの統合によって 修正されます — ただし、この段階には入っていません。tests/bloques.test.mjsは<repo>/site/に書き込みます。oba と odumbo では ビルド出力がハードコードされているためです。スイートを実行した後、npm run genで 再生成する必要があります。ガードの字句的アプローチの限界: 5文字未満の数字や文字列は決してプローブを持ちません (キー
4821、頭字語など)。画像はスキャンされず、applyBlocks内の漏れはプローブを 生成しません。これはガードのヘッダーにあります;ここで繰り返すのは、カバレッジと 混同される可能性がある部分だからです。serverInfo.versionはハンドラー内で'1.0.0'にハードコードされたままです。 これは、ピン留めされたパッケージのpackage.jsonから取得すべきです。そうすれば、 MCP クライアントはどのバージョンのプラットフォームと通信したかを報告できます。 変更されませんでした:それは動作を発明することになるからです。ワイルドカードは軸の
tipoのプロパティであり、コーパスのプロパティではありません。 軸がprojectのコーパスは、横断的なドキュメントを持つことはできません (eje: nullはどのフィルターからも見えません)。もし将来必要になった場合、 厳密な出力は、ワイルドカードがオフの間はインデックスの契約がそれを禁止し、 矛盾がビルド時に失敗し、ランタイムでは失敗しないようにすることです。スペックは "vitest" と言っていますが、これはステージAのテスト規約であり、3つの リポジトリのどれも vitest を使用していません。実際の規約 — このパッケージの規約も — はネイティブの
node:testです。誰かがそれに従うために vitest をインストールする前に、 その行を修正する価値があります。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Query any docs site via MCP. Submit a URL, ask questions, get cited answers.
A paid remote MCP for Context7 MCP docs, built to return verdicts, receipts, usage logs, and audit-r
Knowledge coverage map and health score. Ingest docs into a governed knowledge graph via MCP.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ingadhoc/doc-platform'
If you have feedback or need assistance with the MCP directory API, please join our Discord server