d48cda4081
CI / Test (ubuntu-latest, Node 18.x, bun) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, npm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, pnpm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, yarn) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 20.x, bun) (push) Failing after 17m13s
CI / Test (ubuntu-latest, Node 20.x, npm) (push) Failing after 18m42s
CI / Test (ubuntu-latest, Node 20.x, pnpm) (push) Failing after 15m0s
CI / Test (ubuntu-latest, Node 20.x, yarn) (push) Failing after 49m44s
CI / Test (ubuntu-latest, Node 22.x, bun) (push) Failing after 51m55s
CI / Test (ubuntu-latest, Node 22.x, pnpm) (push) Failing after 21m57s
CI / Test (ubuntu-latest, Node 22.x, npm) (push) Failing after 37m39s
CI / Test (ubuntu-latest, Node 22.x, yarn) (push) Failing after 34m7s
CI / Validate Components (push) Failing after 37m15s
CI / Python Tests (push) Failing after 10m1s
CI / Security Scan (push) Failing after 10m1s
CI / Lint (push) Failing after 17m12s
CI / Coverage (push) Failing after 20m19s
CI / Test (macos-latest, Node 18.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, yarn) (push) Has been cancelled
48 lines
1.4 KiB
JavaScript
48 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
const { normalizeServerEntry, buildInventory } = require('./canonical-mcp');
|
|
const { readClaudeCodeMcp } = require('./readers/claude-code');
|
|
const { readCodexMcp } = require('./readers/codex');
|
|
const { readOpencodeMcp } = require('./readers/opencode');
|
|
|
|
const DEFAULT_READERS = Object.freeze({
|
|
'claude-code': readClaudeCodeMcp,
|
|
codex: readCodexMcp,
|
|
opencode: readOpencodeMcp
|
|
});
|
|
|
|
// Collect MCP server configs from every harness reader, normalize each raw
|
|
// entry to ecc.mcp.v1, then merge into a single deduplicated inventory with a
|
|
// fragmentation report. Secrets are stripped during normalization (only env
|
|
// key names survive), so the returned inventory is safe to print or persist.
|
|
function collectMcpInventory(options = {}) {
|
|
const readers = options.readers || DEFAULT_READERS;
|
|
const readerOptions = options.readerOptions || {};
|
|
|
|
const rawRecords = [];
|
|
for (const [harness, reader] of Object.entries(readers)) {
|
|
if (typeof reader !== 'function') {
|
|
continue;
|
|
}
|
|
|
|
let entries;
|
|
try {
|
|
entries = reader(readerOptions[harness] || readerOptions.shared || {});
|
|
} catch {
|
|
entries = [];
|
|
}
|
|
|
|
if (Array.isArray(entries)) {
|
|
rawRecords.push(...entries);
|
|
}
|
|
}
|
|
|
|
const normalized = rawRecords.map(normalizeServerEntry);
|
|
return buildInventory(normalized);
|
|
}
|
|
|
|
module.exports = {
|
|
collectMcpInventory,
|
|
DEFAULT_READERS
|
|
};
|