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.
npm install @vibestreet/sdkpip install vibestreetGenerated types
Each listing declares a request and response schema. The generator turns those into real types.
npx @vibestreet/sdk generate \
--listings hepatic-referral-triage,sme-lending-decision-logic \
--out src/vibestreet.gen.tsimport { 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
Python
Same shape, same names, synchronous and async clients.
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.
{
"mcpServers": {
"vibestreet": {
"command": "npx",
"args": ["-y", "@vibestreet/mcp"],
"env": { "VIBESTREET_KEY": "vs_live_…" }
}
}
}What the agent sees
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.
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.