Skip to content

SDK

Typed against the listing, not against the platform.

The interesting thing a Vibestreet client can do is generate types from a listing's declared schema — so the compiler knows what a hepatology triage endpoint expects, without anyone hand-writing an interface for it.

Install

Two official clients, one config file for MCP.

TypeScript
npm install @vibestreet/sdk
Python
pip install vibestreet

Generated types

Each listing declares a request and response schema. The generator turns those into real types.

Generate
npx @vibestreet/sdk generate \
  --listings hepatic-referral-triage,sme-lending-decision-logic \
  --out src/vibestreet.gen.ts
Use them
import { Vibestreet } from "@vibestreet/sdk";
import type { HepaticReferralTriage } from "./vibestreet.gen";

const vs = new Vibestreet({ apiKey: process.env.VIBESTREET_KEY! });

// Fully typed both ways — a missing `patient_age` is a build error,
// and `result.priority` is a union, not a string.
const result: HepaticReferralTriage.Response = await vs.call(
  "hepatic-referral-triage",
  { referral_text: letter, patient_age: 54 },
);

Note

Regenerate when a listing's version changes

Schemas are versioned with the listing. The generator writes the version it saw into the file, and the client warns at runtime if the live listing has moved on — so a silently changed contract shows up as a warning rather than as a strange bug.

Python

Same shape, same names, synchronous and async clients.

Python
from vibestreet import Vibestreet

vs = Vibestreet(api_key=os.environ["VIBESTREET_KEY"])

result = vs.call(
    "sme-lending-decision-logic",
    applicant=applicant,
    financials=financials,
    facility=facility,
)

if result.decision == "refer":
    queue_for_human(result.missing)

MCP

For agent platforms that speak Model Context Protocol, a listing is just a tool.

Point the MCP server at your key and it exposes every listing you have access to as a callable tool, with the listing's own schema as the tool schema and the creator's credential in the tool description — so the agent choosing between two tools can see which one is backed by a licensed professional.

mcp.json
{
  "mcpServers": {
    "vibestreet": {
      "command": "npx",
      "args": ["-y", "@vibestreet/mcp"],
      "env": { "VIBESTREET_KEY": "vs_live_…" }
    }
  }
}

What the agent sees

Tool description, as presented to the model
hepatic_referral_triage
  Sorts liver referrals into urgent, routine and returnable.
  Creator: Amara Dosunmu — Consultant hepatologist, 19 years.
  Credential: General Medical Council 6142880, verified.
  Declines rather than guessing when confidence < 0.4.

That last line matters more than it looks. An agent that knows a tool can decline handles the decline; one that does not will treat it as a failure and retry.

Errors in the client

Typed errors, so the branches you have to handle are visible at the call site.

TypeScript
import { VibestreetError } from "@vibestreet/sdk";

try {
  await vs.call("kyc-file-completeness", file);
} catch (error) {
  if (error instanceof VibestreetError) {
    switch (error.code) {
      case "policy_blocked":
        // Your organisation's usage policy stopped this.
        return notifyOwner(error.policy);
      case "certification_expired":
        // The creator's licence lapsed. Fail loudly.
        return escalate(error.listingId);
      case "rate_limited":
        return retryAfter(error.retryAfter);
    }
  }
  throw error;
}

The client never retries a 402 or a 403 for you. Retrying a payment or a policy failure just spends the rate limit on a call that was never going to succeed.