@debatetalk/mcp 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "debatetalk",
3
+ "description": "Run structured multi-model AI debates from your AI assistant. Multiple models argue independently, deliberate, and converge on a 4-part synthesis: Strong Ground, Fault Lines, Blind Spots, and Your Call.",
4
+ "version": "1.0.4",
5
+ "author": {
6
+ "name": "DebateTalk",
7
+ "email": "support@debatetalk.ai"
8
+ }
9
+ }
package/.mcp.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "debatetalk": {
3
+ "command": "npx",
4
+ "args": ["-y", "@debatetalk/mcp"],
5
+ "env": {
6
+ "DEBATETALK_API_KEY": "dt_your_key_here"
7
+ }
8
+ }
9
+ }
package/README.md CHANGED
@@ -17,7 +17,7 @@ DebateTalk makes multiple AI models argue a question independently, challenge ea
17
17
 
18
18
  ## Quickstart
19
19
 
20
- ### MCP (Claude Desktop / Cursor)
20
+ ### MCP (Claude Desktop, Cursor, Cline, Goose, and any MCP-compatible client)
21
21
 
22
22
  **1. Get an API key**
23
23
 
@@ -42,11 +42,16 @@ Create a key at [console.debatetalk.ai/api-keys](https://console.debatetalk.ai/a
42
42
  Config file locations:
43
43
  - **Claude Desktop (Mac):** `~/Library/Application Support/Claude/claude_desktop_config.json`
44
44
  - **Claude Desktop (Windows):** `%APPDATA%\Claude\claude_desktop_config.json`
45
+ - **Claude Code:** `~/.claude/settings.json` (under `mcpServers`)
45
46
  - **Cursor:** `.cursor/mcp.json` in your project root
47
+ - **Windsurf:** `~/.codeium/windsurf/mcp_config.json`
48
+ - **Cline / Roo Code:** MCP settings panel in VS Code extension
49
+ - **Goose:** `~/.config/goose/config.yaml` (under `extensions`)
50
+ - **Other clients:** refer to your client's MCP documentation
46
51
 
47
- **3. Ask Claude to run a debate**
52
+ **3. Ask your AI assistant to run a debate**
48
53
 
49
- Claude reads the tool description to decide when to call it — no exact phrasing required. Any of these work:
54
+ MCP clients read the tool description to decide when to call it — no exact phrasing required. Any of these work:
50
55
 
51
56
  > *"debate whether we should rewrite our backend in Go"*
52
57
  > *"use DT — should we raise our Series A now?"*
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env node
2
-
3
1
  // src/client.ts
4
2
  import { EventSourceParserStream } from "eventsource-parser/stream";
5
3
  var BASE_URL = "https://engine.debatetalk.ai";
@@ -105,14 +103,17 @@ var DebateTalkClient = class {
105
103
  for await (const event of this.streamDebate(params)) {
106
104
  events.push(event);
107
105
  if (event.type === "debate_start") {
108
- debateId = event.data["debate_id"] ?? "";
109
- models = event.data["models"] ?? [];
106
+ debateId = typeof event.data["debate_id"] === "string" ? event.data["debate_id"] : "";
107
+ models = Array.isArray(event.data["models"]) ? event.data["models"] : [];
110
108
  }
111
109
  if (event.type === "classification") {
112
- questionType = event.data["question_type"] ?? "";
110
+ questionType = typeof event.data["question_type"] === "string" ? event.data["question_type"] : "";
113
111
  }
114
112
  if (event.type === "synthesis") {
115
- synthesis = event.data;
113
+ const d = event.data;
114
+ if (typeof d["strong_ground"] === "string" && typeof d["fault_lines"] === "string" && typeof d["blind_spots"] === "string" && typeof d["your_call"] === "string") {
115
+ synthesis = d;
116
+ }
116
117
  }
117
118
  }
118
119
  return {
@@ -130,4 +131,4 @@ export {
130
131
  DebateTalkError,
131
132
  DebateTalkClient
132
133
  };
133
- //# sourceMappingURL=chunk-MEP3QJFT.js.map
134
+ //# sourceMappingURL=chunk-XVI4IIO6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport type {\n ModelStatusResponse,\n RecommendResponse,\n EstimateCostParams,\n CostEstimate,\n HistoryResponse,\n DebateParams,\n DebateEvent,\n DebateResult,\n ApiErrorBody,\n SynthesisData,\n} from \"./types.js\";\n\nconst BASE_URL = \"https://engine.debatetalk.ai\";\n\nexport class DebateTalkError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly code?: string\n ) {\n super(message);\n this.name = \"DebateTalkError\";\n }\n}\n\nexport class DebateTalkClient {\n private readonly apiKey: string | undefined;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey ?? process.env[\"DEBATETALK_API_KEY\"];\n }\n\n private get authHeaders(): Record<string, string> {\n if (!this.apiKey) return {};\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n private get baseHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/json\", ...this.authHeaders };\n }\n\n private requireAuth(): void {\n if (!this.apiKey) {\n throw new Error(\n \"DEBATETALK_API_KEY is required for this operation. \" +\n \"Create one at https://console.debatetalk.ai/api-keys\"\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const res = await fetch(`${BASE_URL}${path}`, {\n method,\n headers: this.baseHeaders,\n ...(body !== undefined && { body: JSON.stringify(body) }),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({\n error: { code: \"unknown\", message: res.statusText },\n })) as ApiErrorBody;\n throw new DebateTalkError(\n res.status,\n payload.error?.message ?? res.statusText,\n payload.error?.code\n );\n }\n\n return res.json() as Promise<T>;\n }\n\n // ── Public endpoints (no auth required) ──────────────────────────────────\n\n async getModelStatus(): Promise<ModelStatusResponse> {\n return this.request<ModelStatusResponse>(\"GET\", \"/v1/public/model-status\");\n }\n\n async recommendModels(question: string): Promise<RecommendResponse> {\n return this.request<RecommendResponse>(\"POST\", \"/v1/models/recommend\", {\n question,\n });\n }\n\n // ── Authenticated endpoints ───────────────────────────────────────────────\n\n async estimateCost(params: EstimateCostParams): Promise<CostEstimate> {\n this.requireAuth();\n return this.request<CostEstimate>(\"POST\", \"/v1/user/estimate-cost\", params);\n }\n\n async getHistory(limit = 20): Promise<HistoryResponse> {\n this.requireAuth();\n return this.request<HistoryResponse>(\n \"GET\",\n `/v1/user/history?limit=${limit}`\n );\n }\n\n async *streamDebate(params: DebateParams): AsyncGenerator<DebateEvent> {\n this.requireAuth();\n\n const res = await fetch(`${BASE_URL}/debate`, {\n method: \"POST\",\n headers: { ...this.baseHeaders, Accept: \"text/event-stream\" },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({\n error: { code: \"unknown\", message: res.statusText },\n })) as ApiErrorBody;\n throw new DebateTalkError(\n res.status,\n payload.error?.message ?? res.statusText,\n payload.error?.code\n );\n }\n\n if (!res.body) throw new DebateTalkError(0, \"No response body\");\n\n const stream = res.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n for await (const event of stream) {\n if (!event.data || event.data === \"[DONE]\") continue;\n try {\n yield JSON.parse(event.data) as DebateEvent;\n } catch {\n // skip malformed events\n }\n }\n }\n\n async runDebate(params: DebateParams): Promise<DebateResult> {\n const events: DebateEvent[] = [];\n let debateId = \"\";\n let questionType = \"\";\n let models: string[] = [];\n let synthesis: SynthesisData | null = null;\n\n for await (const event of this.streamDebate(params)) {\n events.push(event);\n\n if (event.type === \"debate_start\") {\n debateId = (event.data[\"debate_id\"] as string | undefined) ?? \"\";\n models = (event.data[\"models\"] as string[] | undefined) ?? [];\n }\n if (event.type === \"classification\") {\n questionType =\n (event.data[\"question_type\"] as string | undefined) ?? \"\";\n }\n if (event.type === \"synthesis\") {\n synthesis = event.data as unknown as SynthesisData;\n }\n }\n\n return {\n debate_id: debateId,\n question: params.question,\n question_type: questionType,\n models,\n synthesis,\n events,\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport type {\n ModelStatusResponse,\n RecommendResponse,\n EstimateCostParams,\n CostEstimate,\n HistoryResponse,\n DebateParams,\n DebateEvent,\n DebateResult,\n ApiErrorBody,\n SynthesisData,\n} from \"./types.js\";\n\nconst BASE_URL = \"https://engine.debatetalk.ai\";\n\nexport class DebateTalkError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly code?: string\n ) {\n super(message);\n this.name = \"DebateTalkError\";\n }\n}\n\nexport class DebateTalkClient {\n private readonly apiKey: string | undefined;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey ?? process.env[\"DEBATETALK_API_KEY\"];\n }\n\n private get authHeaders(): Record<string, string> {\n if (!this.apiKey) return {};\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n private get baseHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/json\", ...this.authHeaders };\n }\n\n private requireAuth(): void {\n if (!this.apiKey) {\n throw new Error(\n \"DEBATETALK_API_KEY is required for this operation. \" +\n \"Create one at https://console.debatetalk.ai/api-keys\"\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const res = await fetch(`${BASE_URL}${path}`, {\n method,\n headers: this.baseHeaders,\n ...(body !== undefined && { body: JSON.stringify(body) }),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({\n error: { code: \"unknown\", message: res.statusText },\n })) as ApiErrorBody;\n throw new DebateTalkError(\n res.status,\n payload.error?.message ?? res.statusText,\n payload.error?.code\n );\n }\n\n return res.json() as Promise<T>;\n }\n\n // ── Public endpoints (no auth required) ──────────────────────────────────\n\n async getModelStatus(): Promise<ModelStatusResponse> {\n return this.request<ModelStatusResponse>(\"GET\", \"/v1/public/model-status\");\n }\n\n async recommendModels(question: string): Promise<RecommendResponse> {\n return this.request<RecommendResponse>(\"POST\", \"/v1/models/recommend\", {\n question,\n });\n }\n\n // ── Authenticated endpoints ───────────────────────────────────────────────\n\n async estimateCost(params: EstimateCostParams): Promise<CostEstimate> {\n this.requireAuth();\n return this.request<CostEstimate>(\"POST\", \"/v1/user/estimate-cost\", params);\n }\n\n async getHistory(limit = 20): Promise<HistoryResponse> {\n this.requireAuth();\n return this.request<HistoryResponse>(\n \"GET\",\n `/v1/user/history?limit=${limit}`\n );\n }\n\n async *streamDebate(params: DebateParams): AsyncGenerator<DebateEvent> {\n this.requireAuth();\n\n const res = await fetch(`${BASE_URL}/debate`, {\n method: \"POST\",\n headers: { ...this.baseHeaders, Accept: \"text/event-stream\" },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({\n error: { code: \"unknown\", message: res.statusText },\n })) as ApiErrorBody;\n throw new DebateTalkError(\n res.status,\n payload.error?.message ?? res.statusText,\n payload.error?.code\n );\n }\n\n if (!res.body) throw new DebateTalkError(0, \"No response body\");\n\n const stream = res.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n for await (const event of stream) {\n if (!event.data || event.data === \"[DONE]\") continue;\n try {\n yield JSON.parse(event.data) as DebateEvent;\n } catch {\n // skip malformed events\n }\n }\n }\n\n async runDebate(params: DebateParams): Promise<DebateResult> {\n const events: DebateEvent[] = [];\n let debateId = \"\";\n let questionType = \"\";\n let models: string[] = [];\n let synthesis: SynthesisData | null = null;\n\n for await (const event of this.streamDebate(params)) {\n events.push(event);\n\n if (event.type === \"debate_start\") {\n debateId = typeof event.data[\"debate_id\"] === \"string\" ? event.data[\"debate_id\"] : \"\";\n models = Array.isArray(event.data[\"models\"]) ? (event.data[\"models\"] as string[]) : [];\n }\n if (event.type === \"classification\") {\n questionType = typeof event.data[\"question_type\"] === \"string\" ? event.data[\"question_type\"] : \"\";\n }\n if (event.type === \"synthesis\") {\n const d = event.data;\n if (\n typeof d[\"strong_ground\"] === \"string\" &&\n typeof d[\"fault_lines\"] === \"string\" &&\n typeof d[\"blind_spots\"] === \"string\" &&\n typeof d[\"your_call\"] === \"string\"\n ) {\n synthesis = d as unknown as SynthesisData;\n }\n }\n }\n\n return {\n debate_id: debateId,\n question: params.question,\n question_type: questionType,\n models,\n synthesis,\n events,\n };\n }\n}\n"],"mappings":"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","names":[]}
package/dist/cli/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  DebateTalkClient,
4
4
  DebateTalkError
5
- } from "../chunk-MEP3QJFT.js";
5
+ } from "../chunk-XVI4IIO6.js";
6
6
 
7
7
  // src/cli/index.ts
8
8
  import { Command as Command6 } from "commander";
@@ -156,12 +156,12 @@ function recommendCommand() {
156
156
  import { Command as Command4 } from "commander";
157
157
  import chalk5 from "chalk";
158
158
  function costCommand() {
159
- return new Command4("cost").description("Estimate the credit cost of a debate before running it").argument("<question>", "The question to estimate cost for").option("--rounds <n>", "Number of deliberation rounds", "2").action(async (question, opts) => {
159
+ return new Command4("cost").description("Estimate the credit cost of a debate before running it").argument("<question>", "The question to estimate cost for").option("--rounds <n>", "Number of deliberation rounds").action(async (question, opts) => {
160
160
  const client = new DebateTalkClient();
161
161
  try {
162
162
  const est = await client.estimateCost({
163
163
  question,
164
- rounds: parseInt(opts.rounds, 10)
164
+ ...opts.rounds && { rounds: parseInt(opts.rounds, 10) }
165
165
  });
166
166
  console.log(chalk5.bold(`Cost estimate`));
167
167
  console.log();
@@ -190,8 +190,9 @@ function historyCommand() {
190
190
  return new Command5("history").description("List your past debates").option("--limit <n>", "Number of debates to show", "20").action(async (opts) => {
191
191
  const client = new DebateTalkClient();
192
192
  try {
193
+ const rawLimit = parseInt(opts.limit, 10);
193
194
  const { debates, total } = await client.getHistory(
194
- parseInt(opts.limit, 10)
195
+ Number.isNaN(rawLimit) ? 20 : Math.min(Math.max(1, rawLimit), 100)
195
196
  );
196
197
  if (debates.length === 0) {
197
198
  console.log(chalk6.dim('No debates yet. Run: debatetalk debate "your question"'));
@@ -209,7 +210,7 @@ function historyCommand() {
209
210
  });
210
211
  const share = d.share_token ? chalk6.dim(` \u2192 https://console.debatetalk.ai/share/${d.share_token}`) : "";
211
212
  console.log(
212
- ` ${chalk6.dim(date)} ${d.title}` + chalk6.dim(` (${d.model_count} models)`) + share
213
+ ` ${chalk6.dim(date)} ${d.title}` + chalk6.dim(` (${d.model_count} models, ${d.status})`) + share
213
214
  );
214
215
  }
215
216
  } catch (err) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/debate.ts","../../src/cli/utils.ts","../../src/cli/commands/models.ts","../../src/cli/commands/recommend.ts","../../src/cli/commands/cost.ts","../../src/cli/commands/history.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { debateCommand } from \"./commands/debate.js\";\nimport { modelsCommand } from \"./commands/models.js\";\nimport { recommendCommand } from \"./commands/recommend.js\";\nimport { costCommand } from \"./commands/cost.js\";\nimport { historyCommand } from \"./commands/history.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"debatetalk\")\n .description(\n \"DebateTalk CLI — run structured multi-model AI debates from your terminal.\\n\" +\n \"Docs: https://debatetalk.ai/resources/api-reference\"\n )\n .version(\"1.0.0\");\n\nprogram.addCommand(debateCommand());\nprogram.addCommand(modelsCommand());\nprogram.addCommand(recommendCommand());\nprogram.addCommand(costCommand());\nprogram.addCommand(historyCommand());\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\nimport type { DebateEvent } from \"../../types.js\";\n\nexport function debateCommand(): Command {\n return new Command(\"debate\")\n .description(\"Run a structured multi-model AI debate\")\n .argument(\"<question>\", \"The question or topic to debate\")\n .option(\n \"--models <ids>\",\n \"Comma-separated model IDs (omit for smart routing)\"\n )\n .option(\"--rounds <n>\", \"Number of deliberation rounds (default: 2)\")\n .action(\n async (\n question: string,\n opts: { models?: string; rounds?: string }\n ) => {\n const client = new DebateTalkClient();\n const params = {\n question,\n ...(opts.models && { models: opts.models.split(\",\").map((s) => s.trim()) }),\n ...(opts.rounds && { rounds: parseInt(opts.rounds, 10) }),\n };\n\n const spinner = ora(\"Starting debate…\").start();\n\n try {\n let currentPhase = \"\";\n\n for await (const event of client.streamDebate(params)) {\n const phase = getPhaseLabel(event);\n if (phase && phase !== currentPhase) {\n currentPhase = phase;\n spinner.text = phase;\n }\n\n if (event.type === \"synthesis\") {\n spinner.succeed(\"Debate complete\");\n printSynthesis(question, event);\n return;\n }\n }\n\n spinner.fail(\"Debate ended without synthesis\");\n } catch (err) {\n spinner.fail(\"Debate failed\");\n handleError(err);\n }\n }\n );\n}\n\nfunction getPhaseLabel(event: DebateEvent): string | null {\n switch (event.type) {\n case \"debate_start\":\n return \"Debate starting…\";\n case \"classification\":\n return `Classifying question (${(event.data[\"question_type\"] as string | undefined) ?? \"…\"})`;\n case \"round_start\":\n return `Round ${(event.data[\"round\"] as number | undefined) ?? \"?\"} — models deliberating…`;\n case \"consensus\":\n return \"Checking consensus…\";\n case \"synthesis\":\n return \"Generating synthesis…\";\n default:\n return null;\n }\n}\n\nfunction printSynthesis(question: string, event: DebateEvent): void {\n const d = event.data as Record<string, string>;\n console.log();\n console.log(chalk.bold(`\"${question}\"`));\n console.log();\n console.log(chalk.bold.green(\"━━━ STRONG GROUND ━━━\"));\n console.log(d[\"strong_ground\"] ?? \"\");\n console.log();\n console.log(chalk.bold.yellow(\"━━━ FAULT LINES ━━━\"));\n console.log(d[\"fault_lines\"] ?? \"\");\n console.log();\n console.log(chalk.bold.magenta(\"━━━ BLIND SPOTS ━━━\"));\n console.log(d[\"blind_spots\"] ?? \"\");\n console.log();\n console.log(chalk.bold.cyan(\"━━━ YOUR CALL ━━━\"));\n console.log(d[\"your_call\"] ?? \"\");\n console.log();\n}\n","import chalk from \"chalk\";\nimport { DebateTalkError } from \"../client.js\";\n\nexport function handleError(err: unknown): never {\n if (err instanceof DebateTalkError) {\n if (err.status === 401 || err.status === 403) {\n console.error(chalk.red(\"Authentication failed.\"));\n console.error(\n chalk.dim(\n \"Set DEBATETALK_API_KEY or create a key at https://console.debatetalk.ai/api-keys\"\n )\n );\n } else if (err.status === 429) {\n console.error(chalk.red(\"Rate limit reached.\"));\n console.error(chalk.dim(\"Free plan: 5 debates/day. Upgrade at https://debatetalk.ai\"));\n } else {\n console.error(chalk.red(`API error (${err.status}): ${err.message}`));\n }\n } else if (err instanceof Error) {\n console.error(chalk.red(err.message));\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\nexport function requireApiKey(): string {\n const key = process.env[\"DEBATETALK_API_KEY\"];\n if (!key) {\n console.error(chalk.red(\"DEBATETALK_API_KEY is not set.\"));\n console.error(\n chalk.dim(\"Create a key at https://console.debatetalk.ai/api-keys\")\n );\n process.exit(1);\n }\n return key;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function modelsCommand(): Command {\n return new Command(\"models\")\n .description(\"Show real-time health and latency for all DebateTalk models\")\n .action(async () => {\n const client = new DebateTalkClient();\n try {\n const { models, updated_at } = await client.getModelStatus();\n const online = models.filter((m) => m.status === \"online\").length;\n console.log(\n chalk.bold(`Model Status`) +\n chalk.dim(` — ${online}/${models.length} online (updated ${updated_at})`)\n );\n console.log();\n for (const m of models) {\n const icon =\n m.status === \"online\"\n ? chalk.green(\"✓\")\n : m.status === \"degraded\"\n ? chalk.yellow(\"⚠\")\n : chalk.red(\"✗\");\n const latency =\n m.latency_ms != null ? chalk.dim(` ${m.latency_ms}ms`) : \"\";\n console.log(` ${icon} ${m.display_name}${latency}`);\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function recommendCommand(): Command {\n return new Command(\"recommend\")\n .description(\"Get the best model panel for a question\")\n .argument(\"<question>\", \"The question to get recommendations for\")\n .action(async (question: string) => {\n const client = new DebateTalkClient();\n try {\n const rec = await client.recommendModels(question);\n console.log(chalk.bold(`Recommended panel`) + chalk.dim(` for \"${question}\"`));\n console.log(chalk.dim(`Question type: ${rec.question_type}`));\n console.log();\n console.log(` ${chalk.cyan(\"Debaters:\")} ${rec.debaters.join(\", \")}`);\n console.log(` ${chalk.cyan(\"Synthesizer:\")} ${rec.synthesizer}`);\n console.log(` ${chalk.cyan(\"Adjudicator:\")} ${rec.adjudicator}`);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function costCommand(): Command {\n return new Command(\"cost\")\n .description(\"Estimate the credit cost of a debate before running it\")\n .argument(\"<question>\", \"The question to estimate cost for\")\n .option(\"--rounds <n>\", \"Number of deliberation rounds\", \"2\")\n .action(async (question: string, opts: { rounds: string }) => {\n const client = new DebateTalkClient();\n try {\n const est = await client.estimateCost({\n question,\n rounds: parseInt(opts.rounds, 10),\n });\n console.log(chalk.bold(`Cost estimate`));\n console.log();\n console.log(\n ` ${chalk.cyan(\"Total:\")} ${est.estimated_credits} credits` +\n chalk.dim(` (~$${est.estimated_usd.toFixed(2)} USD)`)\n );\n console.log();\n console.log(chalk.dim(\" Breakdown:\"));\n for (const b of est.breakdown) {\n console.log(\n chalk.dim(\n ` • ${b.model} (${b.role}): ~${b.estimated_tokens.toLocaleString()} tokens = ${b.estimated_credits} credits`\n )\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function historyCommand(): Command {\n return new Command(\"history\")\n .description(\"List your past debates\")\n .option(\"--limit <n>\", \"Number of debates to show\", \"20\")\n .action(async (opts: { limit: string }) => {\n const client = new DebateTalkClient();\n try {\n const { debates, total } = await client.getHistory(\n parseInt(opts.limit, 10)\n );\n if (debates.length === 0) {\n console.log(chalk.dim('No debates yet. Run: debatetalk debate \"your question\"'));\n return;\n }\n console.log(\n chalk.bold(`Debate history`) +\n chalk.dim(` — showing ${debates.length} of ${total}`)\n );\n console.log();\n for (const d of debates) {\n const date = new Date(d.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n const share = d.share_token\n ? chalk.dim(` → https://console.debatetalk.ai/share/${d.share_token}`)\n : \"\";\n console.log(\n ` ${chalk.dim(date)} ${d.title}` +\n chalk.dim(` (${d.model_count} models)`) +\n share\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n"],"mappings":"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","names":["Command","chalk","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/debate.ts","../../src/cli/utils.ts","../../src/cli/commands/models.ts","../../src/cli/commands/recommend.ts","../../src/cli/commands/cost.ts","../../src/cli/commands/history.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { debateCommand } from \"./commands/debate.js\";\nimport { modelsCommand } from \"./commands/models.js\";\nimport { recommendCommand } from \"./commands/recommend.js\";\nimport { costCommand } from \"./commands/cost.js\";\nimport { historyCommand } from \"./commands/history.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"debatetalk\")\n .description(\n \"DebateTalk CLI — run structured multi-model AI debates from your terminal.\\n\" +\n \"Docs: https://debatetalk.ai/resources/api-reference\"\n )\n .version(\"1.0.0\");\n\nprogram.addCommand(debateCommand());\nprogram.addCommand(modelsCommand());\nprogram.addCommand(recommendCommand());\nprogram.addCommand(costCommand());\nprogram.addCommand(historyCommand());\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\nimport type { DebateEvent } from \"../../types.js\";\n\nexport function debateCommand(): Command {\n return new Command(\"debate\")\n .description(\"Run a structured multi-model AI debate\")\n .argument(\"<question>\", \"The question or topic to debate\")\n .option(\n \"--models <ids>\",\n \"Comma-separated model IDs (omit for smart routing)\"\n )\n .option(\"--rounds <n>\", \"Number of deliberation rounds (default: 2)\")\n .action(\n async (\n question: string,\n opts: { models?: string; rounds?: string }\n ) => {\n const client = new DebateTalkClient();\n const params = {\n question,\n ...(opts.models && { models: opts.models.split(\",\").map((s) => s.trim()) }),\n ...(opts.rounds && { rounds: parseInt(opts.rounds, 10) }),\n };\n\n const spinner = ora(\"Starting debate…\").start();\n\n try {\n let currentPhase = \"\";\n\n for await (const event of client.streamDebate(params)) {\n const phase = getPhaseLabel(event);\n if (phase && phase !== currentPhase) {\n currentPhase = phase;\n spinner.text = phase;\n }\n\n if (event.type === \"synthesis\") {\n spinner.succeed(\"Debate complete\");\n printSynthesis(question, event);\n return;\n }\n }\n\n spinner.fail(\"Debate ended without synthesis\");\n } catch (err) {\n spinner.fail(\"Debate failed\");\n handleError(err);\n }\n }\n );\n}\n\nfunction getPhaseLabel(event: DebateEvent): string | null {\n switch (event.type) {\n case \"debate_start\":\n return \"Debate starting…\";\n case \"classification\":\n return `Classifying question (${(event.data[\"question_type\"] as string | undefined) ?? \"…\"})`;\n case \"round_start\":\n return `Round ${(event.data[\"round\"] as number | undefined) ?? \"?\"} — models deliberating…`;\n case \"consensus\":\n return \"Checking consensus…\";\n case \"synthesis\":\n return \"Generating synthesis…\";\n default:\n return null;\n }\n}\n\nfunction printSynthesis(question: string, event: DebateEvent): void {\n const d = event.data as Record<string, string>;\n console.log();\n console.log(chalk.bold(`\"${question}\"`));\n console.log();\n console.log(chalk.bold.green(\"━━━ STRONG GROUND ━━━\"));\n console.log(d[\"strong_ground\"] ?? \"\");\n console.log();\n console.log(chalk.bold.yellow(\"━━━ FAULT LINES ━━━\"));\n console.log(d[\"fault_lines\"] ?? \"\");\n console.log();\n console.log(chalk.bold.magenta(\"━━━ BLIND SPOTS ━━━\"));\n console.log(d[\"blind_spots\"] ?? \"\");\n console.log();\n console.log(chalk.bold.cyan(\"━━━ YOUR CALL ━━━\"));\n console.log(d[\"your_call\"] ?? \"\");\n console.log();\n}\n","import chalk from \"chalk\";\nimport { DebateTalkError } from \"../client.js\";\n\nexport function handleError(err: unknown): never {\n if (err instanceof DebateTalkError) {\n if (err.status === 401 || err.status === 403) {\n console.error(chalk.red(\"Authentication failed.\"));\n console.error(\n chalk.dim(\n \"Set DEBATETALK_API_KEY or create a key at https://console.debatetalk.ai/api-keys\"\n )\n );\n } else if (err.status === 429) {\n console.error(chalk.red(\"Rate limit reached.\"));\n console.error(chalk.dim(\"Free plan: 5 debates/day. Upgrade at https://debatetalk.ai\"));\n } else {\n console.error(chalk.red(`API error (${err.status}): ${err.message}`));\n }\n } else if (err instanceof Error) {\n console.error(chalk.red(err.message));\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function modelsCommand(): Command {\n return new Command(\"models\")\n .description(\"Show real-time health and latency for all DebateTalk models\")\n .action(async () => {\n const client = new DebateTalkClient();\n try {\n const { models, updated_at } = await client.getModelStatus();\n const online = models.filter((m) => m.status === \"online\").length;\n console.log(\n chalk.bold(`Model Status`) +\n chalk.dim(` — ${online}/${models.length} online (updated ${updated_at})`)\n );\n console.log();\n for (const m of models) {\n const icon =\n m.status === \"online\"\n ? chalk.green(\"✓\")\n : m.status === \"degraded\"\n ? chalk.yellow(\"⚠\")\n : chalk.red(\"✗\");\n const latency =\n m.latency_ms != null ? chalk.dim(` ${m.latency_ms}ms`) : \"\";\n console.log(` ${icon} ${m.display_name}${latency}`);\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function recommendCommand(): Command {\n return new Command(\"recommend\")\n .description(\"Get the best model panel for a question\")\n .argument(\"<question>\", \"The question to get recommendations for\")\n .action(async (question: string) => {\n const client = new DebateTalkClient();\n try {\n const rec = await client.recommendModels(question);\n console.log(chalk.bold(`Recommended panel`) + chalk.dim(` for \"${question}\"`));\n console.log(chalk.dim(`Question type: ${rec.question_type}`));\n console.log();\n console.log(` ${chalk.cyan(\"Debaters:\")} ${rec.debaters.join(\", \")}`);\n console.log(` ${chalk.cyan(\"Synthesizer:\")} ${rec.synthesizer}`);\n console.log(` ${chalk.cyan(\"Adjudicator:\")} ${rec.adjudicator}`);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function costCommand(): Command {\n return new Command(\"cost\")\n .description(\"Estimate the credit cost of a debate before running it\")\n .argument(\"<question>\", \"The question to estimate cost for\")\n .option(\"--rounds <n>\", \"Number of deliberation rounds\")\n .action(async (question: string, opts: { rounds?: string }) => {\n const client = new DebateTalkClient();\n try {\n const est = await client.estimateCost({\n question,\n ...(opts.rounds && { rounds: parseInt(opts.rounds, 10) }),\n });\n console.log(chalk.bold(`Cost estimate`));\n console.log();\n console.log(\n ` ${chalk.cyan(\"Total:\")} ${est.estimated_credits} credits` +\n chalk.dim(` (~$${est.estimated_usd.toFixed(2)} USD)`)\n );\n console.log();\n console.log(chalk.dim(\" Breakdown:\"));\n for (const b of est.breakdown) {\n console.log(\n chalk.dim(\n ` • ${b.model} (${b.role}): ~${b.estimated_tokens.toLocaleString()} tokens = ${b.estimated_credits} credits`\n )\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function historyCommand(): Command {\n return new Command(\"history\")\n .description(\"List your past debates\")\n .option(\"--limit <n>\", \"Number of debates to show\", \"20\")\n .action(async (opts: { limit: string }) => {\n const client = new DebateTalkClient();\n try {\n const rawLimit = parseInt(opts.limit, 10);\n const { debates, total } = await client.getHistory(\n Number.isNaN(rawLimit) ? 20 : Math.min(Math.max(1, rawLimit), 100)\n );\n if (debates.length === 0) {\n console.log(chalk.dim('No debates yet. Run: debatetalk debate \"your question\"'));\n return;\n }\n console.log(\n chalk.bold(`Debate history`) +\n chalk.dim(` — showing ${debates.length} of ${total}`)\n );\n console.log();\n for (const d of debates) {\n const date = new Date(d.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n const share = d.share_token\n ? chalk.dim(` → https://console.debatetalk.ai/share/${d.share_token}`)\n : \"\";\n console.log(\n ` ${chalk.dim(date)} ${d.title}` +\n chalk.dim(` (${d.model_count} models, ${d.status})`) +\n share\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n"],"mappings":"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","names":["Command","chalk","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command"]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DebateTalkClient
4
- } from "../chunk-MEP3QJFT.js";
4
+ } from "../chunk-XVI4IIO6.js";
5
5
 
6
6
  // src/mcp/server.ts
7
7
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
@@ -14,7 +14,7 @@ import {
14
14
  // src/mcp/tools/run_debate.ts
15
15
  var runDebateTool = {
16
16
  name: "run_debate",
17
- description: "Run a structured multi-model AI debate on any question. Use this tool when the user asks to 'debate', 'use DebateTalk', 'use DT', 'multi-model', 'get a second opinion', 'stress-test' an idea, or wants multiple AI perspectives on a decision. Also use it proactively for high-stakes decisions where a single AI answer is insufficient \u2014 architecture choices, hiring decisions, strategic bets, predictions, or anything with genuine uncertainty. Multiple AI models argue independently in a blind round, deliberate, and converge on a 4-part synthesis: Strong Ground (what all models agree on), Fault Lines (genuine disagreements), Blind Spots (what all models missed), and Your Call (actionable recommendation). Requires an API key (Pro or Enterprise plan). Free tier: 5 debates/day.",
17
+ description: "Run a structured multi-model AI debate on any question. Use this tool when the user asks to 'debate', 'use DebateTalk', 'use DT', 'multi-model', 'multi model', 'get a second opinion', 'stress-test' an idea, or wants multiple AI perspectives on a decision. Also use it proactively for high-stakes decisions where a single AI answer is insufficient \u2014 architecture choices, hiring decisions, strategic bets, predictions, or anything with genuine uncertainty. Multiple AI models argue independently in a blind round, deliberate, and converge on a 4-part synthesis: Strong Ground (what all models agree on), Fault Lines (genuine disagreements), Blind Spots (what all models missed), and Your Call (actionable recommendation). Requires an API key (Pro or Enterprise plan). Free tier: 5 debates/day.",
18
18
  inputSchema: {
19
19
  type: "object",
20
20
  properties: {
@@ -38,11 +38,12 @@ var runDebateTool = {
38
38
  async function handleRunDebate(client, args) {
39
39
  const result = await client.runDebate(args);
40
40
  if (!result.synthesis) {
41
+ const id = result.debate_id ? `Debate ${result.debate_id}` : "Debate";
41
42
  return {
42
43
  content: [
43
44
  {
44
45
  type: "text",
45
- text: `debate completed \u2014 ${result.debate_id} \u2014 but synthesis was not produced. Check your plan limits at https://console.debatetalk.ai`
46
+ text: `${id} completed but synthesis was not produced. Check your plan limits at https://console.debatetalk.ai`
46
47
  }
47
48
  ]
48
49
  };
@@ -210,7 +211,8 @@ var getHistoryTool = {
210
211
  }
211
212
  };
212
213
  async function handleGetHistory(client, args) {
213
- const limit = args.limit ?? 20;
214
+ const raw = args.limit ?? 20;
215
+ const limit = Number.isFinite(raw) ? Math.min(Math.max(1, raw), 100) : 20;
214
216
  const { debates, total } = await client.getHistory(limit);
215
217
  if (debates.length === 0) {
216
218
  return {
@@ -246,6 +248,7 @@ async function handleGetHistory(client, args) {
246
248
  }
247
249
 
248
250
  // src/mcp/server.ts
251
+ import { fileURLToPath } from "url";
249
252
  var ALL_TOOLS = [
250
253
  runDebateTool,
251
254
  getModelStatusTool,
@@ -286,7 +289,7 @@ async function main() {
286
289
  const transport = new StdioServerTransport();
287
290
  await server.connect(transport);
288
291
  }
289
- if (import.meta.url === `file://${process.argv[1]}`) {
292
+ if (fileURLToPath(import.meta.url) === process.argv[1]) {
290
293
  main().catch((err) => {
291
294
  process.stderr.write(
292
295
  `DebateTalk MCP server error: ${err instanceof Error ? err.message : String(err)}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/server.ts","../../src/mcp/tools/run_debate.ts","../../src/mcp/tools/get_model_status.ts","../../src/mcp/tools/recommend_models.ts","../../src/mcp/tools/estimate_cost.ts","../../src/mcp/tools/get_history.ts"],"sourcesContent":["// Server is the low-level class needed for JSON Schema tool definitions.\n// McpServer (the replacement) requires Zod schemas — not compatible with our Tool[] approach.\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { DebateTalkClient } from \"../client.js\";\nimport { runDebateTool, handleRunDebate } from \"./tools/run_debate.js\";\nimport { getModelStatusTool, handleGetModelStatus } from \"./tools/get_model_status.js\";\nimport { recommendModelsTool, handleRecommendModels } from \"./tools/recommend_models.js\";\nimport { estimateCostTool, handleEstimateCost } from \"./tools/estimate_cost.js\";\nimport { getHistoryTool, handleGetHistory } from \"./tools/get_history.js\";\n\nexport const ALL_TOOLS = [\n runDebateTool,\n getModelStatusTool,\n recommendModelsTool,\n estimateCostTool,\n getHistoryTool,\n];\n\nfunction createServer(client: DebateTalkClient): Server {\n const server = new Server(\n { name: \"debatetalk\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: ALL_TOOLS,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args = {} } = request.params;\n\n switch (name) {\n case \"run_debate\":\n return handleRunDebate(client, args as Parameters<typeof handleRunDebate>[1]);\n case \"get_model_status\":\n return handleGetModelStatus(client);\n case \"recommend_models\":\n return handleRecommendModels(client, args as Parameters<typeof handleRecommendModels>[1]);\n case \"estimate_cost\":\n return handleEstimateCost(client, args as Parameters<typeof handleEstimateCost>[1]);\n case \"get_history\":\n return handleGetHistory(client, args as Parameters<typeof handleGetHistory>[1]);\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n });\n\n return server;\n}\n\nasync function main() {\n const client = new DebateTalkClient();\n const server = createServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n// Only start the server when run directly, not when imported in tests\nif (import.meta.url === `file://${process.argv[1]}`) {\n main().catch((err: unknown) => {\n process.stderr.write(\n `DebateTalk MCP server error: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n });\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const runDebateTool: Tool = {\n name: \"run_debate\",\n description:\n \"Run a structured multi-model AI debate on any question. Use this tool when the user asks to 'debate', 'use DebateTalk', 'use DT', 'multi-model', 'get a second opinion', 'stress-test' an idea, or wants multiple AI perspectives on a decision. \" +\n \"Also use it proactively for high-stakes decisions where a single AI answer is insufficient — architecture choices, hiring decisions, strategic bets, predictions, or anything with genuine uncertainty. \" +\n \"Multiple AI models argue independently in a blind round, deliberate, and converge on a 4-part synthesis: \" +\n \"Strong Ground (what all models agree on), Fault Lines (genuine disagreements), \" +\n \"Blind Spots (what all models missed), and Your Call (actionable recommendation). \" +\n \"Requires an API key (Pro or Enterprise plan). Free tier: 5 debates/day.\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description:\n \"The question or topic to debate. Can be a decision, prediction, factual question, or open-ended topic.\",\n },\n models: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Specific model IDs to use as debaters (e.g. [\\\"claude-opus-4-6\\\", \\\"gpt-5.4\\\"]). \" +\n \"Omit to let DebateTalk smart routing pick the best panel automatically.\",\n },\n rounds: {\n type: \"number\",\n description: \"Number of deliberation rounds (default: 2, max depends on plan)\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleRunDebate(\n client: DebateTalkClient,\n args: { question: string; models?: string[]; rounds?: number }\n) {\n const result = await client.runDebate(args);\n\n if (!result.synthesis) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `debate completed — ${result.debate_id} — but synthesis was not produced. Check your plan limits at https://console.debatetalk.ai`,\n },\n ],\n };\n }\n\n const { strong_ground, fault_lines, blind_spots, your_call } =\n result.synthesis;\n\n const modelList =\n result.models.length > 0 ? result.models.join(\", \") : \"smart routing\";\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `DebateTalk — ${result.question_type} question`,\n `Question: \"${result.question}\"`,\n `Models: ${modelList}`,\n `Debate ID: ${result.debate_id}`,\n ``,\n `━━━ Strong Ground ━━━`,\n `What all models agreed on:`,\n strong_ground,\n ``,\n `━━━ Fault Lines ━━━`,\n `Where models genuinely disagreed:`,\n fault_lines,\n ``,\n `━━━ Blind Spots ━━━`,\n `What all models missed:`,\n blind_spots,\n ``,\n `━━━ Your Call ━━━`,\n your_call,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const getModelStatusTool: Tool = {\n name: \"get_model_status\",\n description:\n \"Get real-time health, latency, and uptime for all DebateTalk models. \" +\n \"Use this before running a debate to check which models are currently online. \" +\n \"No API key required.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport async function handleGetModelStatus(client: DebateTalkClient) {\n const { models, updated_at } = await client.getModelStatus();\n\n const rows = models\n .map((m) => {\n const latency = m.latency_ms != null ? `${m.latency_ms}ms` : \"—\";\n const uptime =\n m.uptime_pct != null ? `${m.uptime_pct.toFixed(1)}%` : \"—\";\n const statusIcon =\n m.status === \"online\" ? \"✓\" : m.status === \"degraded\" ? \"⚠\" : \"✗\";\n return `${statusIcon} ${m.display_name} (${m.provider}) — ${m.status}, latency: ${latency}, uptime: ${uptime}`;\n })\n .join(\"\\n\");\n\n const online = models.filter((m) => m.status === \"online\").length;\n const total = models.length;\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Model Status — ${online}/${total} online (updated ${updated_at})\\n\\n${rows}`,\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const recommendModelsTool: Tool = {\n name: \"recommend_models\",\n description:\n \"Get the best model panel recommended by DebateTalk smart routing for a specific question. \" +\n \"Returns the ideal debaters, synthesizer, and adjudicator based on the question type. \" +\n \"No API key required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question or topic you want to debate\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleRecommendModels(\n client: DebateTalkClient,\n args: { question: string }\n) {\n const rec = await client.recommendModels(args.question);\n\n const debaterList = rec.debaters.join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Recommended panel for \"${args.question}\"`,\n `Question type: ${rec.question_type}`,\n ``,\n `Debaters: ${debaterList}`,\n `Synthesizer: ${rec.synthesizer}`,\n `Adjudicator: ${rec.adjudicator}`,\n ``,\n `To use this panel, run a debate with models: ${rec.debaters.join(\", \")}`,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const estimateCostTool: Tool = {\n name: \"estimate_cost\",\n description:\n \"Estimate the credit cost of a debate before running it. \" +\n \"Returns total credits, USD cost, and a per-model breakdown. \" +\n \"Requires an API key (Pro or Enterprise plan).\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question to estimate cost for\",\n },\n models: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific model IDs to use (omit for smart routing)\",\n },\n rounds: {\n type: \"number\",\n description: \"Number of deliberation rounds (default: 2)\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleEstimateCost(\n client: DebateTalkClient,\n args: { question: string; models?: string[]; rounds?: number }\n) {\n const estimate = await client.estimateCost(args);\n\n const breakdownRows = estimate.breakdown\n .map(\n (b) =>\n ` • ${b.model} (${b.role}): ~${b.estimated_tokens.toLocaleString()} tokens = ${b.estimated_credits} credits`\n )\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Cost estimate for \"${args.question}\"`,\n ``,\n `Total: ${estimate.estimated_credits} credits (~$${estimate.estimated_usd.toFixed(2)} USD)`,\n ``,\n `Breakdown:`,\n breakdownRows,\n ``,\n `Credits refill automatically on Pro plans. View balance at https://console.debatetalk.ai`,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const getHistoryTool: Tool = {\n name: \"get_history\",\n description:\n \"Retrieve your past DebateTalk debates. \" +\n \"Returns debate titles, dates, model counts, and share links. \" +\n \"Requires an API key (Pro or Enterprise plan).\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Number of debates to return (default: 20, max: 100)\",\n },\n },\n },\n};\n\nexport async function handleGetHistory(\n client: DebateTalkClient,\n args: { limit?: number }\n) {\n const limit = args.limit ?? 20;\n const { debates, total } = await client.getHistory(limit);\n\n if (debates.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No debates found. Run your first debate at https://console.debatetalk.ai\",\n },\n ],\n };\n }\n\n const rows = debates.map((d) => {\n const date = new Date(d.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n const shareLink = d.share_token\n ? ` — https://console.debatetalk.ai/share/${d.share_token}`\n : \"\";\n return `• [${date}] ${d.title} (${d.model_count} models, ${d.status})${shareLink}`;\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Debate history — showing ${debates.length} of ${total}`,\n ``,\n ...rows,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n"],"mappings":";;;;;;AAGA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACLA,IAAM,gBAAsB;AAAA,EACjC,MAAM;AAAA,EACN,aACE;AAAA,EAMF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,aACE;AAAA,MAEJ;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,UAAU;AAAA,EACvB;AACF;AAEA,eAAsB,gBACpB,QACA,MACA;AACA,QAAM,SAAS,MAAM,OAAO,UAAU,IAAI;AAE1C,MAAI,CAAC,OAAO,WAAW;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,2BAAsB,OAAO,SAAS;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,eAAe,aAAa,aAAa,UAAU,IACzD,OAAO;AAET,QAAM,YACJ,OAAO,OAAO,SAAS,IAAI,OAAO,OAAO,KAAK,IAAI,IAAI;AAExD,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,qBAAgB,OAAO,aAAa;AAAA,UACpC,cAAc,OAAO,QAAQ;AAAA,UAC7B,WAAW,SAAS;AAAA,UACpB,cAAc,OAAO,SAAS;AAAA,UAC9B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;ACpFO,IAAM,qBAA2B;AAAA,EACtC,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,EACf;AACF;AAEA,eAAsB,qBAAqB,QAA0B;AACnE,QAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,OAAO,eAAe;AAE3D,QAAM,OAAO,OACV,IAAI,CAAC,MAAM;AACV,UAAM,UAAU,EAAE,cAAc,OAAO,GAAG,EAAE,UAAU,OAAO;AAC7D,UAAM,SACJ,EAAE,cAAc,OAAO,GAAG,EAAE,WAAW,QAAQ,CAAC,CAAC,MAAM;AACzD,UAAM,aACJ,EAAE,WAAW,WAAW,WAAM,EAAE,WAAW,aAAa,WAAM;AAChE,WAAO,GAAG,UAAU,IAAI,EAAE,YAAY,KAAK,EAAE,QAAQ,YAAO,EAAE,MAAM,cAAc,OAAO,aAAa,MAAM;AAAA,EAC9G,CAAC,EACA,KAAK,IAAI;AAEZ,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AAC3D,QAAM,QAAQ,OAAO;AAErB,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,uBAAkB,MAAM,IAAI,KAAK,oBAAoB,UAAU;AAAA;AAAA,EAAQ,IAAI;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AACF;;;ACrCO,IAAM,sBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,UAAU;AAAA,EACvB;AACF;AAEA,eAAsB,sBACpB,QACA,MACA;AACA,QAAM,MAAM,MAAM,OAAO,gBAAgB,KAAK,QAAQ;AAEtD,QAAM,cAAc,IAAI,SAAS,KAAK,IAAI;AAE1C,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,0BAA0B,KAAK,QAAQ;AAAA,UACvC,kBAAkB,IAAI,aAAa;AAAA,UACnC;AAAA,UACA,aAAa,WAAW;AAAA,UACxB,gBAAgB,IAAI,WAAW;AAAA,UAC/B,gBAAgB,IAAI,WAAW;AAAA,UAC/B;AAAA,UACA,gDAAgD,IAAI,SAAS,KAAK,IAAI,CAAC;AAAA,QACzE,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;AC3CO,IAAM,mBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,UAAU;AAAA,EACvB;AACF;AAEA,eAAsB,mBACpB,QACA,MACA;AACA,QAAM,WAAW,MAAM,OAAO,aAAa,IAAI;AAE/C,QAAM,gBAAgB,SAAS,UAC5B;AAAA,IACC,CAAC,MACC,YAAO,EAAE,KAAK,KAAK,EAAE,IAAI,OAAO,EAAE,iBAAiB,eAAe,CAAC,aAAa,EAAE,iBAAiB;AAAA,EACvG,EACC,KAAK,IAAI;AAEZ,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,sBAAsB,KAAK,QAAQ;AAAA,UACnC;AAAA,UACA,UAAU,SAAS,iBAAiB,eAAe,SAAS,cAAc,QAAQ,CAAC,CAAC;AAAA,UACpF;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;ACzDO,IAAM,iBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,iBACpB,QACA,MACA;AACA,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO,WAAW,KAAK;AAExD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,IAAI,CAAC,MAAM;AAC9B,UAAM,OAAO,IAAI,KAAK,EAAE,UAAU,EAAE,mBAAmB,SAAS;AAAA,MAC9D,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AACD,UAAM,YAAY,EAAE,cAChB,+CAA0C,EAAE,WAAW,KACvD;AACJ,WAAO,WAAM,IAAI,KAAK,EAAE,KAAK,KAAK,EAAE,WAAW,YAAY,EAAE,MAAM,IAAI,SAAS;AAAA,EAClF,CAAC;AAED,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,iCAA4B,QAAQ,MAAM,OAAO,KAAK;AAAA,UACtD;AAAA,UACA,GAAG;AAAA,QACL,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;AL9CO,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,aAAa,QAAkC;AACtD,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,cAAc,SAAS,QAAQ;AAAA,IACvC,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,EAChC;AAEA,SAAO,kBAAkB,wBAAwB,aAAa;AAAA,IAC5D,OAAO;AAAA,EACT,EAAE;AAEF,SAAO,kBAAkB,uBAAuB,OAAO,YAAY;AACjE,UAAM,EAAE,MAAM,WAAW,OAAO,CAAC,EAAE,IAAI,QAAQ;AAE/C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,gBAAgB,QAAQ,IAA6C;AAAA,MAC9E,KAAK;AACH,eAAO,qBAAqB,MAAM;AAAA,MACpC,KAAK;AACH,eAAO,sBAAsB,QAAQ,IAAmD;AAAA,MAC1F,KAAK;AACH,eAAO,mBAAmB,QAAQ,IAAgD;AAAA,MACpF,KAAK;AACH,eAAO,iBAAiB,QAAQ,IAA8C;AAAA,MAChF;AACE,cAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,IAC3C;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,eAAe,OAAO;AACpB,QAAM,SAAS,IAAI,iBAAiB;AACpC,QAAM,SAAS,aAAa,MAAM;AAClC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;AAGA,IAAI,YAAY,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,IAAI;AACnD,OAAK,EAAE,MAAM,CAAC,QAAiB;AAC7B,YAAQ,OAAO;AAAA,MACb,gCAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA;AAAA,IAClF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../src/mcp/server.ts","../../src/mcp/tools/run_debate.ts","../../src/mcp/tools/get_model_status.ts","../../src/mcp/tools/recommend_models.ts","../../src/mcp/tools/estimate_cost.ts","../../src/mcp/tools/get_history.ts"],"sourcesContent":["// Server is the low-level class needed for JSON Schema tool definitions.\n// McpServer (the replacement) requires Zod schemas — not compatible with our Tool[] approach.\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { DebateTalkClient } from \"../client.js\";\nimport { runDebateTool, handleRunDebate } from \"./tools/run_debate.js\";\nimport { getModelStatusTool, handleGetModelStatus } from \"./tools/get_model_status.js\";\nimport { recommendModelsTool, handleRecommendModels } from \"./tools/recommend_models.js\";\nimport { estimateCostTool, handleEstimateCost } from \"./tools/estimate_cost.js\";\nimport { getHistoryTool, handleGetHistory } from \"./tools/get_history.js\";\n\nexport const ALL_TOOLS = [\n runDebateTool,\n getModelStatusTool,\n recommendModelsTool,\n estimateCostTool,\n getHistoryTool,\n];\n\nfunction createServer(client: DebateTalkClient): Server {\n const server = new Server(\n { name: \"debatetalk\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: ALL_TOOLS,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args = {} } = request.params;\n\n switch (name) {\n case \"run_debate\":\n return handleRunDebate(client, args as Parameters<typeof handleRunDebate>[1]);\n case \"get_model_status\":\n return handleGetModelStatus(client);\n case \"recommend_models\":\n return handleRecommendModels(client, args as Parameters<typeof handleRecommendModels>[1]);\n case \"estimate_cost\":\n return handleEstimateCost(client, args as Parameters<typeof handleEstimateCost>[1]);\n case \"get_history\":\n return handleGetHistory(client, args as Parameters<typeof handleGetHistory>[1]);\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n });\n\n return server;\n}\n\nasync function main() {\n const client = new DebateTalkClient();\n const server = createServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n// Only start the server when run directly, not when imported in tests.\n// fileURLToPath handles Windows drive letter differences vs process.argv[1].\nimport { fileURLToPath } from \"url\";\nif (fileURLToPath(import.meta.url) === process.argv[1]) {\n main().catch((err: unknown) => {\n process.stderr.write(\n `DebateTalk MCP server error: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n });\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const runDebateTool: Tool = {\n name: \"run_debate\",\n description:\n \"Run a structured multi-model AI debate on any question. Use this tool when the user asks to 'debate', 'use DebateTalk', 'use DT', 'multi-model', 'multi model', 'get a second opinion', 'stress-test' an idea, or wants multiple AI perspectives on a decision. \" +\n \"Also use it proactively for high-stakes decisions where a single AI answer is insufficient — architecture choices, hiring decisions, strategic bets, predictions, or anything with genuine uncertainty. \" +\n \"Multiple AI models argue independently in a blind round, deliberate, and converge on a 4-part synthesis: \" +\n \"Strong Ground (what all models agree on), Fault Lines (genuine disagreements), \" +\n \"Blind Spots (what all models missed), and Your Call (actionable recommendation). \" +\n \"Requires an API key (Pro or Enterprise plan). Free tier: 5 debates/day.\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description:\n \"The question or topic to debate. Can be a decision, prediction, factual question, or open-ended topic.\",\n },\n models: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Specific model IDs to use as debaters (e.g. [\\\"claude-opus-4-6\\\", \\\"gpt-5.4\\\"]). \" +\n \"Omit to let DebateTalk smart routing pick the best panel automatically.\",\n },\n rounds: {\n type: \"number\",\n description: \"Number of deliberation rounds (default: 2, max depends on plan)\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleRunDebate(\n client: DebateTalkClient,\n args: { question: string; models?: string[]; rounds?: number }\n) {\n const result = await client.runDebate(args);\n\n if (!result.synthesis) {\n const id = result.debate_id ? `Debate ${result.debate_id}` : \"Debate\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `${id} completed but synthesis was not produced. Check your plan limits at https://console.debatetalk.ai`,\n },\n ],\n };\n }\n\n const { strong_ground, fault_lines, blind_spots, your_call } =\n result.synthesis;\n\n const modelList =\n result.models.length > 0 ? result.models.join(\", \") : \"smart routing\";\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `DebateTalk — ${result.question_type} question`,\n `Question: \"${result.question}\"`,\n `Models: ${modelList}`,\n `Debate ID: ${result.debate_id}`,\n ``,\n `━━━ Strong Ground ━━━`,\n `What all models agreed on:`,\n strong_ground,\n ``,\n `━━━ Fault Lines ━━━`,\n `Where models genuinely disagreed:`,\n fault_lines,\n ``,\n `━━━ Blind Spots ━━━`,\n `What all models missed:`,\n blind_spots,\n ``,\n `━━━ Your Call ━━━`,\n your_call,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const getModelStatusTool: Tool = {\n name: \"get_model_status\",\n description:\n \"Get real-time health, latency, and uptime for all DebateTalk models. \" +\n \"Use this before running a debate to check which models are currently online. \" +\n \"No API key required.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport async function handleGetModelStatus(client: DebateTalkClient) {\n const { models, updated_at } = await client.getModelStatus();\n\n const rows = models\n .map((m) => {\n const latency = m.latency_ms != null ? `${m.latency_ms}ms` : \"—\";\n const uptime =\n m.uptime_pct != null ? `${m.uptime_pct.toFixed(1)}%` : \"—\";\n const statusIcon =\n m.status === \"online\" ? \"✓\" : m.status === \"degraded\" ? \"⚠\" : \"✗\";\n return `${statusIcon} ${m.display_name} (${m.provider}) — ${m.status}, latency: ${latency}, uptime: ${uptime}`;\n })\n .join(\"\\n\");\n\n const online = models.filter((m) => m.status === \"online\").length;\n const total = models.length;\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Model Status — ${online}/${total} online (updated ${updated_at})\\n\\n${rows}`,\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const recommendModelsTool: Tool = {\n name: \"recommend_models\",\n description:\n \"Get the best model panel recommended by DebateTalk smart routing for a specific question. \" +\n \"Returns the ideal debaters, synthesizer, and adjudicator based on the question type. \" +\n \"No API key required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question or topic you want to debate\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleRecommendModels(\n client: DebateTalkClient,\n args: { question: string }\n) {\n const rec = await client.recommendModels(args.question);\n\n const debaterList = rec.debaters.join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Recommended panel for \"${args.question}\"`,\n `Question type: ${rec.question_type}`,\n ``,\n `Debaters: ${debaterList}`,\n `Synthesizer: ${rec.synthesizer}`,\n `Adjudicator: ${rec.adjudicator}`,\n ``,\n `To use this panel, run a debate with models: ${rec.debaters.join(\", \")}`,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const estimateCostTool: Tool = {\n name: \"estimate_cost\",\n description:\n \"Estimate the credit cost of a debate before running it. \" +\n \"Returns total credits, USD cost, and a per-model breakdown. \" +\n \"Requires an API key (Pro or Enterprise plan).\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question to estimate cost for\",\n },\n models: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific model IDs to use (omit for smart routing)\",\n },\n rounds: {\n type: \"number\",\n description: \"Number of deliberation rounds (default: 2)\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleEstimateCost(\n client: DebateTalkClient,\n args: { question: string; models?: string[]; rounds?: number }\n) {\n const estimate = await client.estimateCost(args);\n\n const breakdownRows = estimate.breakdown\n .map(\n (b) =>\n ` • ${b.model} (${b.role}): ~${b.estimated_tokens.toLocaleString()} tokens = ${b.estimated_credits} credits`\n )\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Cost estimate for \"${args.question}\"`,\n ``,\n `Total: ${estimate.estimated_credits} credits (~$${estimate.estimated_usd.toFixed(2)} USD)`,\n ``,\n `Breakdown:`,\n breakdownRows,\n ``,\n `Credits refill automatically on Pro plans. View balance at https://console.debatetalk.ai`,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const getHistoryTool: Tool = {\n name: \"get_history\",\n description:\n \"Retrieve your past DebateTalk debates. \" +\n \"Returns debate titles, dates, model counts, and share links. \" +\n \"Requires an API key (Pro or Enterprise plan).\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Number of debates to return (default: 20, max: 100)\",\n },\n },\n },\n};\n\nexport async function handleGetHistory(\n client: DebateTalkClient,\n args: { limit?: number }\n) {\n const raw = args.limit ?? 20;\n const limit = Number.isFinite(raw) ? Math.min(Math.max(1, raw), 100) : 20;\n const { debates, total } = await client.getHistory(limit);\n\n if (debates.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No debates found. Run your first debate at https://console.debatetalk.ai\",\n },\n ],\n };\n }\n\n const rows = debates.map((d) => {\n const date = new Date(d.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n const shareLink = d.share_token\n ? ` — https://console.debatetalk.ai/share/${d.share_token}`\n : \"\";\n return `• [${date}] ${d.title} (${d.model_count} models, ${d.status})${shareLink}`;\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Debate history — showing ${debates.length} of ${total}`,\n ``,\n ...rows,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@debatetalk/mcp",
3
- "version": "1.0.1",
3
+ "version": "1.0.4",
4
4
  "description": "Official MCP server and CLI for DebateTalk — run structured multi-model AI debates from your AI assistant or terminal.",
5
5
  "keywords": [
6
6
  "mcp",
@@ -27,7 +27,9 @@
27
27
  "files": [
28
28
  "dist",
29
29
  "README.md",
30
- "LICENSE"
30
+ "LICENSE",
31
+ ".mcp.json",
32
+ ".claude-plugin"
31
33
  ],
32
34
  "scripts": {
33
35
  "build": "tsup",