get_pricing_dashboard
Retrieve structured pricing plans, market statistics, pricing gap analysis, and AI-driven insights for all competitors. Use this tool for an up-to-date snapshot to inform competitive pricing strategy.
Instructions
Get the latest Pricing Intelligence for all competitors. Returns structured pricing plans (name, price, billing interval, summary — up to 5 plans per competitor), market pricing statistics, pricing gap analysis, and AI analysis with insights and actions. Use this for the current snapshot; use get_pricing_history for past runs. Read-only. Returns JSON object.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID (from list_projects) |
Implementation Reference
- src/tools.ts:220-229 (schema)Tool definition (schema) for 'get_pricing_dashboard' — defines name, description, Zod-validated parameters (projectId as 24-char hex string), and path builder (GET /v1/projects/{projectId}/pricing). This is where the tool's input contract and API endpoint are specified.
// ── Pricing ─────────────────────────────────────────────── { name: "get_pricing_dashboard", description: "Get the latest Pricing Intelligence for all competitors. Returns structured pricing plans (name, price, billing interval, summary — up to 5 plans per competitor), market pricing statistics, pricing gap analysis, and AI analysis with insights and actions. Use this for the current snapshot; use get_pricing_history for past runs. Read-only. Returns JSON object.", parameters: z.object({ projectId: objectId("Project ID (from list_projects)"), }), path: (a) => `/v1/projects/${a.projectId}/pricing`, }, - src/index.ts:16-25 (registration)Generic tool registration loop that iterates over all tool definitions (including get_pricing_dashboard) and registers them with the MCP server via server.tool(). The tool's name, description, Zod schema shape, and an async handler that calls apiGet with the constructed path are provided.
for (const tool of tools) { server.tool(tool.name, tool.description, tool.parameters.shape, async (args: Record<string, any>) => { const path = tool.path(args); const query: Record<string, any> = {}; for (const key of tool.queryParams ?? []) { if (args[key] !== undefined) query[key] = args[key]; } return apiGet(path, Object.keys(query).length ? query : undefined); }); } - src/api-client.ts:1-58 (helper)API client helper — apiGet() function that makes authenticated GET requests to the CompetLab API. Used by the generic tool handler to execute the actual HTTP request for get_pricing_dashboard.
const API_BASE = "https://api.competlab.com"; export async function apiGet( path: string, query?: Record<string, string | number>, ): Promise<{ content: Array<{ type: "text"; text: string }>; isError?: true }> { const apiKey = process.env.COMPETLAB_API_KEY; if (!apiKey) { return { content: [ { type: "text", text: JSON.stringify({ error: "api_key_missing", message: "COMPETLAB_API_KEY environment variable is not set", }), }, ], isError: true, }; } const url = new URL(`${API_BASE}${path}`); if (query) { for (const [k, v] of Object.entries(query)) { if (v !== undefined) url.searchParams.set(k, String(v)); } } try { const res = await fetch(url, { headers: { "CL-API-Key": apiKey }, }); const body = await res.text(); if (!res.ok) { return { content: [{ type: "text", text: body }], isError: true }; } return { content: [{ type: "text", text: body }] }; } catch (err) { return { content: [ { type: "text", text: JSON.stringify({ error: "api_unreachable", message: err instanceof Error ? err.message : "Failed to reach CompetLab API", status: 503, }), }, ], isError: true, }; } }