A compact MCP add-on for Claude Code that lets Claude confer with GPT, Grok, Gemini, Mistral, Groq, and DeepSeek — to reason, debate, plan, and peer-review. One config and bounded limits on rounds, tokens, and time.
Drift inferred · capture-to-capture
- HIGH code analysis flagged committed secret ×3 in fxspeiser/crosscheck-agent
- HIGH code analysis flagged committed secret ×3 in fxspeiser/crosscheck-agent
- HIGH code analysis flagged committed secret ×4 in fxspeiser/crosscheck-agent
- HIGH code analysis flagged committed secret ×4, dynamic code execution ×5 in fxspeiser/crosscheck-agent
- HIGH code analysis flagged committed secret ×7, dynamic code execution ×5 in fxspeiser/crosscheck-agent
tools
-
actionability
low
-
audit
Post-run rubric scoring. Audits an output (from output_to_audit, or pulled from the latest transcript for session_id) against a rubric. The auditor is selected to exclude the producing_panelists so a
-
bench
Run repo-scoped goldens (*.json in .crosscheck/goldens/) against a panel; rule-based verifiers (contains / regex_match / contains_any / contains_all / not_contains / min_length) score each provider, a
-
confer
Ask one or more providers the same question in parallel; return every answer.
-
constraint_adherence
high
-
coordinate
Structured Proposer → Critic(s) → Synthesizer flow. Each role emits a JSON envelope; the synthesizer emits a validated StructuredSynthesis. Persists key claims to the SQLite claim-list with supports/a
-
covers_open_questions
med
-
critique
Have each panelist list the top weaknesses of a proposed answer / plan / code with severity tags (low
-
debate
Bounded round-trip debate; the configured moderator synthesises a result. Optional structured: true makes the synthesis a JSON-schema-validated object (consensus, dissent, key claims, citations, open
-
delegate
Cross-model handshake: route a confer or review call through one named provider, with quota tracking by session_id and by requesting provider. Refused calls return accepted: false with a structured re
-
explain
Replay a session as a navigable tree with cost / latency / token annotations per tool call and per provider call. Reads usage_log and persisted transcripts. Returns both a structured envelope and a pr
-
factual_grounding
high
-
fetch
Retrieve a URL with deny-by-default allowlist (fetch.url_allowlist prefix list) and persist a sha256-keyed snapshot under .crosscheck/evidence/. Cached on repeat unless force_refresh: true. Use to gro
-
id
severity
-
internally_consistent
med
-
list_providers
Discover which LLMs are currently available and which are in the active set.
-
max_dag_nodes
/ max_dag_depth — protect orchestrate from a planner that emits an unboundedly wide or deep DAG.
-
max_session_cost_usd
cumulative dollar cap.
-
max_session_tokens
cumulative token cap.
-
max_session_wall_seconds
wall-clock cap.
-
no_pii_leak
high
-
orchestrate
Plan-then-execute across sub-agents. The moderator decomposes a goal into a DAG of subtasks (or you pass a pre-authored dag), workers run in parallel where deps allow, and a final synth pass recombine
-
pick
Multi-criteria decision-making. Each provider scores every option on every criterion (0..1); the tool aggregates with criterion weights, returns a ranked list, and surfaces the top-K cross-provider di
-
plan
Collaborative step-by-step planning with risks + alternatives. Honours structured: true.
-
recall
Full-text search across persisted transcripts via SQLite FTS5. Pull prior context out of past sessions without re-running expensive panel calls. Ranks by bm25, returns windowed snippets with [[ ]] hit
-
recommend_panel
Smart router as a tool. Returns a recommended provider lineup for a given purpose based on accumulated usage_log reliability + cost + engagement, with optional prefer_provider / avoid_provider hints.
-
review
Peer code / proposal review across one or more LLMs. Pass untrusted_input: true when the snippet may contain prompt injections.
-
scoreboard
Read-only snapshot: per-provider weight + wins/losses/abstains + delegations, plus totals for sessions/claims/links/delegations and (optional) the last N redacted event lines. The data the UI panel re
-
solve
Iterative propose → verify → retry. Provider drafts a literal solution; a shell (sandboxed subprocess: timeout, RLIMIT_AS, RLIMIT_CPU, isolated tmpdir) or regex_response verifier accepts or rejects; f
-
triangulate
Run a coordinate flow and return consensus + minority report plus per-provider weights drawn from accumulated bench / critic-ballot win-rate. The "give me one answer, but be honest about disagreement"
-
update_crosscheck
Compares your local git HEAD against main at https://github.com/fxspeiser/crosscheck-agent. With apply: true, runs git pull --ff-only in the install directory; the server can't reload itself, so the r
-
verify
Run a list of deterministic property checks against caller-supplied data — no LLM calls. Supports text-pattern kinds (contains, not_contains, regex_match, contains_any, contains_all, min_length), shel
last analysis: too-large · showing evidence from the last successful analysis (5d ago)
filesystem 22
- fs fxspeiser-crosscheck-agent-270330c/scripts/smoke_full_stack.mjs :15
import { readFileSync, existsSync, mkdtempSync, rmSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/scripts/smoke_panel_confer.mjs :15
import { readFileSync, existsSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/scripts/smoke_panel_debate.mjs :9
import { readFileSync, existsSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/scripts/diff-output.ts :15
import { readFile } from "node:fs/promises"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/scripts/ping-tier-models.ts :32
import { readFileSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/scripts/render-usage.ts :9
import { writeFileSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/core/events.ts :24
import { appendFileSync, mkdirSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/core/node-cache.ts :18
utimesSync, writeFileSync, readdirSync, unlinkSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/core/pricing.ts :20
import { readFileSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/core/sandbox.ts :30
import { mkdtemp, rm } from "node:fs/promises"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/core/transcripts.ts :19
import { mkdirSync, writeFileSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/core/wrappers.ts :22
import { existsSync, readFileSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/entrypoints/node-stdio.ts :17
import { existsSync, mkdirSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/audit.ts :31
import { readdirSync, readFileSync, statSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/bench.ts :19
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/config-pin.ts :16
} from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/create.ts :19
// paths → fs.readFile. Truncation at _CREATE_DOC_MAX_BYTES. - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/explain.ts :11
import { readdirSync, readFileSync, statSync, existsSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/fetch.ts :29
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/scoreboard.ts :15
import { readFileSync, existsSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/update-crosscheck.ts :22
import { existsSync, mkdirSync, writeFileSync } from "node:fs"; - fs fxspeiser-crosscheck-agent-270330c/servers/typescript/tsup.config.ts :1
import { readFileSync } from "node:fs";
shell / exec 6
- shell fxspeiser-crosscheck-agent-270330c/scripts/smoke_full_stack.mjs :14
import { spawn } from "node:child_process"; - shell fxspeiser-crosscheck-agent-270330c/scripts/smoke_panel_confer.mjs :14
import { spawn } from "node:child_process"; - shell fxspeiser-crosscheck-agent-270330c/scripts/smoke_panel_debate.mjs :8
import { spawn } from "node:child_process"; - shell fxspeiser-crosscheck-agent-270330c/servers/typescript/src/adapters/storage/interface.ts :432
exec(sql: string, params?: readonly unknown[]): Promise<number>; - shell fxspeiser-crosscheck-agent-270330c/servers/typescript/src/core/sandbox.ts :29
import { spawn } from "node:child_process"; - shell fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/update-crosscheck.ts :9
// - child_process.spawnSync for git commands (rev-parse, fetch,
network 4
- net fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/create.ts :18
// - Documents: URL → native fetch (with cache + allowlist); local - net fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/fetch.ts :6
// - Uses Node's global fetch (Node 18+) for the HTTP call. - net fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/update-crosscheck.ts :11
// - global fetch (Node 18+) for the GitHub API call - net fxspeiser-crosscheck-agent-270330c/servers/typescript/src/tools/verify.ts :400
const resp = await fetch(url, {
database 1
- db fxspeiser-crosscheck-agent-270330c/servers/typescript/src/adapters/storage/better-sqlite3.ts :14
import DatabaseCtor from "better-sqlite3";
declared dependencies 9
- @modelcontextprotocol/sdk@^1.29.0
- @types/better-sqlite3@^7.6.13
- better-sqlite3@^12.10.0
- zod@^3.25.76
- @types/node@^22.10.0
- tsup@^8.3.5
- tsx@^4.22.4
- typescript@^5.6.3
- vitest@^4.1.8