{"endpoint":"https://api.gethavadis.co/api/mcp","protocol":"mcp/streamable-http","protocolVersion":"2024-11-05","serverVersion":"0.1.0","auth":{"scheme":"Bearer","tokenFormat":"havadis_<prefix>_<secret>","mintEndpoint":"https://api.gethavadis.co/api/tenants/current/api-keys"},"scopes":["brands:read","brands:write","content:read","topics:write","jobs:read","jobs:write","credits:read","billing:read"],"rateLimits":{"free":{"windowSeconds":60,"limit":60},"pro":{"windowSeconds":60,"limit":300},"pro_plus":{"windowSeconds":60,"limit":1000}},"tools":[{"name":"list_brands","description":"List the brands owned by the authenticated tenant. Use this to discover brand IDs before calling brand-scoped tools (e.g. list_content, create_job).","scopes":["brands:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}},{"name":"get_brand","description":"Fetch a single brand the authenticated tenant owns, including its description, logo and primary color. Returns 404-equivalent if the brand does not belong to the tenant.","scopes":["brands:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"brandId":{"type":"string","pattern":"^[a-f\\d]{24}$"}},"required":["brandId"],"additionalProperties":false}},{"name":"list_content","description":"List generated content for one of the tenant's brands, newest first. Pagination via `page`/`limit` (defaults: page=1, limit=20). Result items contain id, title, contentType and createdAt — call `get_content` for full body.","scopes":["content:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"page":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"limit":{"default":20,"type":"integer","exclusiveMinimum":0,"maximum":100},"brandId":{"type":"string","pattern":"^[a-f\\d]{24}$"}},"required":["page","limit","brandId"],"additionalProperties":false}},{"name":"get_content","description":"Fetch a single generated content item including its full body, summary and metadata blocks (SEO, AEO, GEO, social variants). The `brandId` must own the content — cross-brand fetches return null.","scopes":["content:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"brandId":{"type":"string","pattern":"^[a-f\\d]{24}$"},"contentId":{"type":"string","pattern":"^[a-f\\d]{24}$"}},"required":["brandId","contentId"],"additionalProperties":false}},{"name":"get_credit_balance","description":"Return the authenticated user's credit balance. Credits are pooled at the user level and never expire — they roll over indefinitely. `isUnlimited: true` users have no balance cap (`balance` is reported as 0 for them; check `isUnlimited` first).","scopes":["credits:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}},{"name":"get_credit_history","description":"Paginated credit ledger for the authenticated user. Each entry records a deduction, top-up, subscription grant or welcome bonus. Optional `brandId` narrows to one brand's spend.","scopes":["credits:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"page":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"limit":{"default":20,"type":"integer","exclusiveMinimum":0,"maximum":100},"brandId":{"type":"string","pattern":"^[a-f\\d]{24}$"}},"required":["page","limit"],"additionalProperties":false}},{"name":"get_subscription","description":"Return the tenant's current plan and Stripe subscription state: `plan` (free / pro / pro_plus), `subscriptionStatus`, `currentPeriodEnd`, `cancelAtPeriodEnd`, `canceledAt`. Free-tier tenants have null subscription fields. Use `list_plans` to discover upgrade targets.","scopes":["billing:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}},{"name":"list_plans","description":"List subscription plans available to the tenant — Pro and Pro+. Each plan exposes monthly price (cents), credits granted per month, and an `isCurrent` flag against the tenant's current plan. Stripe checkout / cancel actions are intentionally not exposed via MCP; manage subscriptions in the web dashboard.","scopes":["billing:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}},{"name":"list_jobs","description":"List content-generation jobs for a brand, newest first. Each item carries the job status (queued / running / completed / failed) and timing/credit summary. Use `get_job` for the full pipeline detail and recent agent logs.","scopes":["jobs:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"brandId":{"type":"string","pattern":"^[a-f\\d]{24}$"},"page":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"limit":{"default":20,"type":"integer","minimum":1,"maximum":50}},"required":["brandId","page","limit"],"additionalProperties":false}},{"name":"get_job","description":"Fetch a job along with its pipeline progress and recent agent logs. Poll this every 2-5 seconds while `status` is queued or running. `pipeline` lists each agent step with timing; `logs` is the latest activity feed (most recent last).","scopes":["jobs:read"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"brandId":{"type":"string","pattern":"^[a-f\\d]{24}$"},"jobId":{"type":"string","pattern":"^[a-f\\d]{24}$"},"logsLimit":{"default":50,"type":"integer","minimum":0,"maximum":200}},"required":["brandId","jobId","logsLimit"],"additionalProperties":false}},{"name":"create_brand","description":"Create a new brand for the authenticated tenant. Free-tier tenants are limited to 1 brand and will receive a `feature_locked` error on the second create attempt — upgrade to Pro for unlimited brands. The brand becomes the default automatically when it is the first one.","scopes":["brands:write"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"slug":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"logoUrl":{"default":null,"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"primaryColor":{"default":"#000000","type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"industry":{"default":"","type":"string","maxLength":100},"website":{"default":"","anyOf":[{"type":"string","format":"uri"},{"type":"string","const":""}]},"description":{"default":"","type":"string","maxLength":500}},"required":["name","logoUrl","primaryColor","industry","website","description"],"additionalProperties":false}},{"name":"suggest_topics","description":"Enqueue an LLM-driven topic discovery run for the brand. Costs 3 credits, charged when the run is enqueued. Returns immediately with `{runId, status, contentType}` — the run executes asynchronously on a worker and the resulting suggestions appear in the dashboard. Requires the brand to have a completed knowledge analysis.","scopes":["topics:write"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"brandId":{"type":"string","pattern":"^[a-f\\d]{24}$"},"contentType":{"default":"blog","type":"string","enum":["blog","instagram","x_thread"]},"language":{"default":"en","type":"string","minLength":2,"maxLength":5}},"required":["brandId","contentType","language"],"additionalProperties":false}},{"name":"create_job","description":"Enqueue a content-generation pipeline job. Costs depend on the tenant plan (free skips SEO/AEO/GEO). Free-tier tenants are limited to the 'short' word-count range; attempting 'medium', 'long' or 'unlimited' returns a `feature_locked` error. The pipeline runs asynchronously — poll `get_job` every 2-5s while `status` is queued or running.","scopes":["jobs:write"],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"contentType":{"type":"string","enum":["blog","instagram","x_thread"]},"brief":{"type":"string","minLength":10,"maxLength":4000},"styleUrls":{"default":[],"maxItems":10,"type":"array","items":{"type":"string","format":"uri"}},"researchUrls":{"default":[],"maxItems":10,"type":"array","items":{"type":"string","format":"uri"}},"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1}},"targetPersonaId":{"default":null,"anyOf":[{"type":"string"},{"type":"null"}]},"instructions":{"default":"","type":"string","maxLength":2000},"language":{"default":"en","type":"string","minLength":2,"maxLength":5},"wordCountRange":{"default":null,"anyOf":[{"type":"string","enum":["short","medium","long","unlimited"]},{"type":"null"}]},"suggestionId":{"default":null,"anyOf":[{"type":"string"},{"type":"null"}]},"brandId":{"type":"string","pattern":"^[a-f\\d]{24}$"}},"required":["contentType","brief","styleUrls","researchUrls","keywords","targetPersonaId","instructions","language","wordCountRange","suggestionId","brandId"],"additionalProperties":false}}]}