← Changelog

Decile Hub connector — augment-it's first per-client API integration, built from the OpenAPI spec out

A VC client runs their fund + CRM on Decile Hub. Tonight augment-it learns to talk to it — a skill that codifies the contract and a TypeScript MCP server that exposes it as agent tools, both grounded in Decile's own OpenAPI spec rather than guesswork. It's the first connector in the per-client seam we've been building toward.

Why Care?

For months the workspace architecture has promised something it hadn't yet delivered: that each VC client could bring their own tools — their own CRM, their own data — and augment-it would talk to whichever one the active workspace uses, without one client's integration leaking into another's. The connector seam was built; the worked example (Decile) was a placeholder with a fake .example URL.

Tonight it's real. Humain VC runs on Decile Hub — a venture fund-management + CRM platform — and augment-it can now pull and push their people, organizations, pipeline prospects, and notes. Two artifacts make it work: a skill that codifies how Decile's API behaves, and a TypeScript MCP server that turns that contract into tools an agent can call. Both are built from Decile's own OpenAPI spec — not from training-data guesses about what their endpoints probably look like.

This is the first of what will be many per-client connectors. Getting the first one right — grounded, isolated, mapped cleanly onto our canonical layer — sets the pattern for the rest.

What's New?

  • decile-hub-connector skill (authored in the lossless-agent-skills repo, live via symlink) — the operating guide: auth, base URL, the data shapes, how to pull, how to push, and how Decile records map onto our SurrealDB persons / organizations. Plus a references/endpoint-inventory.md listing every endpoint.

  • services/decile-mcp/ — a TypeScript MCP server exposing the CRM-core operations as tools (decile_whoami, list/get/upsert person & organization, notes, pipelines, prospects). Builds clean (tsc); register with claude mcp add -s project.

  • Env-var reconciliation — the spec + the humain-vc README anticipated DECILE_API_BASE_URL / DECILE_API_KEY / DECILE_TENANT_ID. The real, working vars are DECILE_API_URL + DECILE_HUB_API_KEY (the tenant is in the subdomain, so there's no separate tenant id). Both docs now match reality.

How It Works

The contract, confirmed from the spec — not guessed

The single most important discipline here: a connector skill is only useful if its endpoints are real. So everything below was read out of Decile's 11,970-line OpenAPI spec (saved at clients/humain-vc/inputs/decilehub/202506_decilehub-docs_swagger.yaml), and the extraction caught several things memory would have gotten wrong:

ThingReality
AuthAuthorization: <token> — the raw API token, no Bearer (one stale doc example showed Bearer; the scheme is a plain apiKey header)
Base URLhttps://<tenant>.decilehub.com — per-tenant subdomain (humain → humain.decilehub.com); routes under /api/v1/
Paginationthree different patterns — 0-indexed {data, pagination}, 1-indexed {key, page, per_page, total}, and keyset {data, pagination:{next_page_token, has_more}}
Writesupsert-by-natural-key — POST /person (by email), POST /organization (by name) — returning a changes diff
Errorsmostly {error:{code,message,field,…}}, but a few endpoints return a bare {error:"string"}

The MCP's client (src/client.ts) encodes all of this: raw-token auth, a helper per pagination pattern, and a normalizeError that handles both error shapes.

It maps onto the canonical layer we already have

Decile is a per-client source, so everything it feeds into our canonical layer carries the client tag (per Client Tagging on Canonical Writes). The mapping is natural: Decile people → persons (join on email), organizations → organizations (join on name/slug). And Decile's own upsert-by-natural-key semantics mirror our SurrealDB upsert discipline almost exactly — SELECT-by-key, then merge-or-create.

Two surfaces, one contract

The skill and the MCP are complementary: the skill is the human/agent-readable guide and the source of truth for the mapping; the MCP is the executable layer. The spec marks agent-facing operations with x-agent-tool: true — those are the tools the server exposes first; the rest follow the identical server.tool(...) → client pattern.

Under The Hood

The whole thing is tenant-agnostic by design. src/client.ts reads DECILE_API_URL + DECILE_HUB_API_KEY from the environment — nothing about Humain is hard-coded — so a second VC client on Decile is just a second registration with that client's subdomain and token. The per-client .env (resolved through the workspace seam) is where the tenant lives, exactly as Workspaces as Tenant Primitive intended.

Extraction was done by reading the spec in full and pulling out the complete endpoint inventory + the CRM resource shapes, so the skill's reference doc is exhaustive rather than a sampling. When the next endpoints are needed (deal shares, deal memos, portfolio companies, tasks, files, events), they're a few lines each against the existing client.

Files Changed

  • services/decile-mcp/ — new MCP server (client.ts, server.ts, package.json, tsconfig.json, README.md)

  • context-v/specs/Workspaces-as-Tenant-Primitive.md — Decile worked example updated to the real env vars (bumped to 0.0.0.2)

  • clients/humain-vc/README.md — secrets list updated to DECILE_API_URL + DECILE_HUB_API_KEY (submodule)

  • decile-hub-connector skill — authored in the lossless-agent-skills repo (separate repo; live via symlink)

What's Next

  • Register the MCP for the humain-vc tenant and confirm with decile_whoami.

  • Wire a Decile → SurrealDB sync that pulls people/organizations into the canonical layer, client-tagged, treating Decile as one provenance source.

  • Extend the tool set beyond the CRM core as workflows demand it.

See Also