Data Studio Developer Portal

Getting started with the Data Studio

The Data Studio, part of the Trust Infrastructure Platform, serves trusted data as skills: governed, versioned capabilities you call by name. Every skill is reachable over MCP (Model Context Protocol, the open standard AI clients use to call tools). This guide takes you from “I have a key” to your first property answer. You can paste it into Claude Code or your own agent.

The full reference is the Developer Portal for your environment (the table in section 1). It has the API Reference tab, plus the machine-readable OpenAPI description at /api/openapi.json on the API host (send your key). When this guide and the portal disagree, the portal wins.

Two companions go deeper: the Consumer reference (who sees which skills, dictionary coverage and proposals, property-scout, re-keying, troubleshooting) and Authoring skills. For an agent, connect-claude-code.md gives the same connection steps as plain Markdown, with this environment’s addresses filled in.

How the Data Studio is organized: the ontology

The Data Studio’s ontology is why an answer means the same thing whichever source produced it. Learn it first; everything you call hangs off it.

Build your code and prompts against the terms, not against any one source. When the Data Studio adds or swaps a source behind a term, your parsing is designed not to change.

1. What you need

Which host: the key’s prefix decides

EnvironmentMCP hostKey prefixDeveloper Portal
Devapi.dev.trustinfrastructure.comtip_dev_developer.dev.trustinfrastructure.com/portal
Stagingapi.staging.trustinfrastructure.comtip_stg_developer.staging.trustinfrastructure.com/portal
Productionapi.trustinfrastructure.comtip_developer.trustinfrastructure.com/portal

Your Data Studio contact gives you a key for one of them; use the host that matches its prefix. A key sent to another environment’s host fails authentication. The examples below use dev.

Production access is by arrangement. Your Data Studio contact confirms the production host when your key is issued.

2. Connect

The endpoint, with the two settings this guide recommends:

https://api.dev.trustinfrastructure.com/api/mcp/real-estate?surface=lean&lane=consumer

Claude Code

User scope (every project on your machine):

claude mcp add --transport http --scope user tip \
  "https://api.dev.trustinfrastructure.com/api/mcp/real-estate?surface=lean&lane=consumer" \
  --header "Authorization: Bearer $TIP_API_KEY"

Your shell expands $TIP_API_KEY when you run this, so the key is stored in ~/.claude.json, your own file.

Project scope (shared through the repo): add a .mcp.json at the project root. Claude Code expands ${TIP_API_KEY} from your environment, so no key is committed:

{
  "mcpServers": {
    "tip": {
      "type": "http",
      "url": "https://api.dev.trustinfrastructure.com/api/mcp/real-estate?surface=lean&lane=consumer",
      "headers": { "Authorization": "Bearer ${TIP_API_KEY}" }
    }
  }
}

Where servers live: ~/.claude.json holds the user and local scopes, and .mcp.json holds the project scope. MCP servers do not go in settings.json. When one name is defined in several places, local wins over project, and project wins over user. To verify, run /mcp in a session or claude mcp list.

Any other MCP client

Use the Streamable HTTP transport, the URL above, and one header: Authorization: Bearer <your key>. If you call it over raw HTTP, POST JSON-RPC 2.0 and send Accept: application/json, text/event-stream. Replies are SSE-framed (event: message then data: {...}).

curl -sS -X POST "https://api.dev.trustinfrastructure.com/api/mcp/real-estate?surface=lean&lane=consumer" \
  -H "Authorization: Bearer $TIP_API_KEY" \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

The full surface, if you want it

Drop surface=lean and every published skill and data source becomes its own tool: about 925 tools, roughly 1.7 MB of tool definitions, for a consumer key on dev today. Use it when your client copes with a large tool list and you want to call skills directly by tool name. Some tools exist only on the full surface: portal-browse-skills (catalog browsing with category, q, tier and jurisdiction filters), portal-browse-catalog (the data-source catalog), the template tools, query-harmonized-data and the per-source ds-* tools.

3. Check your key

curl -sS -H "Authorization: Bearer $TIP_API_KEY" \
  "https://api.dev.trustinfrastructure.com/api/mcp/real-estate/health?lane=consumer&surface=lean"
# {"ok":true,"tenantId":"real-estate","appId":"…","surface":"lean","lane":"consumer"}

A 403 means the consumer lane does not accept this key. The refusal names tip-key-introspect; call it without lane=consumer to see why.

4. Discover what your key can call

Start in plain language, for example “What property skills can I use on the Data Studio?”. These are the lean-surface tools as served:

ToolWhat it does
discover-skillsSearch published skills by category, domain or query. Pass compact=true with a query to get a short ranked list. Every record carries cost, pricing and authRequired.
get-skills-manifestThe skills manifest, 25 per page (100 at most). Pass summary=true for slug, name, category, tool name, price and authRequired only.
find-skills-for-conceptSkills linked to one dictionary concept.
discover-use-casesEcosystem-defined use cases (named data requests).
tip-list-skill-familyNo arguments: the families. With family_id (for example property): their members.
portal-browse-dictionaryThe ecosystem dictionary: terms, definitions, types, and which sources provide each term. Filter by geography or tags.
portal-dictionary-releaseThe dictionary as a versioned artifact you can pin and diff.
portal-dictionary-coverageHow much of each published source is mapped to the dictionary.
portal-dictionary-proposePropose a link, a new term or a supersession. You get back an id whose status you can poll.
discover-ecosystem-credentialsThe digital credentials governed in this ecosystem, and who issues them.
portal-quote-skill-priceWhat a call would cost. Free; nothing runs (section 6).
tip-invoke-skillRun a skill: slug, plus the skill’s own arguments.
tip-invoke-skill-toolRun one named tool inside a skill (skill_slug, tool_name, args).
tip-run-list, tip-run-get, tip-property-runsYour own run records: list, one run in full, and every run about one property.
submit-invocation-feedback, submit-repo-feedbackFeedback (section 10).
tip-key-introspectSee section 3.

Categories you will meet: orchestrated_package (multi-source packages), data_access (one wrapper per upstream source) and domain_computation (results that are computed, not fetched). A slug runs its latest published version. To pin one, put version inside arguments.

5. Your first property calls: the products first

Four product skills come first. Each takes one address in Canada or the United States:

  1. property-scout ($0). A check before any lookup. Send an address to learn which package would answer it and at what price. Or send an answer you already hold, to learn whether it describes the unit, the building or the parcel. It calls no paid source.
  2. property-open-data ($0). What open public records hold: the parcel identifier and map point, plus assessment, zoning, permits, planning layers and images where open sources publish them. Each value names its source. It never calls a paid source.
  3. property-base (priced). Property details and one valuation, from the main paid source for that place. Pass along what property-open-data returned: parcel_id, parcel_id_type, open_data_lat and open_data_lon. If no source covers the place, the call is refused at no charge.
  4. property-premium (priced, Canada). An estimated value range, a flood score and a fire insurance grade, each bought only where it answers. It bills per product delivered, and a call that delivers nothing is free. In British Columbia, pass the parcel identifier as pid.

Quote 3 and 4 before you call them, and pass maxPrice (section 6). On the lean surface, every call goes through tip-invoke-skill:

// Toronto City Hall
{ "jsonrpc": "2.0", "id": 2, "method": "tools/call",
  "params": { "name": "tip-invoke-skill",
    "arguments": { "slug": "property-scout",
                   "arguments": { "address": "100 Queen St W, Toronto, ON" } } } }

// The same building, open records only, with the address sent as parts (section 7)
{ "jsonrpc": "2.0", "id": 3, "method": "tools/call",
  "params": { "name": "tip-invoke-skill",
    "arguments": { "slug": "property-open-data",
                   "arguments": { "line1": "100 Queen St W", "locality": "Toronto", "region": "ON",
                                  "idempotencyKey": "<a fresh id for this call>" } } } }

The layer underneath

The products route each address to a package for its province, state, city or county, and you can call one directly: every US state as <state>-property (for example california-property), provinces such as ontario-property, cities such as nyc-property, toronto-property and vancouver-property, and counties such as king-county-property. To list them all, call tip-list-skill-family with family_id: "property".

US state packages take address (line 1 or the full one-line form), county (it disambiguates), city (only together with county; a city sent alone is dropped), zipCode (strongly recommended in dense cities) and unitNumberStripped (the unit without its prefix).

6. Price, retries and run records

On the lean surface, put maxPrice, idempotencyKey, correlationId and version inside arguments, beside the skill’s own inputs.

7. Sending an address

The Data Studio’s rule is that a data source never receives raw typing. You get the best answers when your app does the same:

8. Reading the answer

The answer is JSON in result.content[0].text. isError: true marks a failure (section 9).

9. Errors

Invocation errors carry a top-level error_code from the Data Studio’s closed registry of codes. Branch on the code, never on message. The registry is append-only: codes can be added, and existing codes are not renamed.

error_codeMeaningRetry?
anchor_unresolved, no_matching_record, jurisdiction_not_coveredA calm “not found” answer. Render it.No
input_invalidThe arguments failed validation.No; fix the input
unit_requiredThe parcel has several units. Send unit.No; add the unit
skill_not_foundNo such skill for your key. A skill your key cannot see answers the same way.No
not_entitledYou can see the skill, but your access does not cover it.No
max_price_exceededThe price is above your maxPrice. Nothing ran and nothing was billed.No; re-quote
upstream_timeout, upstream_unavailable, upstream_throttledAn upstream source failed or is busy.Yes, with backoff
upstream_rejected_request, upstream_not_entitled, upstream_response_unusableAn upstream source refused the request or sent an unusable answer.No
skill_step_failed, skill_not_executable, internal_errorA fault on the Data Studio’s side. Report it (section 10).No

Transport refusals happen before any skill runs, so nothing is billed:

CodeHTTP / JSON-RPCWhen
key_family_not_accepted403 / -32004The consumer lane refused a write-capable key
key_call_limit_exceeded429 / -32005Too many skill calls per minute for this key
still_running409 / -32006A retry arrived while the first call with that key was still running
idempotency_key_reused422 / -32007The same key was sent with a different request
idempotency_key_conflict400 / -32008The argument key and the header key disagree

A missing, invalid or revoked key gets HTTP 401.

10. Limits and feedback

Limits.

Feedback.

11. Why your catalog may differ from a colleague’s

Three gates decide what a key sees:

  1. Published only. Drafts and archived skills never appear.
  2. No system skills. Internal platform skills are never served to external keys.
  3. Per-key access. If your key has roles, the roles alone decide: each role’s allowed tags, minus its denied tags, are matched against each skill’s tags. If it has none, its tier decides, and a consumer key sees the skills marked consumer-visible. Tiers are consumer (read only), author (adds write tools when a role grants them) and admin (an older alias for author).

A change to your key’s roles can take up to 30 minutes to show in tools/list, because the Data Studio caches each key’s tool list. To see what your key is right now, call tip-key-introspect.

12. Authoring skills

Author-tier keys can create and update skills over MCP, through tip-skill-create-from-bundle, tip-skill-update, tip-skill-comment and tip-skill-get-bundle. If you want to publish your own skills, ask your Data Studio contact for an author key, then read Authoring skills. An author key can write, so the consumer lane refuses it: connect without lane=consumer.

Reference