Developer · MCP server · v0.1

Drishti × MCP.

Drive brand-locked generation from Claude Code, Cursor, Windsurf — or any MCP-compatible client. Fourteen tools — generation, brand vault, batch fan-out, marketplace export — on the protocol the agentic clients already speak.

  • MCP 2024-11-05
  • HTTP transport
  • Bearer auth
  • 23 tools · 8 prompts · 4 resources shipped
Transport
https://13-204-237-151.nip.io/api/mcp
Protocol
MCP 2024-11-05 (JSON-RPC 2.0)
Server info
drishti-mcp · 0.1.0
Tested clients
  • Claude Desktop / Claude Code
  • Cursor
  • Windsurf
  • Anything that speaks JSON-RPC over HTTP
Why MCP

The agent already knows how to call tools — give it the right ones.

The Model Context Protocol is Anthropic's open standard for letting AI clients call into external services through a uniform tool-calling interface. Instead of teaching a new SDK to every model, you teach the model one protocol — and any compliant server, including Drishti, becomes available to the agent immediately.

Drishti exposes generation, brand-vault reads + writes, and pagination through MCP so an agentic workflow can read brand state, pick a mode, upload a reference, generate, and verify fidelity — all without the human switching apps. The agent stays in Claude or Cursor; the photoshoot happens in Drishti; the verified output lands in your library.

All twenty-three tools mirror the REST API surface where it exists, with extras for async-job orchestration, workspace introspection, Brand Vault bootstrap, and brand discovery. Image-bearing tools (list_recent, get_generation, upload_reference, verify_image, brand_vault_get, list_brands) return inline JPEG thumbnails alongside the structured JSON so agents have visual context for the next reasoning step. Same auth. Same audit log. The difference is the shipping container: MCP is structured for the agent loop, with tools/list introspection so the model picks the right tool without a hand-written switch.

What an agent can do today
  1. 01Call list_modes to enumerate every mode.
  2. 02Call brand_vault_get to read locks + recipes.
  3. 03Call upload_reference to stash a base64 image.
  4. 04Call generate_image and surface the queued ID.
  5. 05Poll list_recent for the verdict + fidelity score.
Install

One paste in Claude.ai. One command in Claude Code.

Drishti speaks the MCP HTTP transport with OAuth 2.1 + PKCE — the same Custom Connector contract Anthropic ships in Claude.ai. Paste the URL, sign in, approve the consent screen, done. No API key to copy around, no header to configure. For Claude Code and other terminal clients you can still use a static Bearer key.

Claude.ai — Custom Connector (recommended)
https://13-204-237-151.nip.io/api/mcp

Claude.ai → Settings → Connectors → Add custom connector. Paste the URL above, Claude.ai will discover the OAuth endpoints via /.well-known/oauth-protected-resource, register itself dynamically (RFC 7591), and open the consent page. Approve once and every Claude.ai chat in your workspace can call all twenty-three Drishti tools — plus pick from eight one-click marketing presets exposed via MCP's prompts surface.

First use of each tool prompts a one-time Always allow / Deny dialog inside the Claude.ai chat — that's Claude.ai's per-tool consent gate, not a Drishti hang. Click Always allow to remember the choice. If Drishti ships a new tool, disconnect + reconnect the connector from Claude.ai's Connectors panel to refresh the tool manifest (Claude.ai caches it at connect-time).

Claude Code / Claude Desktop (static key)
claude mcp add drishti --transport http \
  https://13-204-237-151.nip.io/api/mcp \
  --header "Authorization: Bearer dr_live_…"

Live endpoint is https://13-204-237-151.nip.io/api/mcp — that's the URL to paste today. Once the production domain lands we'll publish both the new hostname and a 90-day overlap note here so live integrations don't break.

Cursor

Edit ~/.cursor/mcp.json (or %APPDATA%/Cursor/mcp.json on Windows):

{
  "mcpServers": {
    "drishti": {
      "url": "https://13-204-237-151.nip.io/api/mcp",
      "transport": "http",
      "headers": {
        "Authorization": "Bearer dr_live_…"
      }
    }
  }
}
Generic mcp.json (Windsurf, Continue, Cline, …)
{
  "servers": {
    "drishti": {
      "transport": "http",
      "url": "https://13-204-237-151.nip.io/api/mcp",
      "headers": {
        "Authorization": "Bearer dr_live_…"
      }
    }
  }
}
✓ ENDPOINT VERIFIED

Tested today: POST https://13-204-237-151.nip.io/api/mcp with {"jsonrpc":"2.0","method":"initialize","id":1} returns server info + protocol version 2025-06-18. tools/list returns the 23 tools below.

The initialize and tools/list methods are open — your client can register the server and discover the tool list before you paste a token. Token-required tools fail with -32001 Unauthorized until the header is in place.

First conversation

What the agent says when it works.

A mock transcript of the smallest useful workflow: the agent introspects the server, picks the right mode, kicks off a generation, and surfaces the queued ID for polling.

  1. You
    @drishti list_modes
  2. Drishti
    {
      "modes": [
        { "slug": "studio_default",     "name": "Studio Default",     "creditsPerRun": 1 },
        { "slug": "marketplace_export", "name": "Marketplace Export", "creditsPerRun": 6 },
        { "slug": "multi_angle",        "name": "Multi-Angle",        "creditsPerRun": 4 },
        { "slug": "ingredient_explode", "name": "Ingredient Explosion","creditsPerRun": 3 },
        { "slug": "chaos",              "name": "Chaos 2.0",          "creditsPerRun": 18 }
        // …14 modes total
      ]
    }
  3. You
    @drishti generate_image { uploadKey: "uploads/ws/…/essence-50ml.jpg", uploadMime: "image/jpeg", modeSlug: "studio_default" }
  4. Drishti
    {
      "generationId": "f4a2e1b8-9c2d-4f5e-a3b1-8c2d4f5ea3b1",
      "status": "queued"
    }

    Queued. Poll list_recent in ~10 s to see the verdict + fidelity score.

Tools

Fourteen tools live today — the six most-used are documented below.

Every tool is callable via tools/call. The dispatcher parses arguments through a zod schema before reaching the handler — invalid shapes fail at the edge with -32602 and the failing field path inside data.

list_modesCatalog of generation modes.
+
Input
{ "activeOnly": true }
Output
{ "modes": [{ "slug": "studio_default", "name": "Studio Default", "creditsPerRun": 1, … }] }
Example
@drishti list_modes activeOnly=true
list_enginesStatic catalog of Gemini engines (Flash, Pro, Judge, Flash Preview).
+
Input
{}
Output
{ "engines": [{ "slug": "gemini_2_5_flash_image", "label": "Flash", "costMultiplier": 1.0 }, …] }
Example
@drishti list_engines
list_recentCursor-paginated list of recent generations scoped to your workspace.
+
Input
{
  "limit": 20,
  "status": "shipped",
  "brandId": "uuid",
  "cursor": "ISO timestamp"
}
Output
{
  "items": [{ "id": "…", "status": "shipped", "fidelityScore": 94, "verdict": "ship", "modeSlug": "studio_default", … }],
  "nextCursor": "2026-05-18T10:02:11Z"
}
Example
@drishti list_recent limit=5 status="shipped"
brand_vault_getFull Brand Vault snapshot: brand row + locks + refs + recipes + recent mistakes.
+
Input
{ "brandId": "uuid" }
Output
{
  "brand":   { "id": "…", "name": "Essence Nocturne", "completenessScore": 86 },
  "locks":   { "color": 100, "composition": 80, "typography": 90, "shape": 80 },
  "refs":    [ … ],
  "recipes": [ … ],
  "mistakes":[ … ]
}
Example
@drishti brand_vault_get brandId="7c8f…"
upload_referenceUpload a base64-encoded reference image (max ~30 MB decoded) into a brand's vault.
+
Input
{
  "base64":   "iVBORw0KGgoAAAANSU…",
  "mimeType": "image/png",
  "role":     "logo",
  "brandId":  "uuid"
}
Output
{
  "refId":   "3a91…",
  "s3Key":   "uploads/ws/…/brand/…/abc.png",
  "url":     "https://13-204-237-151.nip.io/storage/…",
  "bytes":   284711,
  "role":    "logo",
  "brandId": "7c8f…"
}
Example
@drishti upload_reference role="logo" brandId="7c8f…" base64="<…>"
generate_imageKick off a generation. Debits credits, returns a queued generationId for polling.
+
Input
{
  "uploadKey":  "uploads/ws/…/your-product.jpg",
  "uploadMime": "image/jpeg",
  "modeSlug":   "studio_default",
  "prompt":     "On a teakwood cyclorama, soft cobalt rim light.",
  "brandId":    "uuid"
}
Output
{ "generationId": "f4a2…", "status": "queued" }
Example
@drishti generate_image modeSlug="studio_default" uploadKey="…"
EIGHT MORE TOOLS LIVE

verify_image · brand_vault_set · estimate_cost · fix_one_thing · marketplace_export · batch_generate · recall_recipe · mistake_check.

Full input/output schemas land via POST {base}/api/mcp with {"method":"tools/list"} — MCP clients (Claude Code, Cursor, Windsurf) introspect at runtime so you never paste a stale schema.

Auth + scopes

Six scopes. One Bearer header.

Drishti API keys carry a scope array. The dispatcher checks the requested tool against the key's scope set before reaching the handler — a key without generate can browse modes and recent runs but cannot debit credits.

ScopeUnlocksNotes
read:genslist_modes · list_engines · list_recentRead-only catalog + history. Safe for status dashboards.
read:vaultbrand_vault_getFull brand snapshot including refs and recipes. No mutation.
write:vaultupload_referenceAdds a row to brand_refs; counts against storage quota.
generategenerate_imageDebits credits on call. Refund is automatic if fidelity < 75.
verify(reserved — P7.5 verify_image tool)Run the verifier against an existing output without re-generating.
admin:webhooks(reserved — P7.5 webhook subscribe/unsubscribe)Manage HMAC-signed event subscriptions.

New keys default to a balanced set: ["read:gens", "read:vault", "generate"]. Add write:vault for agentic workflows that need to push references; reserve admin:webhooks for the keys you trust with delivery secrets.

Protocol version

MCP 2024-11-05.

The initialize handler returns { "protocolVersion": "2024-11-05" } with empty capabilities.tools (no per-tool extensions yet). The server identifies itself as drishti-mcp · 0.1.0. We track the protocol on the same cadence as Anthropic's reference clients — when 2025-XX-YY ships, the negotiate step picks the highest version both sides understand.

POST /api/mcp
{ "jsonrpc":"2.0","id":1,"method":"initialize","params":{} }

→ {
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2024-11-05",
    "capabilities": { "tools": {} },
    "serverInfo": { "name": "drishti-mcp", "version": "0.1.0" }
  }
}

See the official MCP specification on Anthropic's docs for the full protocol grammar.

Open methods
  • initialize
  • ping
  • tools/list
  • notifications/cancelled

No Bearer required. Clients can introspect the server before a token is issued.

Authenticated method
  • tools/call

Anything that mutates state or debits credits runs here. Always requires Authorization: Bearer dr_….

What's not yet implemented

Honest gaps. Dated, not vague.

Twenty-three tools, eight prompts, OAuth 2.1, and inline image rendering all ship today. The gaps below are the surfaces we've already designed but not yet wired up — none of them block the workflows the current tools already cover.

  • Webhook subscriptions

    generation.shipped · generation.refunded · brand.completeness.changed. HMAC-SHA-256 signed. Replayable from the workspace dashboard.

  • Streaming responses

    MCP&apos;s SSE transport for long-running tools (especially chaos_start which fans out to 18 parallel runs). Until then, poll list_recent or wait_for_generation.

  • Resource subscriptions

    `drishti://modes`, `drishti://workspace`, `drishti://brands`, and `drishti://recent` ship as readable resources today. Live subscription (resources/updated push) is the next step — until then, clients re-read on demand.

  • Marketplace export presets

    Amazon · Flipkart · Myntra · Meesho profile-driven export with platform-specific aspect ratios + EXIF stripping. Today marketplace_export is a no-op stub.

Static API keys + OAuth 2.1 Custom Connector both work today. Mail admin@indigenservices.in for early access to the webhook + streaming preview.