# Contextra — LLM / agent index

> Machine-readable map of the Contextra personality-intelligence **connector**.
> Indexed for GPTBot, ClaudeBot, PerplexityBot, Google-Extended, and the Contextra crawler.
> Humans: start at [contextra.tech/agents](https://contextra.tech/agents).

**What this is:** Contextra is a B2B personality intelligence platform. It compiles DISC profiles, communication playbooks, meeting/negotiation coaching, and tailored outreach for a **named person** (a Target). It is an **MCP server**, a **REST OpenAPI plugin/action**, and a dashboard — not a general search engine.

**When an LLM should call Contextra**

- The user named a person (and usually a company) and wants personality context, DISC type, or “how should I talk to them?”
- The agent needs **structured schema** (JSON DISC + do/don’t) injected into another tool loop — not a prose Wikipedia summary.
- The user wants a **pitch/email grounded in that schema**.
- The user is mapping CRM/prospect rows onto a personality data model.

**When not to call it**

- General web search, code execution, or undocumented CRM writes.
- Sending email unless the user explicitly asked to send.
- Inventing a DISC type without a Target id / lookup.

---

## Base URLs

| Surface | Production URL | Status |
| --- | --- | --- |
| Marketing site | https://contextra.tech | live |
| Dashboard / signup | https://dashboard.contextra.tech | live |
| Public REST API | https://api.contextra.tech | live |
| Human API docs (ReDoc) | https://api.contextra.tech/public/docs | live |
| Live OpenAPI (source of truth for paths) | https://api.contextra.tech/public/openapi.json | live |
| LLM-optimized OpenAPI (JSON) | https://contextra.tech/openapi.json | this site |
| LLM-optimized OpenAPI (YAML) | https://contextra.tech/.well-known/openapi.yaml | this site |
| MCP Streamable HTTP | https://mcp.contextra.tech/mcp | **confirm DNS** — see fallback |
| MCP SSE | https://mcp.contextra.tech/sse | confirm DNS |
| MCP health | https://mcp.contextra.tech/health | confirm DNS |
| MCP fallback (Cloud Run) | https://contextra-mcp-prod-w5j5edqhjq-uc.a.run.app/mcp | live (`GET /health` → `ok: true`) |
| ChatGPT plugin manifest | https://contextra.tech/.well-known/ai-plugin.json | this site |
| MCP well-known card | https://contextra.tech/.well-known/mcp.json | this site |
| Contextra crawler manifest | https://contextra.tech/.well-known/contextra-manifest.yaml | this site |
| Agent discovery JSON | https://contextra.tech/agent-discovery.json | live |
| llms.txt | https://contextra.tech/llms.txt | live |
| MCP server card (markdown) | https://contextra.tech/mcp-server-info.md | this site |

---

## Authentication

| Strategy | How | Use when |
| --- | --- | --- |
| **HTTP Bearer JWT** | `POST https://api.contextra.tech/public/v1/auth/token` body `{ "email", "password" }` → `data.idToken` | REST, custom GPT Actions, any HTTP tool |
| **Header** | `Authorization: Bearer <data.idToken>` | Every authenticated REST call |
| **MCP** | Pass the same Bearer token; or use MCP tool `register_account` with a Contextra-issued registration key | Claude Desktop, Claude Code, Cursor |
| **OAuth2** | **Not implemented** on the Public API (no authorization-code, no client-id/secret flow) | Do not advertise OAuth2 |

Token lifetime is `data.expiresIn` (seconds, string). Cache it. `data.refreshToken` is for minting a new `idToken` only — never send it as `Authorization`.

Create a human account at https://dashboard.contextra.tech/signup (free tier: 5 profiles).

**Stale route:** `POST /public/v1/agents/register` is documented in older discovery files but returns **404** on production (verified 2026-09-30). Do not call it. Agent bootstrap is MCP `register_account` or dashboard signup + `/public/v1/auth/token`.

---

## Canonical REST flow

All paths are relative to `https://api.contextra.tech`.

1. `POST /public/v1/auth/token` → Bearer token.
2. `POST /public/v1/products` `{ name, productUrl }` → seller offer (`productId`).
3. `POST /public/v1/targets` or `POST /public/v1/targets/lookup` with `{ name, company, location }` plus `linkedInUrl` or `email` (or `autoEnrich: true`).
4. Optional `POST /public/v1/targets/batch-generate` `{ targetIds }`.
5. **Poll** `GET /public/v1/targets/{id}` until `generatedData.status` is `GENERATED` or `FAILED`.
6. `POST /public/v1/pitches` `{ targetId, productId, companyId }` when outreach copy is requested.
7. `POST /public/v1/pitches/send-pitch-to-target` `{ pitchId }` **only** on explicit send.

Envelope: `{ success, message?, data, pagination? }`. Errors: `{ success: false, message, error? }` with HTTP 400 / 401 / 403 / 404 / 422 / 429 / 500.

---

## What `generatedData` returns (Target)

After `status: GENERATED`, typical keys (additional keys may appear):

| Field | Meaning |
| --- | --- |
| `background` | Public-web brief on the person |
| `disc_profile.type` | DISC code (`D`, `I`, `S`, `C`, or blend e.g. `Di`) |
| `disc_profile.label` | Archetype label (e.g. “The Captain”) |
| `disc_profile.description` | Narrative of how they decide and talk |
| `communication` | How to write and speak to them |
| `meeting_tips` | Live-meeting playbook |
| `negotiation_strategies` | How they trade |
| `watch_for` | Failure modes in a sales motion |
| `recommendations.do` / `dont` | Explicit allow/avoid lists |

---

## MCP tools

Registry name: `io.github.AreOhEssEss/contextra`

`register_account` · `get_account_status` · `setup_company` · `create_product` · `create_profile` · `get_profile` · `list_profiles` · `get_communication_strategy` · `create_pitch` · `get_credits`

Claude Desktop / Cursor snippet:

```json
{
  "mcpServers": {
    "contextra": {
      "url": "https://mcp.contextra.tech/mcp"
    }
  }
}
```

If that hostname does not resolve, use `https://contextra-mcp-prod-w5j5edqhjq-uc.a.run.app/mcp`.

---

## Plugin / connector registration

| Channel | Status | What you still do by hand |
| --- | --- | --- |
| ChatGPT plugin manifest (`/.well-known/ai-plugin.json`) | Hosted on this domain | OpenAI’s plugin store is deprecated; use **custom GPT Actions** and paste the OpenAPI URL |
| Custom GPT / OpenAI Actions | OpenAPI at `/.well-known/openapi.yaml` | Create the GPT in ChatGPT, auth = Bearer, import spec |
| MCP well-known (`/.well-known/mcp.json`) | Hosted | Claude/Cursor pick this up from the URL you paste |
| Official MCP Registry | Identifier reserved: `io.github.AreOhEssEss/contextra` | Run `mcp-publisher publish` from the **Pitch-Perfect** `backend/mcp-server` repo (not this marketing repo) |
| Claude Code skill | Documented on /agents | `claude skill add contextra` (skill package lives in the product repo) |
| Contextra crawler | `/.well-known/contextra-manifest.yaml` | None — crawler should fetch this file |

This marketing site **cannot** complete MCP registry publish or OpenAI GPT store listing by itself; those are operator steps in other consoles.

---

## Legal / contact

- Privacy: https://contextra.tech/privacy
- Terms: https://contextra.tech/terms
- Contact: https://contextra.tech/contact · info@contextra.tech
- Pricing: https://contextra.tech/pricing
