TypeScript REST client for the Indraft API, providing typed access to workspace management, custom objects, billing, and MCP connections
Indraft SDK exposes 12 tools with clear verb-noun naming (usage, checkout, listConnections, etc.) and generally good descriptions (avg ~120 chars). However, critical gaps exist: most tools lack documented output schemas, parameter descriptions are sparse or missing entirely, and error handling guidance is absent. Tools like listStaleRecords have partial parameter documentation but no return type specification. The SDK is hand-written against internal contracts, which is good for consistency, but those contracts are not visible in the provided source, making schema validation impossible. No tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications in the metadata. Naming follows conventions well (verb_noun), but schema completeness and error recovery patterns are weak.
Open the Customer Portal, which owns payment method, invoices, and cancellation.
Start a hosted Checkout session. Returns the URL to send the browser to.
Define one. Requires `crm:configure`: this reshapes the database.
Permanently destroy an ARCHIVED type, its table, and its records. Reachable only while signed in as a person: `workspace:delete` is carried by no API scope, so a token cannot call this however it is scoped.
Retrieve a single record by type and ID.
List all agent connections for the workspace.
List records of a given custom object type.
Output schemas not documented. Tools return RouteResponse<> or custom objects (e.g., {url, requestId}) but LLMs cannot see field types, required fields, or nested structures. This forces LLMs to guess what data is available for downstream tool calls.
Parameter descriptions missing or incomplete. createObjectType accepts 'fields' and 'relationships' arrays but provides no guidance on their structure, required properties, or valid values. LLMs cannot construct valid payloads.
No tool annotations despite clear risk classifications. destroyObjectType is DESTRUCTIVE and revokeConnection is WRITE, but no destructiveHint or readOnlyHint annotations present. LLMs cannot distinguish safe from dangerous operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
Every custom type this workspace has defined, with its fields and links.
Records nobody has touched for a while, quietest first. The change feed says what DID happen. This says what did not, which is the question a scheduled agent actually needs answered.
Revoke one agent connection. Effective immediately: the next request that connection makes is refused, rather than waiting for its access token to expire.
Add a field, or archive and restore the type.
Plan, status, and usage against every quota. Read from the local billing snapshot, so it never waits on Stripe.
No error recovery guidance. Tools return IndraftError but descriptions do not explain what errors are possible, when to retry, or what the LLM should do next. E.g., destroyObjectType requires 'workspace:delete' scope but this is not documented.
Pagination not documented. listConnections, listObjectTypes, and listObjectRecords likely return paginated results but no limit, offset, cursor, or total_count parameters/fields are visible in descriptions or schemas.