# Ambrose OS — Full Documentation > Agentic AI operating system for insurance agencies — a back-office of named AI department heads (CMO, CRO, COO, CFO, CTO, Compliance, Research, Client-Success) that already know your book of business, carriers, campaigns, and GoHighLevel setup. Source: https://app.hiambrose.com/docs · generated 2026-07-08 This file concatenates every documentation page in reading order. ====================================================================== # What is Ambrose? URL: https://app.hiambrose.com/docs/what-is-ambrose ====================================================================== Ambrose OS is an agentic AI operating system built for insurance agencies. Think of it as a back-office of named AI department heads — a CMO, CRO, COO, CFO, CTO, Compliance, Research, Client-Success — that already know your book of business, your carriers, your campaigns, and your GHL setup. Ambrose runs in your browser and (in self-hosted deployments) on your own infrastructure. You drop your data in, plug in the systems you already use (GoHighLevel, HealthSherpa, Twilio, VAPI, Retell, Slack), and the executive team starts answering questions and taking work off your plate. ### The four big surfaces DashboardYour home screen — quick stats, recent activity, jump-off points to every other tab. War RoomWhere you talk to the executive team. Ask anything; Ambrose routes to the right head and synthesizes the answer. Agents & TeamsBuild your own AI personas and role configs. Edit a markdown file, behavior updates instantly. Spokes / ToolsThe capabilities the AI dispatches to — GHL, marketplace search, vault, watchdogs, reply-bot, … ### What makes it different - Insurance-native. Every spoke, every head, every prompt was built for ACA / Medicare / ICHRA / group health workflows — not a generic chatbot dressed up with a system prompt. - HIPAA-aware by default. The PHI Rail aliases identifiers before any non-BAA destination sees them, and re-hydrates real values on the way back. More on the PHI Rail. - Tenant-isolated. Every read and write is scoped to the logged-in agency. Application filters + Postgres RLS + session resolution all enforce it. - Editable in plain English. Agent identity, personality, memory, and notes are markdown files. Save = live. No deploys. ### Where to go next Quick tour → (#quick-tour)5-minute walkthrough of every tab. Core concepts → (#core-concepts)Agent vs Team vs Spoke vs Skill vs MCP — the vocabulary. War Room → (#war-room)The fastest way to feel what Ambrose can do. Executive team → (#exec-team)Meet the nine heads. ====================================================================== # Quick tour URL: https://app.hiambrose.com/docs/quick-tour ====================================================================== A 5-minute walkthrough of every tab in the Ambrose top nav, in the order you will probably use them. 1**Dashboard.** Quick stats — credits, active agents, recent runs, alerts from the watchdogs. Use it to land, check the morning numbers, and click into anything that needs attention. 2**War Room.** The chat surface for the executive team. Type a question; Ambrose decides which head answers, or convenes a small group. See War Room (#war-room). 3**Agents.** Your custom AI personas. Each one has IDENTITY / PERSONALITY / MEMORY / NOTES markdown files, a model, a list of allowed spokes, and (optionally) attached teams and MCPs. 4**Teams.** Role configs that bundle a prompt, tool access, routines, and (critically) GHL workflow webhooks. Teams are the canonical home of GHL webhook integrations (#team-ghl-webhook) as of May 2026. 5**Onboarding.** Guided setup wizard — connect GHL, drop your vault files, set your brand voice, pick your AI provider. 6**Routines.** Scheduled prompts attached to your agents and teams. Run nightly book-of-business checks, weekly newsletters, daily KPI digests. See Routines (#routines). 7**Workflows.** Multi-step pipelines that chain agents and tools together — a step-up from a single routine. 8**Architecture.** A live graph of every running service (Supervisor, Core Py, Core Node, Brain, PHI Gateway, Postgres, spokes). Click a node to see status and recent activity. 9**Logs.** AI call log + system log. Every model call is recorded (tokens, cost, latency, model, provider). 10**Vault.** Drop your HealthSherpa CSVs, commission reports, carrier PDFs. They are parsed, indexed, and instantly queryable in plain English. Files never leave your account. 11**Tools.** Every spoke + every action they expose. Toggle per-tool permissions per agent / team here. See Permissions (#mcp-permissions). 12**Settings.** API keys, brand voice, vault encryption, integrations (GHL, Twilio, Slack, Discord, …), billing, privacy. See Settings overview (#settings). 13**Docs.** The page you are reading now. Public — share the URL. ====================================================================== # Sign up & first login URL: https://app.hiambrose.com/docs/signup-first-login ====================================================================== Create an Ambrose account, sign in, and finish the onboarding wizard in about 5 minutes. 1Open /signup (/signup) and create an account with your work email. The first user in an agency becomes the agency admin. 2Verify the email and sign in at /login (/login). You land on the Dashboard. 3Click **Onboarding** in the top nav. The wizard walks you through: - Picking your AI provider (Anthropic Claude or AWS Bedrock — see Models). - Connecting GoHighLevel (location ID + PIT — see GHL integration). - Uploading your first vault files (HealthSherpa export, commission report). - Setting your brand voice — a short paragraph the AI uses for every outbound message. 4**Using GoHighLevel?** Import the Ambrose AI Context Snapshot (#ghl-snapshot) — a one-click GHL snapshot that keeps the AI's context updated from calls, messages, replies and CRM changes, and ships ready-to-run ACA follow-up sequences. Optional, but recommended if your book lives in GHL. 5Open the War Room (/war-room) and ask "What can you do?" — the exec team will give you a tailored intro based on what you connected. **Tip.** The floating chat widget (bottom-right of every page) is the same exec team in a smaller form. Use it for quick questions without leaving the page you are on. ====================================================================== # GoHighLevel AI Context Snapshot URL: https://app.hiambrose.com/docs/ghl-snapshot ====================================================================== A ready-made GoHighLevel snapshot that keeps Ambrose's AI context in sync with every call, message, reply, note and CRM change — and ships proven ACA follow-up sequences you can turn on in minutes. If you run your book of business in **GoHighLevel**, this one-click snapshot wires your sub-account so Ambrose always has the latest, real context for each contact. It captures call transcripts, inbound messages, replies, notes and pipeline changes automatically, writes them into clean contact fields, and includes done-for-you 5-day follow-up sequences for ACA leads, DBR contacts, and renewals. **Import the snapshot →** Add the Ambrose AI Context Snapshot to your GoHighLevel account (https://affiliates.gohighlevel.com/?fp_ref=affordablecareai&share=8xZSSHxUYdSIVgvBRndI) Opens GoHighLevel. Sign in to the location you want it installed on, review what's included, and click Import. Nothing runs until you turn a workflow on. ⚠️ **Before importing — check your custom fields.** This snapshot adds the custom fields listed below. If your sub-account already has fields with these names, GHL may overwrite or duplicate them. Review them first and rename yours to avoid collisions. - AI Context JSON - AI Call Introduction - AI Context Updated At - AI Context Version - AI Context Dirty - Ambrose Last Transcript - Ambrose Last Message - Conversation History #### What it does Ambrose answers best when it knows what just happened with a contact. This snapshot keeps that context fresh in real time so your AI follow-ups, replies and summaries are accurate — no manual copy-paste, no stale notes. #### What's included ##### 1 · Real-time context sync A set of automations watch your contacts and keep their AI context current: | When this happens | What the snapshot does | | Inbound or outbound call | Saves the latest call transcript and flags the contact's context as needing a refresh, so the next AI reply reflects the conversation. | | New message received | Stores the most recent message and updates the AI context for conversation continuity. | | Contact replies on any channel | Appends the reply to the contact's conversation history so the AI and your team see the latest thread. | | Tag added, pipeline moved, or note added | Marks the context as updated so internal CRM changes stay reflected in the AI. | | On demand (manual or trigger) | Builds a clean contact summary from conversation history, tags, appointments and recent email/SMS, and writes it into the contact's notes. | | On demand (manual or trigger) | Reads the full conversation and updates the contact's native + custom fields (name, email, phone, ZIP, appointment date, renewal/DBR status, and more) — creating any missing custom fields automatically. | ##### 2 · Done-for-you follow-up sequences Three ready-to-run 5-day SMS + email sequences. Each step sends an SMS and email, then waits a day. Enroll contacts manually or wire your own trigger. - ACA New Lead — 5-day: nurtures fresh ACA leads who may qualify for low-cost or $0 plans and prompts them to check eligibility or book a call. - ACA DBR — 5-day: reminds DBR contacts to complete or review required details and connect with an agent. - ACA Renewal — 5-day: reminds contacts to review or renew their plan and update key details so they don't miss renewal steps. These sequences send through your own messaging — review the copy and add the trigger that fits your workflow before enabling. #### Fields the snapshot creates On import, the snapshot adds the custom fields Ambrose uses to store and track context. Most are managed automatically — you usually won't edit them by hand. | Field | Purpose | | AI Context JSON | The structured, machine-readable snapshot of everything the AI knows about the contact. | | AI Call Introduction | The opening context/script the AI uses when handling a call for this contact. | | AI Context Updated At | Timestamp of the last context refresh. | | AI Context Version | Version marker so updates can be tracked and re-built safely. | | AI Context Dirty | A "needs refresh" flag set whenever new activity arrives, so context is rebuilt only when something changed. | | Ambrose Last Transcript | The most recent call transcript for the contact. | | Ambrose Last Message | The most recent inbound message from the contact. | | Conversation History | A running record of the contact's replies and conversation updates across channels. | **Custom values** (account-level): **Agent Full Name** and **AI Bot Name** — set these once so messages and AI replies use your agent's name and your bot's name. #### How to import 1Click Import the snapshot (https://affiliates.gohighlevel.com/?fp_ref=affordablecareai&share=8xZSSHxUYdSIVgvBRndI) and sign in to your GoHighLevel account. 2Choose the **sub-account (location)** you want it installed on and confirm the import. 3Set the **Agent Full Name** and **AI Bot Name** custom values for that location. 4Review each follow-up sequence's copy, add the trigger that fits your process, and turn on the ones you want. The context-sync automations can run as-is. 5Connect the same location to Ambrose under Settings → Integrations → GoHighLevel (#int-ghl) so the AI can read the context these fields keep fresh. After import, Ambrose stays in lock-step with your CRM: every call, text and reply keeps the contact's AI context current, so your follow-ups and summaries are always based on the latest real activity. ====================================================================== # Core concepts URL: https://app.hiambrose.com/docs/core-concepts ====================================================================== Five terms you need to keep straight. Mixing them up is the most common source of confusion. | Term | What it is | Where it lives | | Agent | An AI persona — identity + voice + memory. Speaks for itself. Holds a relationship with a user or a system. | agents// + agents table | | Team | A role config — bundle of prompt + tool access + routines + GHL webhook. An agent plays a team to do a job. | teams// + teams table | | Spoke | A capability — one MCP server with a set of tools. Spokes are the things the AI can do. Agents reach them through allowed_spokes. | spokes// | | Skill | A markdown brief (SKILL.md) that teaches the AI how to use a specific spoke or workflow well. The Claude Agent SDK auto-attaches them to every exec head. | .claude/skills//SKILL.md | | MCP | Model Context Protocol — the standard for plugging external tools into an AI. Ambrose speaks MCP both ways: every spoke is an MCP server, and you can mount external MCP servers as tools. | MCP page | ### Example chain **Morgan** (an exec-team agent) plays the **Marketing** team which has access to the **search-audit** and **channel-bridge** spokes. Each spoke exposes a few MCP tools. Morgan also has access to every skill in `.claude/skills/`, which teaches him how to chain those tools well. ### What about a Routine? A routine is a scheduled prompt attached to an agent or a team. "Run prompt X on cron Y." It is not a different kind of entity — it is a row in `agent_cron_jobs` pointing at an agent or team. See Routines (#routines). ### What about a Workflow? A workflow is a multi-step pipeline that chains several runs together — output of step 1 becomes input to step 2, with branches and conditions. Think of it as a recipe; a routine is a single scheduled call. See **Workflows** in the top nav. ====================================================================== # Glossary URL: https://app.hiambrose.com/docs/glossary ====================================================================== Quick definitions of every term you will see in the UI and the docs. | Term | Meaning | | Agency | The tenant. Everything you create — agents, teams, vault data, integrations, routines — is scoped to your agency. | | Agency admin | The first user in an agency. Can add other users, manage billing, change every setting. | | Agent | An AI persona. See Agents. | | BAA | Business Associate Agreement. Required before any PHI can flow to an external AI provider. | | Bearer token | Per-agent, per-consumer credential for HTTP API access. See Bearer tokens. | | The Brain | An internal service that fronts 25+ federal/healthcare data MCPs (CMS, NADAC, FDA, Federal Register, FEMA, …). The named research spokes call it. | | Credit ledger | The per-agency usage meter. Every model call deducts credits based on token usage. | | Exec head | One of the nine named department heads (Ambrose, Morgan, Jordan, Alex, Taylor, Elena, Sam, Casey, Riley). | | GHL | GoHighLevel. The CRM most agencies use. | | MCP | Model Context Protocol. The standard for AI tool use. More. | | PHI | Protected Health Information. The 18 HIPAA-listed identifiers (name, DOB, SSN, MRN, address, phone, email, …). | | PHI Rail | Ambrose's redact-then-rehydrate pipeline. See PHI Rail. | | PIT | Personal Integration Token. The GHL credential you paste into Ambrose to authorize CRM reads/writes. | | RLS | Row-level security (Postgres). The backstop that keeps one agency from reading another agency's rows. | | Routine | Scheduled prompt attached to an agent or team. More. | | Spoke | A capability — one MCP server with a tool set. More. | | Skill | A SKILL.md brief that teaches the AI how to use a spoke. More. | | Team | A role config. More. | | Vault | The agency's private data store — CSVs, PDFs, XLSX, parsed and indexed. More. | | War Room | The exec-team chat surface. More. | | Watchdog | Scheduled book-intelligence spoke. ACA + Medicare flavors. ACA, Medicare. | ====================================================================== # Dashboard overview URL: https://app.hiambrose.com/docs/dashboard ====================================================================== The Dashboard is your home screen. It surfaces the numbers, the people, and the alerts you should look at first thing. ### What you see - Credit balance. How much usage budget the agency has left this billing period, with a progress bar against the plan limit. - Active agents. How many agents are live, draft, or paused. - Recent activity. The last N runs from any agent / team / routine with timestamps and links to the run detail. - Watchdog alerts. Findings from the ACA + Medicare watchdogs the user has not resolved yet. - Quick chat. A small input that drops you straight into the War Room with your question pre-filled. ### Conventions - Numbers in serif (Fraunces) are headline metrics. Numbers in mono are raw counts. - Clickable rows have a slightly darker hover background. - Every chart is "today vs same time last week" by default. Toggle the range with the buttons above the chart. ### What to do first 1Check the credit balance. If it is below 20% you will start to see throttling. 2Scan watchdog alerts. Anything red is a book-of-business risk you should triage. 3Look at recent activity. Anything failed (red badge) — click into it, see the error, decide. 4Use the quick-chat to ask the morning question ("What changed overnight?"). ====================================================================== # Widgets & quick stats URL: https://app.hiambrose.com/docs/dashboard-widgets ====================================================================== Every card on the dashboard is a widget. Some show numbers, some show lists, some are little forms. | Widget | What it shows | Where the data comes from | | Credit balance | Remaining credits + plan limit + burn rate. | agency_credit_ledger (Postgres) | | Calls today | Number of LLM calls in the last 24 hours, broken out by provider. | llm_calls.db (SQLite) | | Top heads | Which exec heads were called the most this week. | War Room session log | | Vault index | How many files indexed, last scan time, files needing reindex. | agent-vault spoke | | Watchdog alerts | Open / acknowledged / resolved findings from ACA + Medicare watchdogs. | Ambrose Notifications | | Recent runs | Last 10 runs from any agent, team, or routine. | agent_cron_runs + run history | | Quick chat | Single-line input. Hitting enter drops you into the War Room with the prompt prefilled. | War Room | ### Adding or hiding widgets Click the "Customize" gear in the top-right of the dashboard. Drag widgets to reorder; toggle the checkbox to hide. Per-user preference — your layout is independent of your teammates'. ====================================================================== # Floating chat widget URL: https://app.hiambrose.com/docs/floating-chat ====================================================================== The little chat bubble in the bottom-right corner of every page. It is the same exec team as the War Room, just always-on-hand. ### What it can do - Answer any question that the full War Room can — same heads, same spokes, same vault. - Create / update agents, teams, skills, MCPs, and routines via chat. The widget shows a confirm dialog before any write hits your account. - Stay scoped to your logged-in agency. The widget never touches another agency's data — enforced at the API layer (session → x-ambrose-acting-agency header → tenant-aware queries). ### Send vs Stop Only one button is visible at a time. While a response is streaming the Send button switches to **Stop** and the drawer header shows an amber sliding bar. Cancel mid-stream is safe — no partial state is committed. ### Write approvals (confirm dialog) Reads happen immediately. Writes (create / update an agent, mount an MCP, schedule a routine, etc.) stage a pending action and show a confirm card with the preview + **Approve** / **Cancel** buttons. Approving applies the change; cancelling discards it. **Security.** Even if a malicious prompt tried to pass another agency's ID, the server rejects it. The acting agency is sourced from the session cookie, never from chat input. ### Examples - "Create a new agent called RenewalsBot with model claude-sonnet-4-6, give it access to agent-vault and channel-bridge." → confirm card → approve → live agent. - "Add a routine to Morgan that runs every Monday 9am with prompt 'Draft the weekly social pack.'" - "Mount the Slack MCP server and allow it for the Marketing team." - "What did the ACA watchdog find this morning?" → no confirm needed, read-only. ====================================================================== # What is the War Room URL: https://app.hiambrose.com/docs/war-room ====================================================================== The War Room is the chat surface for the executive team. Type a question; Ambrose decides which head answers, or convenes a small group, and synthesizes the response. ### How it works - You type a question. - Ambrose (Chief of Staff) reads it, picks the right head(s). - Each head runs in its own Claude Agent SDK session with its own spokes + skills. - Heads can dispatch their sub-specialists for deep work. - Ambrose synthesizes the contributions into a single answer. ### Two layouts - Full War Room at /war-room — wide chat surface, tool-call timeline on the side, file uploads, voice input. - Floating widget — same engine in a compact drawer, available on every page. ### What the response panel shows - The final synthesized answer, in your brand voice. - Which heads contributed (small chips above the answer). - A collapsible tool-call timeline — every spoke action, every input, every output. - A "Why this answer" link that shows the dispatch chain. ### Mobile The War Room is fully responsive. On mobile the tool-call timeline collapses below the answer; tap the chip to expand. ### Pick a starting example VAPI call summary → (#war-room-vapi)"Summarize today's VAPI calls and tag missed ones." GHL inbox triage → (#war-room-ghl)"What new GHL messages came in today and who needs a follow-up?" Marketplace plans → (#war-room-marketplace)"Find ACA plans for a 42-year-old in 75201 making $40k." Vault query → (#war-room-vault)"Show me clients renewing in May with Humana plans." ====================================================================== # How to use the War Room URL: https://app.hiambrose.com/docs/war-room-howto ====================================================================== Tips for getting the most out of every chat. ### Ask in business terms, not technical ones "Who is at risk of churning?" beats "Run the agent-vault book scan with churn_score > 0.7." Ambrose maps business intent to tool calls. ### Mention the head if you want to skip routing "Sam, what is the latest CMS marketing rule on misleading benefits?" goes straight to Sam (Research) without Ambrose's triage step. Faster, fewer tokens. ### Use attachments - Drop a PDF (carrier email, intake form, plan summary) → it is parsed and used as context for the answer. - Drop a CSV → it is loaded into a temporary table the heads can query. - Files attached in chat are never persisted to the vault unless you opt in. ### Voice input The mic icon dictates straight into the input. Voice clips never leave your device unless you hit Send. ### PHI mode switch Top-right of the chat — Fast (scrub) / Private / BAA. Default is Fast (scrub) which aliases identifiers before egress. See PHI mode (#settings-phi). ### Stop button Every running answer can be cancelled with Stop. The button replaces Send while a response is streaming and turns the drawer header amber. ### Resume vs reset Each new question continues the same chat thread by default. The "New chat" button at the top discards context and starts fresh — useful when switching from a marketing question to a Medicare quote, so context does not bleed across. ====================================================================== # Example: VAPI call summary URL: https://app.hiambrose.com/docs/war-room-vapi ====================================================================== Use Alex (COO) or Taylor (CCO) to pull yesterday's voice calls from VAPI, tag the missed ones, and propose follow-ups. #### What to type ``` Summarize yesterday's VAPI calls. Flag any that were missed or ended in voicemail. Suggest who I should call back first. ``` #### What happens - Ambrose routes to Alex (COO) — voice-call pipeline lives in ops. - Alex calls the vapi integration to list calls in the last 24h. - Calls are joined against your GHL contacts (via the ghl spoke) to surface name + tags + lifecycle stage. - Taylor (CCO) is pulled in for the prioritization — she sorts by lifecycle stage and dollar potential. - The synthesized answer shows: total calls, answered / missed / voicemail counts, a sortable list of follow-ups, and a one-click "Open in GHL" link per row. #### Useful follow-ups - "Draft an SMS for the top 3 missed calls in my brand voice." → reply-bot drafts; you approve; channel-bridge sends. - "Add a task in GHL for each callback." → ghl spoke creates tasks scoped to your sub-account. - "What was the average call duration for answered calls? Compare to last week." → analytics. #### Wiring Needs a VAPI assistant connected. See VAPI integration (#int-vapi) for the three connection modes. ====================================================================== # Example: GHL messages today + follow-up URL: https://app.hiambrose.com/docs/war-room-ghl ====================================================================== Pull every conversation that received an inbound message today, summarize, and queue follow-ups — all via the ghl spoke. #### What to type ``` List today's new GHL messages across all sub-accounts. Summarize each thread in one line. Mark the ones that look like a sales-ready reply and draft a follow-up SMS in my voice. ``` #### What happens - Ambrose routes to Jordan (CRO) for sales-ready triage, with Taylor (CCO) on standby. - Jordan calls ghl_conversations_list for the last 24h. If you have multiple sub-accounts the spoke federates across them. - For each thread Jordan calls ghl_conversation_messages for the inbound payload. - Jordan classifies each thread — sales_ready, needs_info, complaint, spam. - For the sales-ready ones, reply-bot drafts an SMS in your brand voice. Drafts go to your inbox for approval — nothing sends without you clicking Approve. #### Sample output ``` Sub-account: Big Bot Account • Maria Lopez (lead, ICHRA inquiry) — "When can we schedule a call?" [sales_ready] Draft: "Hi Maria — happy to talk this week. Are you open Tue 10am or Wed 2pm CT?" • John Park (existing client) — "I lost my card." [needs_info] Forward to Taylor (client success). Sub-account: Demo Account • Marcus King — "Stop texting me." [opt_out] Add tag opted_out + suppress. ``` #### One-click actions - Approve all drafts — channel-bridge sends each as an SMS via the GHL conversation. - Add tags — bulk-applies the suggested tags via ghl_contact_add_tags. - Create tasks — one task per actionable item via ghl_task_create. #### Wiring GHL integration (#int-ghl) with a PIT that has Conversations + Contacts + Tasks scope. ====================================================================== # Example: Add context + move a contact through a GHL pipeline URL: https://app.hiambrose.com/docs/war-room-ghl-pipeline ====================================================================== Summarize a contact, tag them, and move their opportunity into the right pipeline and stage — notes, tags, and a stage change in one chat turn, all via the ghl spoke. One of the most common War Room jobs: after a call or a message, you want to **add context to a contact** (a note + tags) and **move their opportunity into the correct pipeline and stage**. You describe it in plain English — Ambrose resolves the contact, looks up the pipeline/stage IDs by name, writes the context, and moves the card. #### What to type ``` Take contact Maria Lopez. She just finished her ACA enrollment call and is ready to enroll. Add a note summarizing the call, tag her "aca-ready", and move her opportunity into the "Enrollment" pipeline at the "Application Started" stage. ``` #### What happens - Ambrose routes to Jordan (CRO). - Resolve the contact — ghl_contact_search by name (or use the contact_id directly if you have it) → Maria's contactId. - Read current state — ghl_contact_get + ghl_opportunities_list find her existing opportunity, if any. - Resolve pipeline + stage by name — ghl_pipelines_list maps "Enrollment" → pipelineId and "Application Started" → stageId. You name them in plain English; the spoke does the ID lookup so you never paste raw IDs. - Write the context — ghl_contact_add_note (the call summary) and ghl_contact_add_tags ("aca-ready"). - Move the card — ghl_opportunity_move_stage with the resolved pipelineId + stageId. If she has no opportunity yet, Jordan creates one in the target pipeline/stage with ghl_opportunity_create instead. - (Optional) set status — ghl_opportunity_set_status (open / won / lost / abandoned). #### Approval — nothing moves without you Stage moves and writes are **write** actions, so by default they stage for approval right in the War Room with **Allow / Deny / Always Allow** buttons. Click Approve and the change lands in GHL. If you do this constantly, set those tools to **Allow** on the Tools (#mcp-permissions) page so they run without prompting. #### Sample output ``` Maria Lopez (contact 8aF…21) ✓ Note added: "ACA enrollment call 6/11 — ready to enroll, wants a Silver HMO, confirmed income $40k, household of 2." ✓ Tag added: aca-ready ✓ Opportunity "Maria Lopez — ACA 2026" moved: Pipeline: New Leads → Enrollment Stage: Contacted → Application Started Status: open ``` #### Move many at once ``` Move every contact tagged "called-today" who replied that they're ready into the Enrollment pipeline at "Application Started", add a one-line note on each, and give me a list. ``` Jordan lists the matching contacts and opportunities, resolves the pipeline + stage once, then loops the note + move per contact. Each write still respects your Allow/Ask setting, and you get a summary table at the end. #### Other context moves you can ask for - "Move everyone in Application Started who hasn't replied in 7 days back to Follow-up and tag them stale." → ghl_opportunities_list + ghl_opportunity_move_stage + ghl_contact_add_tags. - "Mark Maria's opportunity won and add a note with her policy number." → ghl_opportunity_set_status + ghl_contact_add_note. - "Create an opportunity for John Park in the Medicare pipeline at New Lead, value $0, and assign it to me." → ghl_opportunity_create. #### Tools used `ghl_contact_search`, `ghl_contact_get`, `ghl_pipelines_list`, `ghl_opportunities_list`, `ghl_opportunity_create`, `ghl_opportunity_move_stage`, `ghl_opportunity_set_status`, `ghl_contact_add_note`, `ghl_contact_add_tags`. #### Wiring GHL integration (#int-ghl) with a PIT that has **Opportunities**, **Contacts**, and **Notes** scope. The same flow works against a user-installed GHL MCP (#mcp-add) — call its `opportunities_*` tools instead. ====================================================================== # Example: Search ACA marketplace plans URL: https://app.hiambrose.com/docs/war-room-marketplace ====================================================================== Use the marketplace-finder spoke to get live ACA plans + APTC subsidy estimates from healthcare.gov in a single chat turn. #### What to type ``` Find ACA plans for a 42-year-old non-smoker in ZIP 75201, household of 2, income $40,000, no dependents. Show me net premium after subsidy, deductible, and out-of-pocket max for the top 3 silver plans. ``` #### What happens - Ambrose routes to Jordan (CRO) with help from Sam (Research). - Sam calls marketplace_county_by_zip for 75201 → Dallas County, TX, FIPS 48113. - Sam calls marketplace_plan_search with the household profile and county FIPS. - The spoke runs the APTC math internally: net_premium = max(0, premium − aptc/12). - Top 3 silver plans are returned with premium, deductible, OOP max, network type, and a link to the carrier's plan brochure. #### Sample output ``` For 42yo, household of 2, income $40,000 in Dallas County, TX: Estimated APTC: $612/month You qualify for cost-sharing reductions. Top 3 Silver plans (sorted by net premium): 1. Ambetter Balanced Care 21 (HMO) Premium $642 − APTC $612 = $30/mo net Deductible $1,500 · OOP max $9,200 · in-network 2. Blue Advantage Silver HMO 005 Premium $678 − APTC $612 = $66/mo net Deductible $4,000 · OOP max $9,450 · in-network 3. Oscar Silver Saver Network Premium $651 − APTC $612 = $39/mo net Deductible $4,800 · OOP max $9,450 · narrow network ``` #### Useful follow-ups - "Filter to plans that cover Atorvastatin and Metformin." → marketplace_drugs_covered. - "Filter to plans that include UT Southwestern in-network." → marketplace_providers_covered. - "Show me the gold tier instead." → re-runs with metal filter. - "Pull the renewal crosswalk for last year's HSA plan." → marketplace_crosswalk. #### HIPAA Marketplace-finder is free posture — only de-identified demographics leave the box (age, ZIP, income tier). No client name, no DOB, no contact info. ====================================================================== # Example: Plan info by plan ID URL: https://app.hiambrose.com/docs/war-room-plan-id ====================================================================== When you already have a specific plan ID (HIOS), get the full benefit grid in one call. #### What to type ``` Pull the benefit grid for plan 38344TX0010001 for plan year 2026. I want deductible, OOP, copays for primary care, specialist, urgent care, ER, and the prescription drug formulary tier breakdown. ``` #### What happens - Sam (Research) calls marketplace_plan_detail with the plan ID and year. - Response includes premium, deductible, OOP max, copays, formulary tier definitions, network type, and the plan's brochure URL. - If you ask "does this plan cover X drug" Sam chains to marketplace_drugs_covered. #### Sample output ``` Plan: Ambetter Balanced Care 21 (HMO) HIOS: 38344TX0010001 · Year 2026 · Metal Silver Premium (42yo, non-smoker): $642/mo Cost-sharing Deductible (medical): $1,500 OOP max: $9,200 Primary care: $30 copay Specialist: $60 copay Urgent care: $75 copay ER: $750 copay (waived if admitted) Pharmacy (4-tier) T1 generic: $5 T2 preferred brand: $50 T3 non-preferred: $100 T4 specialty: 40% coinsurance after deductible Network: HMO — referrals required for specialists. ``` ====================================================================== # Example: Ask the vault URL: https://app.hiambrose.com/docs/war-room-vault ====================================================================== Plain-English Q&A over your private book of business — CSVs, PDFs, XLSX files you uploaded. #### What to type ``` Show me clients renewing in May with Humana MAPD plans. I want name, plan, premium, and county. ``` #### What happens - Taylor (CCO) calls the agent-vault spoke's vault_search. - The vault index resolves "renewing in May" against the renewal_date column (auto-detected during ingest). - "Humana MAPD" is matched against carrier + LOB. - A formatted table is returned with each requested column. #### HIPAA The vault is safe posture — files never leave your account; queries do not send PHI to any external LLM. The agent-vault spoke filters in-process; only the answer (numeric counts, summarized names) returns to the model. More on the PHI Rail (#arch-phi-rail). #### Common follow-ups - "Who has not been contacted in 60+ days?" - "Average commission across MAPD vs PDP last quarter?" - "Find every client whose plan was discontinued for 2026." (joins to the medicare-watchdog signal). ====================================================================== # Example: ICHRA savings & Medicare quotes URL: https://app.hiambrose.com/docs/war-room-quote ====================================================================== plan-quoter is the spoke for "what would this client save / pay" questions. #### ICHRA savings ``` Run an ICHRA savings projection for a 30-person small group in Austin TX. Current premium is $800/employee/month for group coverage. Compare to ICHRA + marketplace silver. ``` Calls `quote_ichra_savings` with the household composition. Returns total group savings, per-employee delta, and APTC-eligible employee count. #### Medicare plan comparison ``` Compare 3 MAPD options for a 67-year-old in ZIP 30303 with Diabetes Type 2, on Metformin and Atorvastatin. Prioritize zero-premium plans. ``` Calls `quote_medicare_options`. Returns a side-by-side: premium, deductible, copays, network, drug-tier copays for the named drugs. #### Wiring plan-quoter is scrubbed posture — the PHI Gateway strips identifiers before the quoting engine sees the payload. ====================================================================== # The nine heads (overview) URL: https://app.hiambrose.com/docs/exec-team ====================================================================== Ambrose ships with nine named executive heads. Each is a Claude Agent SDK session with a fixed personality, a curated set of spokes, and the authority to dispatch its own sub-specialists. The heads are agents in the strict sense — they live as agent files on disk (under `voice-profiles/department-heads/` for personality + role) and as rows in the agents table. What makes them "executive" is that they are always available in the War Room, get auto-attached to every project skill, and may dispatch each other. | Head | Role | Primary spokes | | Ambrose | Chief of Staff | All — orchestrator | | Morgan Chase | CMO | search-audit, demo-forge, channel-bridge, campaign-metrics, lead-hunter | | Jordan Knox | CRO | ghl, plan-quoter, marketplace-finder, reply-bot | | Alex Rivera | COO | ghl, channel-bridge, campaign-metrics, llm-analytics | | Taylor Brooks | CCO | client-vault, agent-vault, reply-bot, ghl | | Dr. Elena Reyes | Compliance | brain (Federal Register, CMS), agent-vault, phi-gateway | | Sam Okafor | Research | brain (all .gov MCPs), marketplace-finder, agent-vault | | Casey Park | CFO | llm-analytics, agent-vault, campaign-metrics, ghl | | Riley Hart | CTO | admin-ops, llm-analytics, channel-bridge | ### How dispatch works - Ambrose receives the question. - Ambrose decides which heads to convene — usually one, sometimes two or three for cross-functional questions. - Each head runs in parallel (Claude Agent SDK with its allowed spokes). - Heads may dispatch their own depth-2 specialists via the Task tool — e.g. Sam → Federal-Register specialist for rule lookups. - Ambrose synthesizes contributions into one answer in your brand voice. ### Editing a head Open Agents → click the head → edit IDENTITY / PERSONALITY / MEMORY / NOTES markdown. Save = live. The same files are read by both the Python core and the Node SDK runner, so the personality stays consistent across surfaces. **Dr. Reyes has veto authority.** Compliance is a hard gate — no other head can ship outbound content (email / SMS / social post) that Elena flagged as non-compliant. ====================================================================== # Ambrose — Chief of Staff URL: https://app.hiambrose.com/docs/head-ambrose ====================================================================== Orchestrator. Sits at the top of the war room and routes every question to the right head. Ambrose is the first point of contact. He decides whether to answer directly (small synthesis), route to a single head, or convene a multi-head War Room. #### Strengths - Cross-domain synthesis. - Context holding across a long thread. - Fast triage — knows which spokes each head owns. - Translating business intent into the next action. #### What not to ask Ambrose - Deep marketing strategy → send to Morgan. - Compliance interpretation → send to Elena. - Financial modeling → send to Casey. #### Image / voice Calm, neutral, observational. Speaks in short sentences. Uses concrete numbers when he has them. ====================================================================== # Morgan Chase — Chief Marketing Officer URL: https://app.hiambrose.com/docs/head-morgan ====================================================================== Owns content, campaigns, brand voice, and outbound channels. #### Authorized spokes - search-audit — AEO/SEO website visibility audits, content planning, blog & video scripts, social packs, HeyGen avatar pipeline. - demo-forge — branded prospect demo sites, JSON-LD schema, rank heatmaps, WordPress posts. - channel-bridge — outbound email + SMS dispatcher (Gmail, GHL, Telegram). - campaign-metrics — opens, clicks, replies, booked-call rates across email/SMS/social. - lead-hunter — Google Maps scraping + email guessing + verification. - ghl — for posting to GHL Social Planner. #### Best questions for Morgan - "Draft this week's blog post on the 2026 OEP changes." - "Write a 5-touch SMS routine for cold ACA leads in Texas." - "Audit my homepage for AEO weak spots." - "Generate this month's social pack." #### Voice Confident, persuasive, slightly punchy. Uses headlines. ====================================================================== # Jordan Knox — Chief Revenue Officer URL: https://app.hiambrose.com/docs/head-jordan ====================================================================== Owns the sales pipeline, objection handling, close strategy, and quote generation. #### Authorized spokes - ghl — pipelines, opportunities, contacts, conversations. - plan-quoter — ICHRA savings + Medicare quotes + ACA marketplace. - marketplace-finder — live healthcare.gov plan search and subsidy estimates. - reply-bot — drafts replies, books appointments. - agent-vault (read) — for objection lookups in past wins. #### Best questions for Jordan - "What is in my pipeline at proposal stage? Sort by expected close date." - "Quote a 40-year-old in 75201 making $40k — top 3 silver plans with net premium." - "Draft an objection-handler for 'I already have coverage through my spouse.'" - "Build a follow-up routine for opportunities that have been at 'Quote Sent' for >7 days." #### Voice Direct, results-oriented, numerate. Uses bullet lists and timelines. ====================================================================== # Alex Rivera — Chief Operating Officer URL: https://app.hiambrose.com/docs/head-alex ====================================================================== Owns the operational layer — pipeline hygiene, automations, infrastructure between systems. #### Authorized spokes - ghl — workflow management, custom-field hygiene, pipeline cleanup. - channel-bridge — outbound dispatcher (used to send ops alerts). - campaign-metrics — funnel performance. - llm-analytics — model usage + cost across the agency. #### Best questions for Alex - "What contacts have invalid email + phone in GHL? Tag them for cleanup." - "Which workflows have not fired in 30 days? Recommend pruning." - "Where did we spend the most credits last week and was it productive?" - "Set up a routine that sends me a Slack ping every morning with last 24h call counts." #### Voice Procedural, checklist-loving, calm under pressure. ====================================================================== # Taylor Brooks — Chief Client Officer URL: https://app.hiambrose.com/docs/head-taylor ====================================================================== Owns client success, churn risk, renewals, and post-sale relationships. #### Authorized spokes - client-vault — read enrollment + policy data per client. - agent-vault — book-of-business queries. - reply-bot — drafts personalized client replies. - ghl — note + tag + task management per contact. #### Best questions for Taylor - "Show me clients renewing in 60 days who have not received a renewal touch." - "Draft renewal emails for the top 10 ICHRA accounts." - "What is my book-wide retention rate this quarter vs last?" - "Who is at risk of churning based on missed-payment + no-engagement signals?" #### Voice Warm, attentive, asks about the person before the policy. ====================================================================== # Dr. Elena Reyes — Compliance URL: https://app.hiambrose.com/docs/head-elena ====================================================================== Owns CMS marketing rules, HIPAA, BAA enforcement, and the veto gate on outbound content. #### Authorized spokes - brain — Federal Register, CMS marketing guidelines, ACA / Medicare rule data. - agent-vault — for cross-referencing client-facing content against past complaints. - phi-gateway — to inspect what was scrubbed / hydrated for audit purposes. #### Veto authority Elena is a hard gate on every outbound piece of marketing or client comms. If she flags an SMS draft as non-compliant, channel-bridge will not send it without an explicit override from a human admin. #### Best questions for Elena - "Does this SMS draft violate CMS marketing rules?" - "What changed in the Federal Register on Medicare marketing this week?" - "Audit my last 30 days of outbound for compliance risk." - "Generate a BAA-required disclosure for my landing page." #### Voice Precise, citation-heavy, never hand-waves a rule. ====================================================================== # Sam Okafor — Research URL: https://app.hiambrose.com/docs/head-sam ====================================================================== Primary user of The Brain. Calls every federal/healthcare data MCP. #### Authorized spokes - brain (primary) — all 25+ .gov data sources: CMS, NADAC, FDA, Medicare, Medicaid, Federal Register, FEMA, FMCSA, SEC, IRS 990s, … - marketplace-finder — live healthcare.gov plan + subsidy data. - agent-vault — to cross-reference research findings against your own book. - ghl — usually read-only for context. #### Best questions for Sam - "How many MAPD plans in Tarrant County had Star Rating drops for 2026?" - "What is the NADAC for Atorvastatin 20mg as of the latest pricing file?" - "Pull the latest CMS rule on agent compensation caps for 2026 plan year." - "What did the Federal Register publish on ACA marketing this month?" #### Voice Scholarly, citation-led, attaches sources to every number. ====================================================================== # Casey Park — Chief Financial Officer URL: https://app.hiambrose.com/docs/head-casey ====================================================================== Owns revenue, commissions, reconciliation, and AI spend. #### Authorized spokes - llm-analytics — token usage, cost breakdown, provider performance. - agent-vault — commission CSVs, carrier statements. - campaign-metrics — ROI per channel. - ghl — opportunity dollar values, pipeline forecast. #### Best questions for Casey - "Forecast Q4 revenue based on the current pipeline + historical close rate." - "Reconcile last month's carrier commission CSV against my GHL opportunities." - "Which agent is generating the most pipeline dollars per AI credit spent?" - "Which carriers paid me the most in 2026 YTD?" #### Voice Numerate, conservative, attaches a confidence interval to every projection. ====================================================================== # Riley Hart — Chief Technology Officer URL: https://app.hiambrose.com/docs/head-riley ====================================================================== Owns integrations, system health, automations, and the admin-ops surface. #### Authorized spokes - admin-ops — read + create + update agents / teams / skills / MCPs / routines. - llm-analytics — service-level performance. - channel-bridge — used to send ops + on-call notifications. #### Best questions for Riley - "Create a new agent called RenewalsBot with model claude-sonnet-4-6 and access to agent-vault." - "Mount the Linear MCP and allow it for the engineering team." - "Are there any spokes that have been failing in the last 24h?" - "Add a routine that runs the medicare watchdog every Sunday 8am." #### Voice Pragmatic, terse, prefers concrete commands over abstractions. ====================================================================== # What is an agent URL: https://app.hiambrose.com/docs/agents ====================================================================== An agent is the canonical AI persona unit in Ambrose. One agent = one identity + one voice + one memory + one set of capabilities. ### What an agent owns - A slug (kebab-case) that becomes the URL: /api/agent//run. - A name and a role. - Markdown files for identity / personality / memory / notes — see Agent files. - A provider + model — Anthropic Claude or AWS Bedrock. - An allowed_spokes list — which capabilities it can reach. - (Optional) attached_teams — sub-agents it can delegate to. - (Optional) attached_mcps — external MCP servers it can call. - (Optional) consumer tokens — for shared API access. ### Agent vs Team vs Exec head - The nine exec heads are agents — fixed roster, always in the War Room. - Your custom agents are agents you create for specific jobs (a RenewalsBot, a Closebot persona, a VAPI voice agent). - A team is a separate row that bundles a prompt + tool access + GHL webhook. An agent can play a team for a specific task. ### Endpoints every agent gets for free Every agent auto-publishes seven URL shapes — see 7 URL shapes per node (#connect-shapes). ====================================================================== # Create an agent URL: https://app.hiambrose.com/docs/agent-create ====================================================================== New agents take less than a minute. You can create them in the UI, via the floating chat widget, or by dropping a folder on disk (self-hosted). ### From the UI 1Open Agents (/agents) → click **+ New agent**. 2Pick a name (e.g. RenewalsBot) and slug (auto-suggested: `renewalsbot`). 3Pick a model. Defaults to your account default (see Models (#models)). 4Edit IDENTITY.md, PERSONALITY.md, MEMORY.md right in the browser. Templates are pre-filled. 5Toggle on the spokes you want this agent to reach. 6(Optional) Attach an MCP server or a team. 7Click Save. The agent is live — try it in chat using the "Test" button on the detail page. ### From the floating chat widget ``` Create a new agent called RenewalsBot with model claude-sonnet-4-6, give it access to agent-vault, channel-bridge, and ghl. ``` The widget shows a confirm card with the preview. Click Approve to create. ### Hot reload Edits to any agent file take effect on the next chat turn. No restart needed. ====================================================================== # Agent files URL: https://app.hiambrose.com/docs/agent-files ====================================================================== Each agent is a folder of markdown files. Edit any file and the next chat turn picks up the change. | File | What it is | Typical length | | IDENTITY.md | Who the AI is. Job, scope, what it is and is not for. | 1 paragraph | | PERSONALITY.md | Voice, tone, style. Punchy vs careful, formal vs warm, etc. | 3–6 paragraphs | | MEMORY.md | Persistent facts the agent has learned across past conversations. Auto-updated by the memory extractor; user-editable. | Grows over time | | NOTES.md | Freeform — quirks, rules, edge cases, the agent's "do not do this" list. | Bullet list, any length | | VOICE.md | (Optional) Per-agent override of the brand voice. Use when this agent talks to a different audience. | 1–2 paragraphs | | CANONICAL.md | System-prompt body composed from the above. Auto-generated — usually do not hand-edit. | Auto | | agent.json | Structured config: name, slug, model, allowed_spokes, attached_teams, attached_mcps, auth_tokens. | JSON | ### Per-agency overrides When you edit an agent in the UI, the change writes to the `node_files` table for your agency. The on-disk file is the bootstrap; your edits never affect other agencies. ### Sample IDENTITY.md ``` # RenewalsBot The agency's renewal-shepherd. Owns every client whose policy renews in the next 90 days. Generates personalized renewal drafts, flags coverage gaps, and queues calendar invites for review calls. Strengths: deep vault recall, can join client demographics to plan-year changes, drafts in the agency's brand voice. Not a quoting engine. Hand quote work to Jordan (CRO). ``` ====================================================================== # Provider & model URL: https://app.hiambrose.com/docs/agent-model ====================================================================== Per-agent model selection. Pick the right model for the job and the budget. | Provider | Models | When to use | | Anthropic Claude | opus-4.7, sonnet-4.6, haiku-4.5 | Default for everything. Best reasoning at sonnet, fastest at haiku, deepest at opus. | | AWS Bedrock (Anthropic) | Same Claude lineup via Bedrock endpoints | When you want billing through your own AWS account, or you have a BAA with AWS. | ### Which model when - Haiku — high-volume routing, simple classifications, voice agents that need <1s latency. - Sonnet — most agent work. Good balance of speed and quality. - Opus — long-context analysis, multi-step reasoning, the War Room synthesis step. ### Bring your own keys By default your agency uses the System Bedrock token (managed by SAA), deducted from your credits based on token usage. To use your own Anthropic key or AWS account, paste it in Settings → API keys (#settings-api-keys). ====================================================================== # Allowed spokes URL: https://app.hiambrose.com/docs/agent-spokes ====================================================================== Per-agent spoke allowlist. The agent can only call spokes that are explicitly on its list. Each agent has `allowed_spokes` in its `agent.json`. The list is a hard gate — if a spoke is not on it, the agent cannot call any tool in that spoke, even if the LLM tries to. ### Default The exec heads come with curated lists (see exec team (#exec-team)). Your custom agents start empty — explicitly toggle on what you need. ### Per-tool permissions inside a spoke Allowed_spokes is the spoke-level gate. Inside a spoke, you can further restrict which actions are allowed in Tools (/tools) → per-agent permissions. See Permissions (#mcp-permissions). ### How to think about scope - Give an agent only what it needs. A RenewalsBot does not need lead-hunter or demo-forge. - Spokes that touch external systems (ghl, channel-bridge) deserve extra thought — that is where outbound writes happen. - The vault spokes (agent-vault, client-vault) are safe posture — always fine. ====================================================================== # Attached teams URL: https://app.hiambrose.com/docs/agent-teams ====================================================================== Sub-agents the agent can delegate to via the Task tool. An agent's `attached_teams` list (in `agent.json`) defines which other teams it may dispatch to during a single chat turn. The agent uses the Claude Agent SDK's Task tool to send a sub-task and wait for the result before continuing. #### When to attach a team - The agent needs a depth-2 specialist for a slice of the job (e.g. CRO dispatches to a "Pricing Specialist" team to do the actual quote math). - You want a parent agent to coordinate without holding the specialist's full prompt in its own system prompt. #### How dispatch works - Parent agent decides to dispatch. - Calls Task tool with the sub-team slug + the question. - Sub-team runs as its own Claude Agent SDK session with its own spokes. - Result returns as a tool message; parent integrates and continues. #### Limits The default cap is 40 tools across the union of the parent + all attached MCPs + spokes. The Agent SDK truncates tool descriptions to 180 characters to stay under provider limits. See Permissions (#mcp-permissions). ====================================================================== # Attached MCPs URL: https://app.hiambrose.com/docs/agent-mcps ====================================================================== External MCP servers (Slack, Linear, GitHub, Notion, …) mounted as tools on this agent. Beyond the built-in spokes, you can attach any MCP server to an agent. The agent will see those tools alongside its spoke tools. #### Add an MCP See Add an MCP server (#mcp-add) for the full flow. Short version: 1Settings → MCP tab → Add MCP server. Pick stdio or HTTP. 2Enter the connection details (command + args for stdio; URL + auth header for HTTP). 3Test connection — Ambrose introspects the server's tool list. 4Save → the MCP is now mountable. 5On the agent's detail page → Attached MCPs → toggle this MCP on. #### Per-tool permissions Inside the attached MCP, you can allow individual tools and deny others. Permissions (#mcp-permissions). #### HIPAA External MCPs by default go through the PHI Rail. Mark a destination as BAA-allowlisted only if you have a signed BAA with the vendor. ====================================================================== # Routines in an agent URL: https://app.hiambrose.com/docs/agent-routines ====================================================================== Schedule prompts to run automatically against this agent. Cron schedule + prompt body + (optional) target audience. Open the agent's detail page → **Routines** tab. Click **+ New routine**. #### Fields - Name. Short label (e.g. "Morning book check"). - Cron. Standard 5-field cron (0 9 * * * = every day 9am). See Cron syntax. - Prompt. The exact text sent to the agent on every fire. - PHI mode. Override the default for this routine (Fast / BAA). - Output sink. Where to send the result: log only, Slack channel, email, GHL note on a contact, … #### Examples - "Every morning 8am, summarize last 24h GHL activity to my #ambrose-daily Slack channel." - "Every Sunday 7pm, run the medicare watchdog and email me the findings." - "Every Monday 9am, draft this week's social pack and save it as a draft post in GHL." #### History Every run is logged with input, output, tokens, latency, cost. See History & logs (#routines-history). ====================================================================== # Consumer tokens URL: https://app.hiambrose.com/docs/agent-tokens ====================================================================== Per-agent, per-consumer bearer tokens. Surgical sharing. Every agent accepts `Authorization: Bearer `. Tokens are namespaced by a consumer label so you can revoke one without touching the others. ``` { "auth_tokens": { "closebot-prod": "ambrose_aBc123…", "vapi-test": "ambrose_xYz456…", "webhook-zap": "ambrose_mNo789…" } } ``` #### Generate Agent detail → **Consumer Tokens** → type a name → Generate. The token is shown **once**. Copy it now or rotate. #### Revoke Same panel → Revoke next to the consumer name. The token stops working immediately; other consumers keep going. #### Open vs auth Webhooks (closebot / vapi / retell / custom / ghl) are open by default — external platforms rarely set headers. Use URL secrecy or a signature header for protection. The other endpoints (run, openai, mcp) accept session, agency Bearer, or consumer token. ====================================================================== # Share an agent URL: https://app.hiambrose.com/docs/agent-share ====================================================================== One agent = many URL shapes. Pick the one your platform needs and paste. Open the agent's detail → **Connect to any system**. Each row is a URL — click to copy. | Shape | Use for | | POST /api/agent//run | Anything that can POST JSON. Zapier, Make, your own code. | | POST /api/agent//openai/chat/completions | VAPI Custom LLM, Retell Custom LLM, OpenAI SDK base_url. | | POST /api/agent//webhook/closebot | Closebot custom tool. | | POST /api/agent//webhook/vapi | VAPI tool call. | | POST /api/agent//webhook/retell | Retell custom function. | | POST /api/agent//webhook/custom | Bland, Synthflow, anything else. Auto-detects the input field. | | POST /api/agent//mcp | VAPI native MCP, Cursor "Add by URL", Claude Desktop HTTP MCP. | **GHL workflow webhooks moved to teams.** Agent-level `/webhook/ghl` URLs return 404. Use team GHL webhooks (#team-ghl-webhook) instead. #### For details on each platform - VAPI · Retell · Closebot - Make / Zapier / generic webhook - Claude Desktop / Cursor ====================================================================== # What is a team URL: https://app.hiambrose.com/docs/teams ====================================================================== A team is a role config. It bundles a prompt + tool access + routines + an immutable GHL webhook URL. Teams are the canonical surface for GHL workflow webhooks. ### Team vs Agent | | Agent | Team | | Primary use | Conversational persona | Role / job config + automation surface | | Has voice + memory? | Yes | Optional | | GHL workflow webhook? | No (removed 2026-05-07) | Yes (canonical) | | OpenAI-compatible endpoint? | Yes | Yes | | MCP endpoint? | Yes | Yes | | Routines? | Yes | Yes | | Webhook_id? | — | Yes — immutable 8-char alphanumeric | ### What lives inside a team - A slug + a name. - A webhook_id (assigned on create, immutable, the URL slug GHL uses). - Prompts and supporting markdown files (see prompts). - An allowed_spokes list — same shape as agents. - Routines (scheduled prompts). - An MCP endpoint at POST /api/team//mcp — see team MCP deep dive. - Integration URLs (closebot, vapi, retell, custom, ghl, mcp, run, openai). ### When to pick a team over an agent - You need a GHL workflow webhook → team. (Required.) - You want an automation surface that several agents can dispatch to → team. - You want a conversational persona with its own identity / memory → agent. ====================================================================== # Create a team URL: https://app.hiambrose.com/docs/team-create ====================================================================== Teams take less than a minute. The webhook_id is assigned automatically — copy it once, paste into GHL. 1Open Teams (/teams) → **+ New team**. 2Name + slug. The webhook_id is generated on save. 3Pick the model. 4Write the prompt — see prompts (#team-prompts). 5Toggle on the spokes the team should reach. 6Save → open the **Integrations** tab to copy the GHL webhook URL and any other connection URLs. #### Via the floating chat widget ``` Create a team called LeadQualifier with model claude-haiku-4-5. Give it access to ghl and reply-bot. Add a GHL webhook for the new lead intake workflow. ``` ====================================================================== # Team prompts & files URL: https://app.hiambrose.com/docs/team-prompts ====================================================================== Teams have a primary prompt and any number of supporting markdown files. ### Primary prompt The system prompt the team runs with. Short and operational — what does this team do, what are the inputs, what is the expected output. ### Supporting files Optional. Drop additional markdown files (rules, FAQ, examples) into the team folder. They are concatenated into the system prompt in order. ### Hot reload Edits take effect on the next run. No restart needed. ### Example: a Lead Qualifier team ``` # Lead Qualifier You qualify inbound GHL leads for the agency. On every webhook fire: 1. Read the contact (custom fields, tags, last conversation). 2. Decide one of: HOT, WARM, COLD, REJECT. 3. Add the corresponding tag. 4. Add a note explaining your decision. 5. If HOT — book on Jordan's calendar if a calendar slug is available. Rules: - Reject any contact with the 'opt_out' tag. - HOT requires: budget > $300/mo OR explicit timeline ", "actions": [...] } ``` ====================================================================== # Routines in a team URL: https://app.hiambrose.com/docs/team-routines ====================================================================== Same shape as agent routines. Cron + prompt + sink. Open the team detail → Routines tab. See Routines in an agent (#agent-routines) — the form and the runtime are identical. The only difference is that the routine is attached to a team slug rather than an agent slug. #### Common team routines - Lead Qualifier team — runs every 6h on net-new GHL contacts that have not been qualified yet. - Renewal Drafter team — runs every Monday on contacts whose renewal is 45–60 days out. - Compliance Auditor team — runs nightly on the last 24h of outbound; flags violations to Elena. ====================================================================== # Routine run logs URL: https://app.hiambrose.com/docs/team-logs ====================================================================== Every team run — routine-fired, webhook-fired, or manual — is logged with full input + output + tool calls. #### Where to find them - Team detail → Logs tab — last 100 runs for this team. - /logs → AI calls — every model call across the agency, filterable by team / agent / model / status / time. #### What is captured - Trigger (webhook / routine / manual). - Caller (IP, signature, source platform). - Input payload. - Tool calls — every spoke action, args, response. - Output payload. - Tokens (in / out / cache hits), cost, latency, model. - Errors with stack + retry attempts. #### Retention 30 days by default. Bump to 90 / 180 / 365 in Settings → Billing & usage (#settings-billing). ====================================================================== # GHL workflow webhook (deep dive) URL: https://app.hiambrose.com/docs/team-ghl-webhook ====================================================================== Every team auto-publishes one GHL workflow webhook URL. Point a GHL Workflow → Webhook action at it, and the team runs against the inbound contact on every trigger. This is the canonical GHL integration as of May 2026. ### The URL ``` POST https://app.hiambrose.com/api/team//webhook/ghl ``` The `webhook_id` is an immutable 8-character alphanumeric assigned at team creation. Find it on the team's **Integrations** tab. Slug-based URLs (`/api/team//webhook/ghl`) also work for back-compat. **Agent-level `/webhook/ghl` is gone.** Any GHL workflow still pointing at `/api/agent//webhook/ghl` returns 404 with a migration message. Move to the team URL. ### Request type & parameters | Field | Type | Required | | Method | POST | yes | | Content-Type | application/json | yes | GHL's Webhook action sends the contact object plus a `customData` map (this is where you put your instruction + flags). Ambrose reads these fields: **Required for GHL:** a contact id (`contact_id`) **and** an instruction (`customData.instructions`). Without an instruction the team falls back to a generic review/draft; for GHL workflows always send one. | Body field | Required | What it is | | contact_id / contact.id / top-level id | Yes | The GHL contact. Resolution order: contact_id → customData.contact_id → contact.id → top-level id → email lookup. (Nested workflow.id / location.id are never used as the contact.) | | customData.instructions (or customData.instruction) | Yes | The command for the team — e.g. "Draft a renewal SMS and add it as a note." | | email / contact.email | If no id | Used to look up the contact when no id is present. Loads that contact's prior conversation, notes, fields & opportunities. | | customData.sync | No | true to wait for the result in the HTTP response (use when a later workflow step needs the output). Default is fast-ack: Ambrose returns immediately and processes in the background. | | customData.auto_create_fields | No | true to let the team create missing custom fields. Off by default. | | any other contact fields | No | name, phone, tags, and every contact custom field — all passed to the team as context. | In the GHL Webhook action you typically map `{{contact.id}}` and add a `customData` key `instructions` with your command. The instruction is read **only** from `customData.instructions` (or `customData.instruction`) — a top-level `instruction` is ignored. (Top-level `contact_id` is accepted for non-GHL callers like curl / Make / Zapier.) **What the team actually receives on every fire:** - Full team persona — every team markdown file (SOUL / PERSONALITY / FLOW / NOTES / FAQ …) as the system prompt. - The skills you selected on the team's Tools tab — each skill's playbook is injected so the AI follows it. - The GHL CRM toolset — read conversation/notes/fields/pipelines/appointments + write notes/tags/fields, draft & send SMS/email, move pipeline stages, create tasks. - The complete inbound payload — every contact custom field GHL sends (both the top-level fields like ai_context_json, Contact Context JSON, business/AEO/social fields, AND anything under customData) is passed to the AI as context. Empty fields are skipped to keep the prompt tight. - The contact's prior conversation history — pulled live from GHL by contact id (oldest→newest), so replies are in-context. The AI then performs the task in `customData.instructions` using all of the above. #### Example body GHL sends the contact fields at the **top level** and your task inside `customData`: ``` { "contact_id": "{{contact.id}}", "email": "{{contact.email}}", "full_name": "{{contact.name}}", "location": { "id": "{{location.id}}" }, "ai_context_json": "…", // GHL also sends every contact custom field at the top level "customData": { "instructions": "Draft a renewal SMS in our voice, add it as a note, and tag 'renewal-drafted'.", "sync": false } } ``` ### How it works end to end 1A GHL workflow trigger fires (new contact, tag added, opportunity moved, form submission, calendar booking, …). 2The workflow has a **Webhook** action that POSTs the contact payload to the team URL. 3Ambrose reads the contact + recent conversation + notes + custom fields + opportunities (whatever the team prompt asks for) via the `ghl` spoke. 4The team runs its prompt with that context. 5Specific output fields in the JSON response are flattened into top-level keys (`tier`, `note`, `tag_add`, `tag_remove`, `sms_draft`, …) so the GHL workflow can pick them up as variables. 6Subsequent GHL workflow steps use those variables (e.g. "if tier = HOT, route to Jordan's calendar"). ### The two operating modes #### Mode 1 — Default (review & draft) If you do not provide an explicit instruction, the team reads the contact and returns a triage: a tier + a one-line reason + suggested next actions. Nothing is written to GHL unless the team prompt explicitly says so. #### Mode 2 — Operator instruction If the webhook body includes `customData.instructions`, the team treats it as a direct command. The instruction-router has ~20 tools available: | Read | Write | | read_conversation | add_note | | read_notes | add_tags | | read_opportunities | remove_tags | | read_custom_fields_schema | update_contact_native | | read_pipelines | update_custom_fields | | read_tags | create_custom_field (off by default) | | read_appointments | generate_sms / send_sms | | read_calendars | generate_email / send_email | | | move_pipeline_stage | | | create_task | ### Example 1 — Lead Qualifier Trigger in GHL: New contact added to "Web leads" tag. Workflow webhook body sent to Ambrose: ``` { "contact_id": "abc123", "location_id": "loc_xxx", "first_name": "Maria", "last_name": "Lopez", "email": "maria@example.com", "phone": "+12145551234", "custom_fields": { "interest": "ICHRA", "budget": "350" } } ``` Team prompt (the Lead Qualifier from the prompts (#team-prompts) page) returns: ``` { "tier": "HOT", "reason": "ICHRA inquiry + budget > $300/mo with explicit week-out timeline.", "actions": [ { "type": "add_tags", "tags": ["hot_lead", "ichra"] }, { "type": "add_note", "body": "Qualified HOT by Ambrose — ICHRA + budget $350." }, { "type": "create_task", "title": "Jordan: book ICHRA discovery", "due_in_hours": 24 } ] } ``` The handler flattens `tier` to a top-level field, executes the actions, and the GHL workflow's next step branches on `{{webhook_response.tier}} == "HOT"`. ### Example 2 — Operator instruction Trigger: Tag added: "renewal_pending". Workflow webhook body includes an instruction: ``` { "contact_id": "xyz789", "customData": { "instructions": "Draft a renewal email in our brand voice. Include current plan, last year's claim count, and propose a 15-min review call. Add the draft as a contact note and tag 'renewal_drafted'." } } ``` The team uses the instruction-router to: read_conversation + read_notes + generate_email + add_note + add_tags. No SMS or email actually sends — the draft is parked as a note for human review. ### Example 3 — Calendar booked → send confirmation ``` { "contact_id": "lmn456", "appointment": { "calendar_id": "cal_xyz", "start_time": "2026-05-29T15:00:00Z" }, "customData": { "instructions": "Send a calendar-confirmation SMS in my brand voice. Include the time in their local zone, link to a 2-question prep form, and a reminder to test their phone audio. Stop here." } } ``` Uses: generate_sms → send_sms. add_note with the sent body. ### Response: fast-ack vs sync **By default the webhook is fast-ack**: it validates the payload, queues the job, and returns immediately (so GHL's 30-second step timeout never trips). The AI runs in the background and writes its results straight into GHL (notes, tags, custom fields). If a later workflow step needs to branch on the AI's output, send `customData.sync: true` — then the call waits and returns the full result below (capped by GHL's 30s timeout; use only for low-volume flows). In **sync** mode the response exposes: ``` { "ok": true | false, "tier": "...", // if your prompt returned one "actions_taken": [...], // every write that ran "custom_fields_updated": [...], "errors": [...], // any write that failed "raw": { ... } // the team's full output } ``` In fast-ack (default) mode the response is a small acknowledgement — read outcomes from the contact's updated fields/notes, or check the team's Logs tab. ### Safety rails - Webhooks are open by design — GHL does not let you set arbitrary auth headers. Use URL secrecy (the unguessable webhook_id) and signature verification if you need stronger protection. - Auto-create-off by default — the team cannot create new custom fields unless you flip a per-team flag. - Outbound SMS / email defaults to draft mode. Switch a team to auto-send only after you have watched it for a few days. - Every webhook fire is logged in the team's Logs tab with the inbound body, tool calls, and response. ### Connecting in GHL 1In Ambrose → team detail → Integrations → copy the GHL webhook URL. 2In GHL → Workflows → pick the workflow → add a **Webhook** action. 3URL = the copied URL. Method = POST. Body = use the workflow's `{{contact.*}}` variables, and add a `customData` key `instructions` with your command. 4Save + activate the workflow. Test by triggering it on a test contact. 5Open the team's Logs tab to see the inbound fire + the team's response. ### HIPAA The `ghl` spoke is scrubbed by default. Per-sub-account you can flip a BAA flag in the GHL integration card (only if you have a signed BAA covering that sub-account's data). ====================================================================== # Team MCP endpoint (deep dive) URL: https://app.hiambrose.com/docs/team-mcp ====================================================================== Every team also publishes a Streamable HTTP MCP server. Mount the team URL in any MCP-aware client (Claude Desktop, Cursor, VAPI, Retell, your own SDK) and the team becomes a single tool with the right input schema. ### The URL ``` POST https://app.hiambrose.com/api/team//mcp ``` Streamable HTTP MCP — the modern wire format. Works with any MCP client that supports HTTP transport. ### What the client sees — the full tool surface The endpoint does **not** expose just one tool. A `tools/list` call returns everything this team is wired to, so the connecting client (Claude, Cursor, VAPI, your SDK) can use the team's tools directly — not just delegate to the whole team. You get: - The team meta-tool — ask_. Hand the whole job to the team's reasoning: ask_lead_qualifier({ input: "qualify contact xyz789" }). - One tool per spoke action — every tool of every spoke attached to the team, named __. E.g. ghl__ghl_contact_search, agent_vault__vault_list, plan_quoter__ichra_savings. The real tool names + schemas come live from each spoke, so they always match what the spoke can actually do. - The Brain meta-tools — when the team has brain (or a scoped brain:) enabled: brain_catalog, brain_tool_schema, brain_execute for the federated .gov/healthcare data. - Attached skills — one skill__ tool per skill the team has, which runs that SKILL.md playbook through the team. - Attached external MCPs — tools from any user-installed MCP the team has, re-exposed as mcpext____. - Introspection + management — ambrose_get_info, ambrose_list_files, ambrose_read_file, ambrose_list_tools, ambrose_list_sequences, ambrose_create_sequence, ambrose_get_logs, ambrose_agency_info. ``` { "name": "ask_lead_qualifier", "description": "Run the Lead Qualifier team. Qualify a GHL contact as HOT/WARM/COLD/REJECT.", "input_schema": { "type": "object", "properties": { "input": { "type": "string", "description": "Natural-language instruction for the team." } }, "required": ["input"] } } ``` **Tenant isolation.** Every call is scoped to the team's owning agency, resolved from the URL's `webhook_id` — never from the client. So `agent_vault__vault_list` over a team MCP reads that agency's vault and nothing else; spoke credentials, attached MCPs, and skills are all the owning agency's. A client can't read another tenant's data by passing a different agency id. ### Vault + spoke tools actually work over MCP Because the endpoint publishes the live tool list, a connected client can read the agency's vault, query GHL, run quotes, hit the Brain, and so on — directly: ``` // list the agency's private vault (book of business) over the team MCP callTool({ name: "agent_vault__vault_list", arguments: {} }) // search it callTool({ name: "agent_vault__vault_search", arguments: { query: "Blue Cross enrollment" } }) // move a contact's opportunity in GHL callTool({ name: "ghl__ghl_opportunity_move_stage", arguments: { /* … */ } }) ``` The agency id is injected server-side for spokes that need it (the vaults), so you never pass it — and can't override it. ### Manage agency skills over MCP If the team has the **`admin-ops`** capability enabled, the endpoint also exposes `ambrose_skill_create`, `ambrose_skill_update`, `ambrose_skill_list`, and `ambrose_skill_delete`. These let a connected client (e.g. Claude) create and update your agency's skills directly — and they apply immediately (no staged-confirm step). They only ever touch your agency's own skills, never the shared system/default skills or another agency's. If `admin-ops` isn't enabled on the team, these tools don't appear. ``` callTool({ name: "ambrose_skill_create", arguments: { slug: "objection-handling", name: "Objection Handling", description: "How we answer the top 5 ACA objections", body: "When a prospect says it's too expensive, ..." }}) ``` ### Example 1 — Mount in Claude Desktop ``` // ~/.claude/mcp_settings.json { "mcpServers": { "ambrose-leadqualifier": { "type": "http", "url": "https://app.hiambrose.com/api/team/leadqualifier/mcp", "headers": { "Authorization": "Bearer " } } } } ``` Restart Claude Desktop. The team appears as a tool. You can then ask Claude "qualify contact xyz789" and it will call the team. ### Example 2 — Mount in Cursor Settings → MCP → Add → Add by URL. Paste the team URL + bearer token. Save. The team's tools appear in the cmd-shift-K composer. ### Example 3 — Mount on VAPI as native MCP VAPI's MCP tab → Add MCP server → paste the team URL + token. The team's tool is now callable mid-call by VAPI's voice agent. ### Example 4 — From your own code (TypeScript) ``` import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; const transport = new StreamableHTTPClientTransport( new URL('https://app.hiambrose.com/api/team/leadqualifier/mcp'), { requestInit: { headers: { Authorization: 'Bearer ' + token } } } ); const client = new Client({ name: 'my-client', version: '1.0.0' }, {}); await client.connect(transport); const result = await client.callTool({ name: 'ask_lead_qualifier', arguments: { input: 'Qualify contact xyz789 and recommend a tier.' } }); console.log(result); ``` ### Example 5 — From Python (anthropic SDK) ``` from anthropic import Anthropic client = Anthropic() resp = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, mcp_servers=[ { "type": "url", "url": "https://app.hiambrose.com/api/team/leadqualifier/mcp", "name": "ambrose-leadqualifier", "authorization_token": TOKEN, } ], messages=[{"role": "user", "content": "Qualify contact xyz789"}], ) ``` ### Auth - Open by default — pass no header and it works (rate-limited per IP). - For production, generate a consumer token on the team detail page and require Authorization: Bearer . ### Schemas you can hand-write If the auto-generated schema is too loose, drop a `tools.json` next to the team prompt: ``` { "input_schema": { "type": "object", "properties": { "contact_id": { "type": "string" }, "instruction": { "type": "string" } }, "required": ["contact_id"] } } ``` The MCP handshake will use yours instead. This is how you get crisp tool descriptions in the calling LLM's catalog. ### HIPAA MCP calls go through the same PHI Rail as any other team run. PHI mode is set per-call via the `phi_mode` tool argument when present, otherwise it defaults to Fast (scrub). ### Tool-count limits Calling LLMs cap their tool catalog (Claude: 40 tools per request). If a team has too many sub-tools, the MCP endpoint returns the top-priority 40 and logs the truncation in the team's logs. ====================================================================== # Integration URLs URL: https://app.hiambrose.com/docs/team-integrations ====================================================================== Every team auto-publishes eight URL shapes for external systems. Open the team detail → **Integrations** tab. Each row is a URL — click to copy. | Shape | Use for | | POST /api/team//run | Generic JSON invoke. | | POST /api/team//openai/chat/completions | OpenAI-compatible — VAPI Custom LLM, Retell Custom LLM, OpenAI SDK base_url. | | POST /api/team//mcp | Streamable HTTP MCP — see deep dive. | | POST /api/team//webhook/ghl | GHL workflow webhook — see deep dive. | | POST /api/team//webhook/closebot | Closebot tool. | | POST /api/team//webhook/vapi | VAPI function call. | | POST /api/team//webhook/retell | Retell custom function. | | POST /api/team//webhook/custom | Anything else — Bland, Synthflow, Zapier, Make. | ====================================================================== # What routines do URL: https://app.hiambrose.com/docs/routines ====================================================================== A routine is a scheduled prompt attached to an agent or a team. It is the easiest way to make Ambrose run on its own — nightly book checks, weekly newsletters, daily KPI digests. ### Anatomy - A cron schedule (5-field: min hr dom mon dow). - A target — an agent or a team. - A prompt body — what to ask. - An output sink (optional) — Slack, email, GHL note, log only. - A PHI mode (optional) — override the default. ### Where to add one - Per-agent: agent detail → Routines tab. - Per-team: team detail → Routines tab. - Cross-agency view: Routines in the top nav — one list of every scheduled routine with deep-links into the owning node. ### Sample routines | What | Cron | Target | Prompt | | Morning briefing | 0 8 * * * | Agent: Ambrose | "What changed since yesterday? Summarize in 5 bullets." | | Renewal scan | 0 9 * * 1 | Team: Renewals | "List clients renewing in next 45 days who haven't received a touch." | | Watchdog daily | 0 7 * * * | Agent: Sam | "Run aca_scan_book + medicare_scan_book. Post findings to Slack #alerts." | | Weekly social | 0 9 * * 1 | Agent: Morgan | "Generate this week's social pack (LinkedIn + IG + FB)." | | Fire a Claude Routine | 0 22 * * * | Agent: Ambrose | Run the Claude Routine "Nightly Book Report". (how) | ====================================================================== # Cron syntax URL: https://app.hiambrose.com/docs/routines-cron ====================================================================== Five-field cron. UTC by default; toggle to your local zone in account settings. ``` min hr day-of-month month day-of-week * * * * * 0-59 0-23 1-31 1-12 0-6 (0=Sun) ``` | Expression | Meaning | | 0 9 * * * | Every day at 9:00. | | 0 9 * * 1 | Every Monday at 9:00. | | */15 * * * * | Every 15 minutes. | | 0 0 1 * * | First of every month at midnight. | | 0 7-19 * * 1-5 | Hourly 7am–7pm, Mon–Fri. | **Tip.** The routine editor has a live human-readable preview — type a cron and it shows the next 3 fire times so you can sanity-check. ====================================================================== # History & logs URL: https://app.hiambrose.com/docs/routines-history ====================================================================== Every fire is logged with input, output, tool calls, tokens, latency, cost, and any errors. Per-routine: open the routine → **History** tab. The last 100 runs are shown with status, duration, tokens, and a "view" link to the full transcript. Cross-agency: /logs (/logs) with the "Routine" filter chip selected. Failed runs are retried up to 3 times with exponential backoff. After 3 fails the routine is paused and the agency admin is notified. ====================================================================== # What is a Claude Routine URL: https://app.hiambrose.com/docs/claude-routines ====================================================================== A Claude Routine is a saved Claude Code session on claude.ai that runs unattended when called. Register one in Ambrose and your agents, teams, and the chat can trigger it by name — including from a scheduled Routine. A **routine** lives in Claude Code on the web (https://claude.ai/code/routines): a saved prompt + repositories + connectors, packaged so it can run on a schedule, on a GitHub event, or over HTTP. Ambrose uses the HTTP entry point — you register a routine once, and Ambrose fires it on your behalf, returning a link to the live Claude Code session. **What you need first.** A claude.ai account on a Pro, Max, Team, or Enterprise plan with Claude Code on the web enabled, plus a routine you've already created at claude.ai/code/routines (https://claude.ai/code/routines). ### 1 · Get the routine's API trigger token 1Open your routine for editing at claude.ai/code/routines (https://claude.ai/code/routines). 2Under **Select a trigger**, click **Add another trigger** and choose **API**. 3Click **Generate token**. The modal shows the routine URL (it contains a `trig_…` id) and a bearer token (`sk-ant-oat01-…`). **Copy both now** — the token is shown once and can't be retrieved later. The token is scoped to this one routine: it can only trigger it, and grants no read access. ### 2 · Add the routine to Ambrose 1Open any **Agent** or **Team** and click the **Claude Routines** tab. Routines are shared across your whole agency, so it doesn't matter which agent/team you add them from — every one can use them. 2Fill in **Add a routine**: - Name — a friendly label like Nightly Book Report. This is the name you'll use everywhere else, including in Routines. - Routine URL or ID — paste the full https://claude.ai/code/routines/trig_… URL or just the bare trig_… id. Ambrose extracts the id either way. - API token — the sk-ant-oat01-… token from step 1. - Description (optional but recommended) — one line on what the routine does, so the AI picks the right one when you have several. 3Click **Add routine**. It appears in the list below. Click **Test** to fire it immediately — Ambrose opens the resulting Claude Code session in a new tab so you can confirm it started. **Security & isolation.** The token is stored encrypted-at-rest and is **never shown again** and never handed to the AI — agents reference a routine only by its name. Routines are scoped to your agency; no other agency can see or trigger them. Use the **enabled** toggle to pause a routine without deleting it, or **Delete** to remove it (and its token) entirely. ### 3 · Trigger it from chat, an agent, or a team Once a routine is registered, every agent, team, and the Ambrose chat can fire it. Just ask in plain English and name the routine: ``` Run the Claude Routine "Nightly Book Report". ``` You can also pass context for that run, which Claude Code receives alongside the routine's saved prompt: ``` Run the Claude Routine "Incident Triage" with this alert: SEN-4521 fired in prod, 500s on /checkout. ``` Behind the scenes Ambrose exposes two tools — `list_claude_routines` (so the AI can see what's available) and `trigger_claude_routine` (which starts it). The AI matches the name you typed to a registered routine, fires it, and replies with a link to the live session. It does not wait for the routine to finish. ### 4 · Run a routine from a Routine This is the most common use: have a Routine (#routines) fire a routine on a schedule. In the routine's **prompt body**, write the same plain-English instruction, using the exact **Name** you gave the routine in Ambrose, in quotes: ``` Run the Claude Routine "Nightly Book Report". ``` **Use the exact name, in quotes.** The text inside the quotes must match the routine's Name in the Claude Routines tab (case-insensitive). If you renamed the routine, update the routine too. | What | Cron | Target | Routine prompt | | Nightly report | 0 22 * * * | Agent: Ambrose | Run the Claude Routine "Nightly Book Report". | | Weekly repo audit | 0 6 * * 1 | Agent: Riley | Run the Claude Routine "Repo Security Audit" and post the session link to Slack #eng. | | Daily data refresh | 0 5 * * * | Team: Ops | Run the Claude Routine "Refresh Dashboards" with today's date as context. | Add the routine the usual way — agent or team detail → **Routines** tab. See What routines do (#routines) and Cron syntax (#routines-cron). ### Troubleshooting - "Add failed" / not found — double-check you pasted a valid trig_… id (or the full routine URL) and the token, and that all three required fields (Name, Routine, Token) are filled. - Test fails with an auth error — the token may have been rotated. Generating a new token in Claude Code revokes the previous one; paste the new token into the routine (edit it and re-enter the token). - The AI says it can't find the routine — the name in your message must match a registered routine's Name. Open the Claude Routines tab to confirm the spelling, or ask the AI to "list Claude routines". - Rate limited — routine runs count against your claude.ai plan's daily allowance. Check remaining runs at claude.ai/code/routines. ====================================================================== # What are spokes URL: https://app.hiambrose.com/docs/spokes ====================================================================== A spoke is a capability — one MCP server with a set of tools. Spokes are the things Ambrose can do; agents reach them through allowed_spokes. ### Anatomy - A slug (the spoke folder name). - A manifest.json — name, description, HIPAA posture, tool list. - A server — Python (FastMCP) or Node (SDK MCP), running on the Ambrose stack. - One or more tools — each with a JSON Schema for its parameters. ### HIPAA postures | Posture | Meaning | | safe | Local-only. Data never leaves the box. PHI allowed. | | free | Public data only — no PHI ever crosses the wire. | | scrubbed | PHI Gateway scrubs identifiers before egress; re-hydrates on the way back. | | BAA | Destination is on your BAA allowlist; PHI may flow. | ### The 18 built-in spokes agent-vault (#spoke-agent-vault)Agency's private book of business. safe client-vault (#spoke-client-vault)Client-facing enrollment + policy store. safe lead-memory (#spoke-lead-memory)Per-lead dossier store. safe lead-hunter (#spoke-lead-hunter)Prospect discovery + email guess/verify. free demo-forge (#spoke-demo-forge)Branded demo sites + schema generation. free search-audit (#spoke-search-audit)AEO/SEO visibility audits + content. free campaign-metrics (#spoke-campaign-metrics)Funnel performance across channels. scrubbed channel-bridge (#spoke-channel-bridge)Outbound email / SMS / Telegram dispatcher. scrubbed plan-quoter (#spoke-plan-quoter)ICHRA + Medicare + ACA quoting. scrubbed reply-bot (#spoke-reply-bot)AI-drafted replies + appointment booking. scrubbed marketplace-finder (#spoke-marketplace)Live healthcare.gov plan search + subsidies. free aca-watchdog (#spoke-aca-watchdog)Scheduled ACA marketplace intelligence. free medicare-watchdog (#spoke-medicare-watchdog)Scheduled MAPD/PDP/Med Supp intelligence. free ghl (#spoke-ghl)Full GoHighLevel surface. scrubbed agencybloc (#spoke-agencybloc)AgencyBloc AMS+ bi-directional connector. scrubbed phi-gateway (#spoke-phi-gateway)PHI scrubber + re-hydrator. safe llm-analytics (#spoke-llm-analytics)Token usage + cost analytics. safe admin-ops (#spoke-admin-ops)Tenant-scoped create/update of OS resources. safe ====================================================================== # agent-vault safe URL: https://app.hiambrose.com/docs/spoke-agent-vault ====================================================================== The agency's private book of business. CSV/PDF indexer, policy parsers, file watcher. Files never leave the account. ### What you put in it - HealthSherpa CSV exports. - Commission reports. - Client lists, intake forms. - Carrier emails (PDF). - Anything else you want Ambrose to be able to query. ### Privacy model Files live in your account. Queries that touch the vault flow through the PHI Rail. Search resolves in-process — only the final answer (numbers, summarized names) returns to the model. Raw PHI never crosses the wire. More on the PHI Rail (#arch-phi-rail). ### Tools - vault_search — Full-text + structured search across indexed files. - vault_get_client — Fetch a client record by ID (joins across CSVs). - vault_list_recent — Recently changed / added files. - vault_classify_lob — Auto-classify line of business (MAPD / PDP / Med Supp / ACA / Group / ICHRA). ====================================================================== # client-vault safe URL: https://app.hiambrose.com/docs/spoke-client-vault ====================================================================== Client-facing enrollment, policy, and document store. Sits next to agent-vault but indexed per client. Use client-vault when the question is scoped to a single client — "what is on John Park's policy", "attach this carrier letter to Maria's file". Use agent-vault for book-wide analytics — "how many MAPD renewals next month". ### Tools - client_get — Fetch a single client record. - client_list_policies — All policies for a client. - client_add_document — Attach a new document (PDF, image). - client_search — Search within one client's data. ====================================================================== # lead-memory safe URL: https://app.hiambrose.com/docs/spoke-lead-memory ====================================================================== Per-lead dossier store. Historical context across campaigns and conversations. lead-memory is what gives outbound personalization durability. It survives across the lifetime of a relationship — different campaigns, different channels, different conversations — and keeps the brand-guard cross-contamination check intact. ### Tools - lead_get_dossier — Full dossier for a lead — history, brand, mission, events. - lead_log_event — Append an event to the lead's timeline. - lead_search — Search across all leads by tag, channel, status. ====================================================================== # lead-hunter free URL: https://app.hiambrose.com/docs/spoke-lead-hunter ====================================================================== Prospect discovery and enrichment — Google Maps scraping, email guessing, verification. HIPAA-free: operates on public prospect business data only. No client PHI ever crosses the wire. Safety rails: Google-only export, blocks MSFT-owned domains to avoid breaching their AUP. ### Tools - hunter_gmaps_scrape — Discover prospects from Google Maps. - hunter_email_guess — Guess work emails from name + domain. - hunter_verify — Verify deliverability of a candidate email. ====================================================================== # demo-forge free URL: https://app.hiambrose.com/docs/spoke-demo-forge ====================================================================== Generates branded demo websites + JSON-LD schema for prospect outreach. Pair with search-audit to build a full "this is what your site could look like" deliverable for prospects. ### Tools - demo_build_site — Generate a branded prospect demo site. - demo_generate_schema — JSON-LD schema for a target page. - demo_publish — Publish the demo to the agency's demo subdomain. ====================================================================== # search-audit free URL: https://app.hiambrose.com/docs/spoke-search-audit ====================================================================== AEO/SEO website visibility audits. Scores sites on schema, content, technical, and AI-citation surface. Morgan's primary outbound prospecting hook. "Here's a free AEO audit of your homepage" → conversation starter that lands on cold leads. ### Tools - audit_site — Run a full audit on a URL. - audit_score — Return composite score breakdown. - audit_compare — Compare two URLs (yours vs a competitor). ====================================================================== # campaign-metrics scrub URL: https://app.hiambrose.com/docs/spoke-campaign-metrics ====================================================================== Campaign analytics across email, SMS, social — opens, clicks, replies, booked-call rates. Per-recipient identifiers are stripped before any LLM sees them. The model gets aggregates; identifiers only re-enter for action lists you approve. ### Tools - metrics_campaign_summary — Single-campaign topline. - metrics_recipient_engagement — Engagement at recipient grain. - metrics_funnel_breakdown — Stage-by-stage funnel breakdown. ====================================================================== # channel-bridge scrub URL: https://app.hiambrose.com/docs/spoke-channel-bridge ====================================================================== Outbound dispatcher for email, SMS, and Telegram. The single place messages actually leave your account. All outbound bodies route through the PHI Gateway if the destination is not on the BAA allowlist. Drafts mode by default — flip to auto-send per agent / team only after you have watched the drafts for a few days. ### Tools - bridge_send_email — Send an email (Gmail / GHL conversation / direct SMTP). - bridge_send_sms — Send an SMS (Twilio / GHL conversation). ====================================================================== # plan-quoter scrub URL: https://app.hiambrose.com/docs/spoke-plan-quoter ====================================================================== ICHRA savings calculator + Medicare quoting + ACA marketplace quotes. Identifiers are scrubbed before the quoting engine sees them — the engine only needs demographics (age, ZIP, income tier, household size). Use marketplace-finder directly when you need the raw live data. ### Tools - quote_ichra_savings — ICHRA savings projection for a household / small group. - quote_medicare_options — Side-by-side MAPD comparison for a profile. - quote_aca_marketplace — ACA plan comparison for a household. ====================================================================== # reply-bot scrub URL: https://app.hiambrose.com/docs/spoke-reply-bot ====================================================================== AI-drafted replies + appointment booking across email, SMS, and chat channels. Auto-send vs needs-review is a per-team toggle. Default = needs-review. Drafts include a confidence score and a "why this draft" trace so you can decide quickly. ### Tools - reply_draft — Draft a reply to a thread. - reply_send — Send a drafted reply (via channel-bridge). - reply_book_appointment — Book on the agent's calendar. ====================================================================== # marketplace-finder free URL: https://app.hiambrose.com/docs/spoke-marketplace ====================================================================== Live ACA marketplace plan search + APTC subsidy estimator backed by healthcare.gov. The default flow: ZIP → county → search → enrich. Use `marketplace_find_plans` as the one-shot for plan discovery. See the War Room example (#war-room-marketplace). ### Tools - marketplace_county_by_zip — Resolve a ZIP to county + FIPS. - marketplace_plan_search — Search plans for a household + county. - marketplace_plan_detail — Full benefit grid for a single plan ID. - marketplace_subsidy_estimate — APTC estimate for a household. - marketplace_find_plans — High-level "find me plans" flow (ZIP → county → search). - marketplace_crosswalk — Renewal crosswalk between plan years. - marketplace_rate_areas — Rate areas in a state. - marketplace_drug_autocomplete — Drug name autocomplete. - marketplace_drugs_covered — Check drug coverage for a plan. - marketplace_provider_autocomplete — Provider name autocomplete. - marketplace_providers_covered — Check provider in-network for a plan. ====================================================================== # aca-watchdog free URL: https://app.hiambrose.com/docs/spoke-aca-watchdog ====================================================================== Scheduled ACA marketplace intelligence — cost hikes, carrier exits, benefit cuts, plan-year transitions. Posts actionable findings to Ambrose Notifications. The dashboard surfaces unresolved findings in the watchdog widget. ### Tools - aca_scan_book — Scan the agency's ACA book for risk signals. - aca_check_carrier_status — Status check on a carrier. - aca_plan_year_diff — Year-over-year diff for a plan ID. ====================================================================== # medicare-watchdog free URL: https://app.hiambrose.com/docs/spoke-medicare-watchdog ====================================================================== Scheduled MAPD / PDP / Med Supp intelligence — cost hikes, plan discontinuations, network changes, Star Ratings, rate filings. Federal data only — no client identifiers cross the wire. Cross-references your vault book against CMS data internally. ### Tools - medicare_scan_book — Scan the Medicare book for risk signals. - medicare_check_plan — Status + costs for a specific plan. - medicare_star_diff — Star Rating year-over-year diff. - medicare_rate_filing — Pull the latest rate filing. ====================================================================== # ghl scrub URL: https://app.hiambrose.com/docs/spoke-ghl ====================================================================== Full GoHighLevel v2 surface. Contacts, conversations, calls, pipelines, workflows, calendars, social, Voice AI, tasks, notes, custom fields. Reads are live. Writes (send_message, add_note, opportunity_move_stage, …) stage as pending actions and require explicit approval in the floating chat widget or a per-team auto-approve flag. Per sub-account HIPAA override: BAA sub-accounts are treated as safe; others route through PHI Gateway. ### Tools - ghl_list_subaccounts — List authorized sub-accounts. - ghl_contacts_list — List contacts (paged). - ghl_contact_get — Fetch a contact. - ghl_contact_search — Search contacts. - ghl_contact_upsert — Upsert by email / phone. - ghl_contact_update — Update contact fields. - ghl_notes_list — List notes on a contact. - ghl_contact_add_note — Add a note. - ghl_tasks_list — List tasks. - ghl_task_create — Create a task. - ghl_task_complete — Mark a task complete. - ghl_contact_add_tags — Add tags. - ghl_contact_remove_tags — Remove tags. - ghl_conversations_list — List conversations. - ghl_conversation_messages — List messages in a conversation. - ghl_send_message — Send a message in a conversation. - ghl_call_logs_list — List call logs. - ghl_call_log_get — Fetch one call log. - ghl_pipelines_list — List pipelines. - ghl_opportunities_list — List opportunities (filterable). - ghl_opportunity_get — Fetch one opportunity. - ghl_opportunity_create — Create an opportunity. - ghl_opportunity_move_stage — Move opportunity stage. - ghl_opportunity_set_status — Set won/lost/abandoned. - ghl_workflows_list — List workflows. - ghl_workflow_enroll — Enroll contact in a workflow. - ghl_workflow_remove — Remove from a workflow. - ghl_calendar_book — Book on a calendar. - ghl_custom_fields_list — List custom field schema. - ghl_update_custom_field — Update one custom field. - ghl_custom_values_list — List custom values. - ghl_custom_value_upsert — Upsert a custom value. - ghl_tags_list — List tags in the location. - ghl_social_accounts_list — List Social Planner accounts. - ghl_social_posts_list — List Social Planner posts. - ghl_social_post_create — Create a Social Planner post. - ghl_social_post_delete — Delete a Social Planner post. - ghl_voice_agents_list — List Voice AI agents. - ghl_voice_call_trigger — Trigger a Voice AI call (workflow enrollment). - ghl_users_list — List GHL users. ====================================================================== # agencybloc scrub URL: https://app.hiambrose.com/docs/spoke-agencybloc ====================================================================== Bi-directional AgencyBloc AMS+ connector. Pulls Individuals / Groups / Policies / Activities / Notes / Commissions into the vault; pushes Ambrose-generated notes / activities / fields back. Idempotency via `x-ambrose-trace` headers. Kill-switch protects against runaway writes — flip the per-agency flag in Settings → Integrations → AgencyBloc to halt all pushes. ### Tools - ab_contact_pull — Pull contacts into the local vault. - ab_policy_pull — Pull policies into the local vault. - ab_commission_push — Push Ambrose-generated commission records / notes back. ====================================================================== # phi-gateway safe URL: https://app.hiambrose.com/docs/spoke-phi-gateway ====================================================================== PHI scrubber + re-hydrator. The safety rail every scrubbed-posture spoke calls before egress. Layered detector chain: known-contacts (your vault) → regex → Presidio NER → insurance dictionary. Mapping vault is local-only sqlcipher. ### Tools - phi_scrub — Scrub PHI from a payload. - phi_rehydrate — Re-hydrate scrubbed values back to real ones. - phi_audit_query — Query the scrub audit log. - phi_check_baa — Check whether a destination is BAA-allowlisted. ====================================================================== # llm-analytics safe URL: https://app.hiambrose.com/docs/spoke-llm-analytics ====================================================================== Token usage + cost breakdown + provider performance analytics across every LLM call. Records call metadata only — never prompt or response bodies. Reads from the local `llm_calls.db` SQLite. Posture safe. ### Tools - llm_usage_summary — Topline usage for a period. - llm_cost_breakdown — Cost broken out by agent / team / model / provider. - llm_provider_health — Provider error rate + latency. ====================================================================== # admin-ops safe URL: https://app.hiambrose.com/docs/spoke-admin-ops ====================================================================== Tenant-scoped read + create + update of Ambrose resources (agents, teams, skills, MCPs, routines). Used by the floating chat widget to let you build the OS with natural language. ### Security model - Never accepts agency_id from the LLM — uses the trusted session header from the calling Node bridge. - Writes stage as pending actions; the floating chat widget shows an Approve / Cancel card. Approve re-verifies the session agency matches before applying. - No delete operations. By design. ### Usage from the floating widget ``` Create a new agent called RenewalsBot with model claude-sonnet-4-6, give it access to agent-vault. ``` → admin_agent_create stage → confirm card → approve → live. ### Tools - admin_list_agents — List your agency's agents. - admin_get_agent — Get one agent's config + files. - admin_list_teams — List your agency's teams. - admin_get_team — Get one team's config + files. - admin_list_skills — List user + project skills available. - admin_list_mcps — List configured MCP servers. - admin_list_sequences — List scheduled routines. - admin_agent_create — Stage create-agent. - admin_agent_update — Stage update-agent. - admin_team_create — Stage create-team. - admin_team_update — Stage update-team. - admin_skill_create — Stage create-skill. - admin_skill_update — Stage update-skill. - admin_mcp_add — Stage add-MCP-server. - admin_mcp_update — Stage update-MCP-server. - admin_sequence_create — Stage create-routine. - admin_sequence_update — Stage update-routine. ====================================================================== # What are skills URL: https://app.hiambrose.com/docs/skills ====================================================================== A skill is a SKILL.md brief that teaches the AI how to use a specific spoke or workflow well. The Claude Agent SDK auto-discovers them and attaches them to every exec head. ### Why skills exist A spoke gives the AI capability ("you can call ghl_send_message"). A skill gives the AI technique ("when sending a GHL message, first check opt-out, then thread through PHI Gateway, then log to lead-memory"). Skills are how senior practitioners teach the AI the playbook. ### Two kinds of skills | Kind | Where they live | Who sees them | | Project skills | .claude/skills//SKILL.md | Every exec head + any agent that opts in. Shipped with Ambrose. | | User skills | Per-user skill folder | Only that user's sessions. | ### What ships Currently ~23 project skills, including one per built-in spoke (spoke-ghl, spoke-agent-vault, spoke-marketplace-finder, …), plus a few cross-cutting ones (agent-orchestration, webhook-ghl, ambrose-api-author). ### Custom & agency skills Beyond the built-in project skills, you can add your own. Upload a `SKILL.md` on the **Tools** page (or generate one from a prompt). Agency-wide skills are available to every agent and team in the agency and show up on the Tools page where you can **Preview** the full playbook. - Where you see them: the Tools page (with Preview), and the skill picker on the agent + team editors. - How you attach them: tick them on an agent's or team's Tools tab. - Where they run: chat, sequences/routines, the team/agent MCP endpoint (as skill__), and the GHL webhook — the selected skill's playbook is injected into the run. Ambrose ships a ready-made insurance content pack (#skills-insurance-pack) (9 skills for Medicare/ACA/life blogs, websites, location pages, brand kits, data, and SEO/AEO audits) available to every agency out of the box. ====================================================================== # Insurance content pack (9 skills) URL: https://app.hiambrose.com/docs/skills-insurance-pack ====================================================================== A ready-made set of 9 skills for producing compliant, data-backed insurance content and websites — available to every agency, selectable on any agent or team, and previewable on the Tools page. These skills work together as a content + web pipeline. A typical flow: pull real data → set the brand system → build the site & location pages → write articles → audit before publishing. data (`ambrose-insurance-data`) → brand (`brand-design-kit`) → site (`insurance-website-builder` + `location-page-factory`) → articles (`medicare` / `aca` / `life` / generic `blog-post-writer`) → audit (`seo-aeo-page-audit`). ### medicare-blog-writer **What it does:** Researches, writes, verifies and tests a complete Medicare blog article — Original Medicare (Parts A/B), Medicare Advantage (Part C), Medigap/Supplement, Part D, eligibility, enrollment periods, costs. Answer-first long-form (3,000–8,000 words), with TL;DR, table of contents, verified statistics, charts, FAQ, author bio, sources, related articles, meta/canonical/Open Graph, JSON-LD schema, image alt — in your brand colors. Self-reviews, builds/previews to confirm charts render, then runs an embedded SEO+AEO checklist. **Compliance:** YMYL — never guesses a number, cites primary sources, enforces CMS Medicare marketing rules (TPMO + non-affiliation, no prohibited superlatives), always states the plan year. **Use when:** "write a Medicare article", "Medicare Advantage / Medigap / Part D / AEP / turning 65". ### aca-blog-writer **What it does:** The same complete article pipeline for ACA / Health Insurance Marketplace content — individual & family plans, metal tiers (Bronze/Silver/Gold/Platinum), premium tax credits/subsidies, cost-sharing reductions, eligibility, Open Enrollment & Special Enrollment, and alternatives (ICHRA; short-term caveats). **Compliance:** YMYL — directs readers to HealthCare.gov / state Marketplaces, states income & plan-year caveats, no individualized advice. **Use when:** "write an ACA / Marketplace / Obamacare article", "subsidies", "Open Enrollment", "metal tiers". ### life-insurance-blog-writer **What it does:** The same pipeline for life-insurance content — term, whole, universal/IUL, final expense/burial, group vs individual, riders, underwriting, beneficiaries, and how-much-coverage needs analysis. **Compliance:** YMYL, state-regulated — no guaranteed-returns/investment claims, notes that underwriting varies. **Use when:** "write a life insurance article", "term vs whole life", "final expense", "IUL", "how much life insurance". ### blog-post-writer **What it does:** The niche-agnostic master writer for any website or topic. Picks a trending/high-intent topic, rotates content categories (explainer, how-to, comparison, cost, timely, myths, news, data/trends), and produces answer-first long-form with TOC, TL;DR, verified stats, charts, FAQ, author bio, sources, related articles and a clear CTA — with full SEO+AEO (meta, canonical, Open Graph + Twitter Card, JSON-LD schema, alt text). The niche skills above defer to this for structure, length, SEO/AEO and testing. **Use when:** "write a blog post", "draft an article", "write about X" (non-insurance or general topics). ### ambrose-insurance-data **What it does:** Fetches REAL, citable data from the Ambrose Insurance Brain MCP for content and research — Medicare, ACA/Healthcare.gov, life, ICHRA/HRA, Medicaid, county health figures, drug prices, provider counts, program rules. It maps each Brain tool to the blog use case it serves and turns results into cited stat callouts, charts and comparison tables. **Use when:** you are writing or researching insurance content and need a real statistic, premium, plan count, or source — prefer this over inventing numbers. Pairs with the blog writers and the SEO/AEO audit. ### brand-design-kit **What it does:** Generates a complete brand + design system for an insurance agency website — brand-name treatment, an accessible color palette, typography (heading + body), logo direction, spacing scale, and the core UI component set (buttons, cards, stat row, chart, FAQ accordion, CTA band), plus a tone/voice guide. It writes a single source of truth (`BRAND.md` + design tokens) that the website builder and the blog writers all read. No image-generation dependency (logos/photos are bring-your-own). **Use when:** "brand kit", "design system", "brand tokens", "colors and fonts for " — it's Step 0 before building the site. ### insurance-website-builder **What it does:** Designs and builds a complete, premium, multi-page insurance agency website (Medicare, ACA/health, life, final expense, ICHRA, P&C) on **Astro**, deploy-ready for Cloudflare Pages — home, about, service/plan pages, location pages, contact, blog index — with the generated design system, conversion-optimized compliant copy, the SAA Four-Pillar AI Citation Standard on every page (Article/Org "Data Desk" author + FAQPage + Dataset + llms.txt + WebMCP), GHL lead capture and accessibility. **Pairs with:** `brand-design-kit` (visual system) and `location-page-factory` (local pages); run `seo-aeo-page-audit` before publishing. YMYL — cites authoritative/.gov sources, includes disclaimers. **Use when:** "build an insurance website", "agency site", "new Medicare/ACA/life site", "website builder". ### location-page-factory **What it does:** Generates high-quality, compliant local-SEO location pages (one per city/county/service area) on Astro — each genuinely localized with REAL local data (county health, plan counts, demographics) from The Brain, the Four-Pillar AI Citation Standard, and the right geo schema stack (LocalBusiness + GovernmentService + Place + FAQPage + BreadcrumbList + Dataset). Built to avoid thin/doorway/near-duplicate pages. **Use when:** "location pages", "city pages", "service-area pages", "local SEO pages for ". ### seo-aeo-page-audit **What it does:** Audits a single web page or article for search (SEO) and answer-engine (AEO/GEO) readiness — title/meta, canonical, headings, content depth, internal/external links, images/alt, structured data, Core Web Vitals, indexability, duplicate-content risk, and search-engine spam-policy compliance. Produces a prioritized pass/fail report with concrete fixes. Works on any stack. **Use when:** right after creating or editing a page — "check SEO", "audit this page", "is this ready to publish", "AEO check", "pre-publish review". ### How to use them 1See them on the Tools (/tools) page — click **Preview** to read any skill's full playbook. 2On an agent or team, open the **Tools** tab and tick the skills you want it to use. 3Ask in chat (or via a sequence/routine, the team MCP, or the GHL webhook) — e.g. "Write a Medicare AEP article" — and the agent follows the skill's playbook. ====================================================================== # Auto-attach to exec heads URL: https://app.hiambrose.com/docs/skills-auto-attach ====================================================================== Every project skill is automatically discovered and attached to every exec head. Drop a SKILL.md, the next chat turn picks it up. The Claude Agent SDK auto-discovers SKILL.md files under `/app/.claude/skills/`. Both the Python core and the Node SDK runner share the same mount, so a new skill is visible to every head immediately. #### Implication - Add a new playbook → write a SKILL.md. No code change, no deploy. - You can write skills via the floating chat widget. "Create a skill called renewal-playbook that teaches the agent how to draft a renewal email." → admin_skill_create stage → confirm → live. ====================================================================== # Create a skill URL: https://app.hiambrose.com/docs/skills-create ====================================================================== Two minutes. Pick a name. Write a SKILL.md that explains the trigger, the tools, and the safety rails. #### Anatomy ``` # renewal-playbook description: Use this skill when the user asks to draft a renewal touch. When to use: - User mentions "renewal", "renew", "anniversary", or names a contact whose renewal_date is within 60 days. Tools to use (in this order): 1. agent-vault.vault_search — pull the client's record from the book 2. plan-quoter.medicare_plans — compare this year's plan vs alternatives 3. reply-bot.reply_generate — generate the email body in brand voice Safety: - Never quote a premium without crosswalk data. - Never send — always draft. - If client has 'do_not_contact' tag, stop and surface the conflict. ``` #### How to add one - From the chat widget — "Create a skill called X that teaches …" → approve. - From the file system (self-hosted) — drop a folder under .claude/skills/ with a SKILL.md. Hot-reloaded. ====================================================================== # What is MCP URL: https://app.hiambrose.com/docs/mcp ====================================================================== Model Context Protocol — the open standard for plugging external tools into an AI. Ambrose speaks MCP both ways: every spoke is an MCP server, and you can mount any external MCP server as tools. ### The vocabulary - MCP server — exposes one or more tools (with JSON Schema for inputs) over a transport (stdio or HTTP). - MCP client — connects to a server, lists tools, calls them on the model's behalf. - MCP tool — one named action with a schema (e.g. ghl_send_message). ### Ambrose as MCP server Every agent and team auto-publishes an MCP endpoint at `/api/{kind}//mcp`. See Streamable HTTP MCP (#connect-mcp-url). ### Ambrose as MCP client Mount any external MCP server in Settings → MCP (/settings) and attach it to one or more agents / teams. See Add an MCP server (#mcp-add). ====================================================================== # Add an MCP server URL: https://app.hiambrose.com/docs/mcp-add ====================================================================== Settings → MCP → Add MCP server. Pick stdio or HTTP. Enter the connection details. Save. ### From the UI 1Settings (/settings) → **MCP** tab → **Add MCP server**. 2Name (e.g. "Linear"), description, type (**HTTP** or **stdio**). 3If HTTP: URL + (optional) bearer token header. If stdio: command + args + env vars. 4Click **Test connection**. Ambrose introspects the server and lists its tools. 5Save. The MCP is now available to attach to any agent or team. 6Open the agent / team detail → **Attached MCPs** → toggle on. ### From the floating chat widget ``` Add the Linear MCP server using URL https://mcp.linear.app/sse with my Linear bearer token, then allow it for the Engineering team. ``` → admin_mcp_add stage → confirm → live. ### Where an attached MCP works Once you attach an MCP to an agent or team, its tools are callable everywhere that agent/team runs — **chat, the War Room, scheduled routines, and the published team/agent MCP endpoint** (where they re-appear as `mcpext____`). Every MCP is **isolated to your agency**: its credentials are stored against your agency only, and the AI can never reach another agency's connectors. Per-agent allowlists mean an agent only sees the MCPs you attached to it, even if your agency has others installed. To invoke a tool the model just calls it by name (e.g. `mcp__ghl-mcp__contacts_get-contacts`) — it never routes through the Skill tool. If a tool needs approval, it surfaces an Allow / Deny card in the chat. ### Catalog of popular external MCPs - Slack (official) — channels, messages, users. - Linear (official) — issues, projects, comments. - GitHub (official) — issues, PRs, code search. - Notion (official) — pages, databases. - Zoom (official) — recordings, meetings. - Google Drive (official) — file search + read. - PostHog — events + funnels. ====================================================================== # Per-tool permissions URL: https://app.hiambrose.com/docs/mcp-permissions ====================================================================== Allowed_spokes gates a spoke. Per-tool permissions further restrict which actions inside a spoke / MCP an agent or team may call. ### Where to set them - Open Tools in the top nav. - Pick the spoke or MCP from the left list. - For each tool, toggle Allow, Deny, or Ask per agent / team. ### The three states - Allow — agent can call it without prompting. - Deny — agent cannot call it; the LLM gets a 403-style tool error if it tries. - Ask — call stages as a pending action; the user (in the floating widget or the War Room) must approve. ### Defaults - Read-only tools default to Allow. - Write tools to external systems (ghl_send_message, bridge_send_sms, ghl_opportunity_move_stage, …) default to Ask. - Destructive tools (delete, remove, archive) default to Deny. ### Tool-count cap Calling LLMs cap tool catalogs (Claude: 40 per request). Ambrose truncates descriptions to 180 chars and prunes lowest-priority tools first if the union of allowed tools exceeds the cap. Bias toward Allow-listing only what you need. ====================================================================== # stdio vs HTTP URL: https://app.hiambrose.com/docs/mcp-stdio-vs-http ====================================================================== Two transports. Pick HTTP when the server lives across the network; pick stdio when it lives on the same box. | | HTTP (Streamable HTTP) | stdio | | Latency | Network roundtrip | Local pipe — <1ms | | Auth | Bearer header | Env vars / process owner | | Mount | URL + token | Command + args + env | | Use when | Official cloud MCPs (Slack, Linear, GitHub) | Local helpers, self-hosted MCPs | ### HTTP example ``` { "type": "http", "url": "https://mcp.linear.app/sse", "headers": { "Authorization": "Bearer lin_api_..." } } ``` ### stdio example ``` { "type": "stdio", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/data"], "env": { "READ_ONLY": "1" } } ``` ====================================================================== # Integrations overview URL: https://app.hiambrose.com/docs/integrations ====================================================================== External systems that plug into Ambrose. Configure each one in Settings → Integrations. ### What's built-in GoHighLevel (#int-ghl)CRM. Contacts, conversations, opportunities, calendars, Voice AI. HealthSherpa (#int-healthsherpa)ACA quoting + enrollment. Twilio (#int-twilio)SMS sending. Slack (#int-slack)Channel posts + DMs. Discord (#int-discord)Webhooks or bot. VAPI (#int-vapi)Voice AI — Custom LLM, function call, or native MCP. Retell (#int-retell)Voice AI — Custom LLM or function. Closebot (#int-closebot)GHL chatbot — custom tool webhook. Stripe (#int-stripe)Billing for agency-of-record models. Linear (#int-linear)Issues + projects via MCP. Make / Zapier (#int-make-zapier)Generic webhook in either direction. Claude Desktop / Cursor (#int-claude-cursor)Mount Ambrose teams + agents as MCP tools. ### Add your own Need something not on this list? Add it as an MCP server (how (#mcp-add)) or wire it via a generic webhook (how (#int-make-zapier)). For OAuth-based services, ask Ambrose in the chat widget — Riley can scaffold the integration card. ====================================================================== # GoHighLevel (GHL) URL: https://app.hiambrose.com/docs/int-ghl ====================================================================== The CRM most agencies use. Once connected, every spoke and every head that touches CRM works. ### Connect 1In GHL → **Settings → Private Integrations** → New PIT. Give it ALL the scopes Ambrose needs (Contacts, Conversations, Opportunities, Calendars, Tasks, Notes, Custom Fields, Workflows, Social Planner, Voice AI, Users). 2Copy the Location ID + the PIT. 3In Ambrose → Settings → Integrations (/settings) → GoHighLevel card → paste both → Save. 4Click **Test**. Ambrose pings the GHL contacts endpoint with a limit of 1; success = green. ### Multi sub-account Repeat for each sub-account. The `ghl` spoke federates across all configured sub-accounts — agents see them as one search surface, scoped by sub-account where the answer needs to be. ### BAA Per sub-account, toggle "BAA on file with GHL for this sub-account". When on, the spoke is treated as safe for that sub-account; otherwise scrubbed. ### What you can do once connected - Every workflow can call a team via team GHL webhook. - The exec heads (Jordan, Alex, Taylor) can read + write GHL in chat and the War Room. - Voice AI workflows can be enriched mid-call via Ambrose tool calls. ### What the ghl spoke can actually do Once connected, any agent, team, or exec head with the `ghl` spoke enabled can do all of this in plain English — no IDs to copy, the spoke resolves names to IDs for you: - Contacts — search, read, create/upsert, update, add/remove tags, add notes: ghl_contact_search, ghl_contact_get, ghl_contact_upsert, ghl_contact_update, ghl_contact_add_tags, ghl_contact_add_note. - Pipelines & opportunities — list pipelines/stages, create opportunities, move a card between stages, set status: ghl_pipelines_list, ghl_opportunities_list, ghl_opportunity_create, ghl_opportunity_move_stage, ghl_opportunity_set_status. See the worked example: add context + move a contact through a pipeline → - Conversations — list threads, read messages, send SMS/email: ghl_conversations_list, ghl_conversation_messages, ghl_send_message. Worked example: messages today + follow-up → - Tasks, calendars, workflows, custom fields/values, social planner, users, Voice AI — ghl_task_create, ghl_calendar_book, ghl_workflow_enroll, ghl_custom_field*, ghl_social_post_create, and more. Write actions (send message, move stage, create task, …) default to **Ask** — they stage for your approval in the War Room. Flip them to **Allow** on the Tools (#mcp-permissions) page to run unattended. **Native GHL integration vs a GHL MCP — they're different.** - The native integration on this page (the ghl spoke) is wired from Settings → Integrations with a Location ID + PIT. It federates across your sub-accounts and is what every exec head uses. - A user-installed GHL MCP (e.g. LeadConnector's MCP at services.leadconnectorhq.com/mcp) is a separate connector you add under Settings → MCP. Its account is fixed by the credentials you register for it. Use it when you want a vendor MCP's exact tool surface; use the native integration for everything else. - Ask ambrose_inventory ("which GHL is the integration vs the MCP?") if you're ever unsure which one a tool is hitting. ====================================================================== # GoHighLevel AI Context Snapshot URL: https://app.hiambrose.com/docs/ghl-snapshot ====================================================================== A ready-made GoHighLevel snapshot that keeps Ambrose's AI context in sync with every call, message, reply, note and CRM change — and ships proven ACA follow-up sequences you can turn on in minutes. If you run your book of business in **GoHighLevel**, this one-click snapshot wires your sub-account so Ambrose always has the latest, real context for each contact. It captures call transcripts, inbound messages, replies, notes and pipeline changes automatically, writes them into clean contact fields, and includes done-for-you 5-day follow-up sequences for ACA leads, DBR contacts, and renewals. **Import the snapshot →** Add the Ambrose AI Context Snapshot to your GoHighLevel account (https://affiliates.gohighlevel.com/?fp_ref=affordablecareai&share=8xZSSHxUYdSIVgvBRndI) Opens GoHighLevel. Sign in to the location you want it installed on, review what's included, and click Import. Nothing runs until you turn a workflow on. ⚠️ **Before importing — check your custom fields.** This snapshot adds the custom fields listed below. If your sub-account already has fields with these names, GHL may overwrite or duplicate them. Review them first and rename yours to avoid collisions. - AI Context JSON - AI Call Introduction - AI Context Updated At - AI Context Version - AI Context Dirty - Ambrose Last Transcript - Ambrose Last Message - Conversation History #### What it does Ambrose answers best when it knows what just happened with a contact. This snapshot keeps that context fresh in real time so your AI follow-ups, replies and summaries are accurate — no manual copy-paste, no stale notes. #### What's included ##### 1 · Real-time context sync A set of automations watch your contacts and keep their AI context current: | When this happens | What the snapshot does | | Inbound or outbound call | Saves the latest call transcript and flags the contact's context as needing a refresh, so the next AI reply reflects the conversation. | | New message received | Stores the most recent message and updates the AI context for conversation continuity. | | Contact replies on any channel | Appends the reply to the contact's conversation history so the AI and your team see the latest thread. | | Tag added, pipeline moved, or note added | Marks the context as updated so internal CRM changes stay reflected in the AI. | | On demand (manual or trigger) | Builds a clean contact summary from conversation history, tags, appointments and recent email/SMS, and writes it into the contact's notes. | | On demand (manual or trigger) | Reads the full conversation and updates the contact's native + custom fields (name, email, phone, ZIP, appointment date, renewal/DBR status, and more) — creating any missing custom fields automatically. | ##### 2 · Done-for-you follow-up sequences Three ready-to-run 5-day SMS + email sequences. Each step sends an SMS and email, then waits a day. Enroll contacts manually or wire your own trigger. - ACA New Lead — 5-day: nurtures fresh ACA leads who may qualify for low-cost or $0 plans and prompts them to check eligibility or book a call. - ACA DBR — 5-day: reminds DBR contacts to complete or review required details and connect with an agent. - ACA Renewal — 5-day: reminds contacts to review or renew their plan and update key details so they don't miss renewal steps. These sequences send through your own messaging — review the copy and add the trigger that fits your workflow before enabling. #### Fields the snapshot creates On import, the snapshot adds the custom fields Ambrose uses to store and track context. Most are managed automatically — you usually won't edit them by hand. | Field | Purpose | | AI Context JSON | The structured, machine-readable snapshot of everything the AI knows about the contact. | | AI Call Introduction | The opening context/script the AI uses when handling a call for this contact. | | AI Context Updated At | Timestamp of the last context refresh. | | AI Context Version | Version marker so updates can be tracked and re-built safely. | | AI Context Dirty | A "needs refresh" flag set whenever new activity arrives, so context is rebuilt only when something changed. | | Ambrose Last Transcript | The most recent call transcript for the contact. | | Ambrose Last Message | The most recent inbound message from the contact. | | Conversation History | A running record of the contact's replies and conversation updates across channels. | **Custom values** (account-level): **Agent Full Name** and **AI Bot Name** — set these once so messages and AI replies use your agent's name and your bot's name. #### How to import 1Click Import the snapshot (https://affiliates.gohighlevel.com/?fp_ref=affordablecareai&share=8xZSSHxUYdSIVgvBRndI) and sign in to your GoHighLevel account. 2Choose the **sub-account (location)** you want it installed on and confirm the import. 3Set the **Agent Full Name** and **AI Bot Name** custom values for that location. 4Review each follow-up sequence's copy, add the trigger that fits your process, and turn on the ones you want. The context-sync automations can run as-is. 5Connect the same location to Ambrose under Settings → Integrations → GoHighLevel (#int-ghl) so the AI can read the context these fields keep fresh. After import, Ambrose stays in lock-step with your CRM: every call, text and reply keeps the contact's AI context current, so your follow-ups and summaries are always based on the latest real activity. ====================================================================== # HealthSherpa URL: https://app.hiambrose.com/docs/int-healthsherpa ====================================================================== ACA quoting + enrollment platform. Add your HealthSherpa API key for direct quote + enroll flows. ### Connect 1In HealthSherpa → Settings → API → Generate API key. 2In Ambrose → Settings → Integrations (/settings) → HealthSherpa card → paste → Save. plan-quoter falls back to marketplace-finder when HealthSherpa is not connected, but direct HS use gets you the better enrollment flow. ====================================================================== # Twilio (SMS) URL: https://app.hiambrose.com/docs/int-twilio ====================================================================== Direct SMS sending when you do not want to route through a GHL conversation. ### Connect 1In Twilio Console → Account SID + Auth Token. 2In Ambrose → Settings → Integrations → Twilio card → paste SID + Auth → Save. channel-bridge auto-routes SMS sends through Twilio if configured, otherwise through the GHL conversation. ====================================================================== # Slack URL: https://app.hiambrose.com/docs/int-slack ====================================================================== The fastest path is one-click "Add Ambrose to Slack" (and "Sign in with Slack") when your plan has it enabled — no app to build. Otherwise connect manually: outbound Webhooks (post-only), a Bound Bot (one fixed agent/team), or a Router Bot (reach every team by name — @Ambrose renewals: your question). @mention or DM a bot and the answer comes back in-thread. Everything below lives in **Settings → Integrations → Slack**. Pick the tab that fits — you can use webhooks and bots at the same time. ### Webhook URLs — notifications (one-way) Best for alerts and digests: watchdog findings, routine/sequence summaries, completion pings. Ambrose only posts — it can't read replies on this mode. 1In Slack: api.slack.com/apps (https://api.slack.com/apps) → your app → **Incoming Webhooks** → Activate → Add New Webhook to Workspace → pick a channel → copy the URL. 2In Ambrose: Settings → Integrations → Slack → **Webhook URLs** → give it a label (e.g. `#alerts`) + paste the URL → Add. "Test" posts a small visible message. Add as many channels as you want — each is a separate row, and agents/routines pick a target by label. ### Slack Bots — two-way (@mention / DM → an agent or team) This is the powerful mode. A **bot** is a Slack app connected to your Ambrose agents/teams. Tag the bot in a channel (or DM it) and an agent/team answers, replying in the same thread. You can add **as many bots as you like**. Each bot runs in one of two modes: | Mode | Who answers | How you use it | | Bound | One fixed agent/team you pick when you create the bot. | @YourBot your question — always the same node. | | Router | Any team/agent in your agency, chosen by name from the message. | @YourBot renewals: your question — one bot reaches every team. | **Which should I use?** Use **Bound** for a single-purpose bot (e.g. a Support bot). Use **Router** when you want one bot in Slack that can reach all of your teams by name — no more one-app-per-team. #### Fastest: one-click install (when enabled) If Slack is pre-configured for your Ambrose platform, **Settings → Integrations → Slack** shows an **“Add Ambrose to Slack”** button. Click it → press **Allow** on Slack's consent screen → done. This installs a ready-to-use **router bot** — no Slack app to create, no scopes to add, no tokens to copy. You can immediately `@Ambrose teamname: your question` in any channel you invite it to. You can also **“Sign in with Slack”** from the login (/login) or sign-up (/signup) page to create or access your Ambrose account with your Slack identity — no password needed. A brand-new Slack identity creates its own Ambrose workspace; an existing one signs straight in. **See those buttons?** Use them and skip the rest of this page — the whole manual setup below is only needed when the one-click install isn't available. #### Manual setup — Step 1: Create the Slack app (both modes) 1Go to api.slack.com/apps (https://api.slack.com/apps) → **Create New App** → From scratch → name it (e.g. "Ambrose") → pick your workspace → Create. 2**OAuth & Permissions** → Bot Token Scopes → add: `app_mentions:read`, `chat:write`, `im:history`, `im:read`, `channels:history`, `users:read`. Add `files:write` too if you want long answers uploaded as file snippets. 3**App Home** → under Show Tabs, turn on the **Messages Tab**, then tick **"Allow users to send Slash commands and messages from the messages tab."** Without this checkbox, Slack shows "Sending messages to this app has been turned off" and DMs never reach Ambrose. 4**Event Subscriptions** → toggle on → paste the **Request URL** shown in the Ambrose Bot tab (it is `https://app.hiambrose.com/slack/events`) → wait for the green Verified → under Subscribe to bot events add `app_mention` (channel mentions) and `message.im` (DMs) → Save. 5**Install to Workspace** (OAuth & Permissions → Install App → Allow). Then copy the **Bot User OAuth Token** (`xoxb-…`, OAuth page) and the **Signing Secret** (Basic Information → App Credentials). **Reinstall after any change.** Adding a scope or event does not take effect until you reinstall the app — and if the token changes, paste the new `xoxb-…` back into Ambrose (rotate it on the bot row). #### Step 2 — Add the bot in Ambrose 1Settings → Integrations → Slack → **Bot Token** tab → Add a bot. 2Choose the **Mode**: Bound (pick the one agent/team it answers as) or Router (optionally pick a **default team** used when a message has no team name). 3Enter a name, paste the **Bot User OAuth Token** + **Signing Secret**, choose whether it also answers DMs, then Add bot. Ambrose verifies the token with Slack and records the bot's workspace. #### Step 3 (Router) — mention a team by name Slack can't `@`-mention a team (teams aren't Slack users), so with a Router bot you mention the **bot** and name the team in the text, followed by a **colon**: ``` @YourBot renewals: which of my clients have a plan termination this quarter? @YourBot "client service": draft a welcome message for a new enrollee ``` In a **DM** you don't mention the bot — just start with the team name: ``` aca-website: how do I generate an ACA website? ``` **How the name is matched** (all scoped to your agency, teams win ties over agents): - Exact slug — renewal-manager - Exact name (case-insensitive) — Renewal Manager - Unique prefix / substring — renewals → renewal-manager **Fallbacks:** if the name matches nothing, the bot replies with the list of teams you can reach. If it matches more than one, it asks you to be more specific. If you set a **default team** and send a message with no team prefix, that default runs. **The colon matters.** `@YourBot renewals: …` routes to the renewals team; `@YourBot how do I …` (no colon) runs the bot's default team instead — or shows the team list if no default is set. Typing a team's name as a fake `@mention` (e.g. `@renewals`) does not work — Slack treats it as plain text. #### Make the bot usable for everyone in your workspace Installing the app to your workspace already makes it available to **every member** — there is no per-user install. If teammates can't use it: - Invite it to the channel. A bot only answers in channels it has joined: /invite @YourBot in each channel. - For DMs, members open it from the left sidebar → Apps → search the app name → Message. (Requires the Messages Tab from Step 1.) - Workspace app approval. If your workspace requires admin approval for apps, an Owner/Admin must approve it under Settings & administration → Manage apps. - Different workspace? To let a separate Slack workspace install it, activate public distribution (api.slack.com/apps → Manage Distribution). Same-workspace use never needs this. #### How it works - Routing. Every bot shares one Request URL. Ambrose matches each incoming event to the right bot by workspace + the bot's signing secret, then (bound) runs the fixed node or (router) resolves the team named in the message. - Isolation. A router bot only ever resolves teams/agents inside its own agency — never from the Slack workspace or the message text. A name that isn't yours simply doesn't match. - In-thread replies. The answer is posted back in the same thread as the mention, so conversations stay tidy. - Mentions & DMs. Channel @mentions always work. DMs work when "Also answer direct messages" is on and message.im is subscribed. - Multiple bots. Run a bound Support bot and a router bot side by side; each is independent. Each row has Enable/Disable and Delete. - Billing. Bot replies run the agent/team exactly like in-app chat — billed the normal way (platform Bedrock deducts credits; your own Anthropic key is logged but not charged). See AI provider. - Privacy. The agent/team's normal PHI handling applies; only de-identified content leaves under the configured mode. See PHI mode. #### Troubleshooting - "Sending messages to this app has been turned off." Turn on App Home → Messages Tab and tick "Allow users to send Slash commands and messages from the messages tab," then reinstall and reopen Slack. This is a Slack setting, not an Ambrose one. - Router bot answered generically instead of the team. You left out the colon (or the bot mention). Use @YourBot teamname: your question; in a DM, start with teamname:. - "Which team?" or "matched more than one." The name you used was empty/unknown or ambiguous. Use the exact slug (e.g. aca-website:) — the reply lists the names you can use. - Slack won't verify the Request URL. Paste it exactly (https://app.hiambrose.com/slack/events) and press Retry in Slack. - Bot doesn't respond to a mention. Confirm it's invited to that channel, enabled in Ambrose, and you subscribed to app_mention. - DMs ignored. Turn on "Also answer direct messages," subscribe to message.im, and enable the Messages Tab. - Other members can't use it. Invite the bot to their channels, have an admin approve it under Manage apps, and make sure the app is installed to the workspace. - "Slack rejected the bot token." The xoxb-… token is wrong or the app wasn't installed — reinstall and copy the Bot User OAuth Token again. ====================================================================== # Discord URL: https://app.hiambrose.com/docs/int-discord ====================================================================== Webhook or bot. Webhook is easiest — no app creation, no permissions. ### Webhook In Discord → right-click the channel → **Edit Channel → Integrations → Webhooks → New Webhook → Copy Webhook URL**. Paste in Ambrose. Ambrose tests the URL via a metadata read — no message posted. Add as many channels as you want. Each gets its own row. ### Bot Bot token + Guild ID + default channel ID. Required for two-way (reading threads, responding to mentions). ====================================================================== # VAPI (voice) URL: https://app.hiambrose.com/docs/int-vapi ====================================================================== VAPI plugs into Ambrose three ways. Pick the one that fits. ### 1. Custom LLM (most flexible) VAPI uses your agent as the LLM. Your agent's prompt + tools take over completely. - Agent / team detail → Connect → copy OpenAI-Compatible URL. - VAPI → assistant settings → model.url = that URL, model.id = ambrose/agent/ (or /team/). - Optional: bearer token in model.headers. ### 2. Tool call webhook VAPI keeps its own LLM. During a call it invokes Ambrose as a function for specific tasks ("look up this contact", "quote a plan"). - URL = /api/{kind}//webhook/vapi. ### 3. Native MCP VAPI MCP support. Paste the Streamable HTTP MCP URL in VAPI's MCP config. The team / agent appears as a tool callable mid-call. ====================================================================== # Retell (voice) URL: https://app.hiambrose.com/docs/int-retell ====================================================================== Same idea as VAPI. Custom LLM (full takeover) or function call (during Retell's own conversation). ### Custom LLM Retell → Settings → llm.custom_llm_url = Ambrose's OpenAI-Compatible URL. Use this when you want Ambrose to drive the conversation. ### Function Register a custom function in Retell with URL = `/api/{kind}//webhook/retell`. Retell drives the call; calls Ambrose for specific actions. ====================================================================== # Closebot URL: https://app.hiambrose.com/docs/int-closebot ====================================================================== GHL chatbot with custom-tool webhook. Lets Closebot ask Ambrose anything mid-conversation. ### Connect 1Agent detail → Connect → copy Closebot Webhook URL. 2Generate a bearer token (consumer name: `closebot-prod`). 3In Closebot → add custom tool → paste URL → Authorization header = `Bearer `. Schema: `{ "message": "string" }`. Closebot will POST to your agent every time the tool fires. Use the response in the Closebot reply. ====================================================================== # Stripe URL: https://app.hiambrose.com/docs/int-stripe ====================================================================== For agencies that bill their own clients through Ambrose. Webhook-based event flow. Settings → Integrations → Stripe → paste the API key. Recommended for agency-of-record models. For SAA-hosted billing this is already configured. ====================================================================== # Linear URL: https://app.hiambrose.com/docs/int-linear ====================================================================== Mount the official Linear MCP server in 30 seconds — issues, projects, comments become tools for Riley and your engineering team. Linear ships an official MCP server. Add it via Settings → MCP: ``` type: http url: https://mcp.linear.app/sse headers: { Authorization: "Bearer lin_api_..." } ``` Then attach to the agents you want. Riley (CTO) is the obvious place. ====================================================================== # Make / Zapier / generic webhook URL: https://app.hiambrose.com/docs/int-make-zapier ====================================================================== Anything that can POST JSON can hit Ambrose. Anything that needs a JSON response from Ambrose can call the run endpoint. ### Inbound (Make / Zapier calls Ambrose) ``` POST /api/agent//run { "input": "your text" } ``` If your platform sends an unusual JSON shape, use `/webhook/custom` instead — it auto-detects the input field. You can also pass `?input_field=foo` or `?input_path=a.b.c`. ### Outbound (Ambrose calls Make / Zapier) Add a routine with the output sink set to "Webhook". Ambrose POSTs the run result to the URL you specify after every fire. ====================================================================== # Claude Desktop / Cursor URL: https://app.hiambrose.com/docs/int-claude-cursor ====================================================================== Mount any Ambrose agent or team in Claude Desktop or Cursor via MCP. ### HTTP MCP (recommended) ``` // ~/.claude/mcp_settings.json (Claude Desktop) { "mcpServers": { "ambrose-jordan": { "type": "http", "url": "https://app.hiambrose.com/api/agent/jordan-knox/mcp", "headers": { "Authorization": "Bearer ambrose_..." } } } } ``` ### Cursor Settings → MCP → Add by URL → paste the agent's MCP URL + bearer token. ### stdio wrapper If you must use stdio: ``` { "mcpServers": { "ambrose-jordan": { "command": "node", "args": ["scripts/node-mcp-wrapper.js", "--kind", "agent", "--slug", "jordan-knox", "--hub", "https://app.hiambrose.com"] } } } ``` ====================================================================== # Connect GitHub (push generated code) URL: https://app.hiambrose.com/docs/connect-github ====================================================================== Save a GitHub Personal Access Token so Ambrose agents can push the code and projects they generate straight to your own GitHub repositories. Your token, your repos, isolated to your agency. When an agent builds a web page, a Next.js or Vue project, or any code for you, it can publish that project to **your own** GitHub with one instruction (for example, "push this to a new repo called acme-site"). To enable it, connect a GitHub Personal Access Token (PAT) once. ### Step 1 — Create a token on GitHub (use a Classic token) Use a **Classic** personal access token — it's the simplest to scope correctly for everything Ambrose does (create repos, push code, push workflow files, and packages). - Sign in to github.com. - Open the new-token page directly: https://github.com/settings/tokens/new (this is Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token (classic)). - Give it a Note (e.g. "Ambrose") and set an Expiration. - Tick these scopes: repo — full control of repositories (read + write code, create repos). Required. - workflow — lets Ambrose push GitHub Actions workflow files (.github/workflows/…). - write:packages — publish packages (under write:packages). - admin:org → write:org — create/manage repos inside an organization you own. (Skip if you only push to your personal account.) - Click Generate token and copy it now — GitHub shows it only once. A classic token looks like ghp_…. **Fine-grained alternative.** If your org requires fine-grained tokens, that works too — grant Repository permissions: **Contents: Read and write**, **Administration: Read and write** (to create repos), **Workflows: Read and write**, and (for packages) the relevant package permission. A fine-grained token looks like `github_pat_…`. Classic is recommended for simplicity. ### Step 2 — Save it in Ambrose - Open Settings → Keys in Ambrose. - Find the GitHub card, paste your token into Personal Access Token, and click Save. The token is stored encrypted and scoped to your agency only — no other agency can use or see it. ### Step 3 — Use it In chat or the War Room, ask an agent to push a project, for example: "Create a simple landing page for my agency and push it to a new private repo called acme-landing." The agent builds the files, creates the repo if needed, pushes them as one commit, and hands you the repo and commit links. Two tools become available to any agent/team that has the `github` spoke enabled (and they work over a published team MCP (#team-mcp) too): - github_list_repos — lists the repos your token can see, to help pick a target. - github_push — pushes the agent's workspace (or specific files) to owner/repo@branch as one commit, creating the repo first if it doesn't exist. ### Good to know - Scope: a classic token with repo covers reading/writing code and creating repos. Add workflow to push .github/workflows files, write:packages to publish packages, and write:org (under admin:org) to create repos inside an organization. - Expiration: if you set an expiry, re-paste a new token when it lapses. - Org repos: Ambrose can push to an existing org/repo your token can access; it only auto-creates repos under your own account. - Security: the token is stored as a secret, scoped to your agency only — it is never returned to the UI (only a "saved" flag + last 4 chars). Revoke it anytime on GitHub to instantly cut access. ### Troubleshooting - "Save failed" — make sure you pasted the token value (starts with ghp_ or github_pat_), not the token's name or URL. Generate a fresh one if you're unsure — GitHub only shows the value once. - Agent says "No GitHub token connected" — the token didn't save, or it was saved for a different agency. Re-open Settings → Keys, confirm the GitHub card shows Saved, and save again. - Push rejected — the token is missing scope. Generate a classic token at github.com/settings/tokens/new with repo (+ workflow for Actions files, write:packages for packages, write:org for org repos). ====================================================================== # File Library — folders, uploads, downloads URL: https://app.hiambrose.com/docs/file-library ====================================================================== The Files page is your agency file space: upload anything, organise into folders, and download. It also shows your Vault book of business and anything agents have generated for you, all isolated to your agency. Open **Files** in the top nav. It is a full file manager scoped to your agency only — no other agency can see your files. ### What you can do - Upload — click Upload or drag files onto the page. Files land in the folder you are currently viewing. - Create folders — click New folder, name it, and open it to upload into it. Folders can nest. - Navigate — click a folder to open it; use the breadcrumb trail at the top to jump back up. - Rename / move — use Rename on any file or folder. - Download — click Download on any file. - Delete — removes a file, or a folder and everything inside it. ### The two read-only sections - Vault — your book of business. The flat vault your watchdogs read (HealthSherpa CSVs, commission statements, carrier PDFs). View and download here; manage uploads on the Vault page. - Generated by agents. Code and web files agents produced for you, ready to download. ### Where do generated documents go? When an agent makes a spreadsheet, Word doc, or PDF, it is saved to your Vault (#vault) and you get a download link. Code and web projects are saved to the Generated section here. Everything is stored per-agency in secure cloud storage. ====================================================================== # Generate documents and files with agents URL: https://app.hiambrose.com/docs/generating-files ====================================================================== Ambrose agents can create real Excel, Word, PDF, and CSV documents, plus HTML pages and multi-file code projects, and they always land in your isolated file space. Just ask an agent in plain English. Examples: - "Make an Excel of my top 20 clients with their plan and premium." → an .xlsx saved to your Vault with a download link. - "Write a one-page PDF summary of this month's ACA opportunities." → a .pdf in your Vault. - "Draft a Word doc welcome letter for new Medicare clients." → a .docx in your Vault. - "Build a simple landing page for my agency." → an HTML/code project in your Files, Generated section. Supported document formats: **CSV, Excel (.xlsx), Word (.docx), PDF**. Plus HTML, JavaScript/TypeScript, and full project trees for code. To publish a code project to GitHub, first connect a GitHub token (#connect-github), then ask the agent to push it. ### Skills Agents come with a library of built-in skills (document creation, slide decks, brand guidelines, web artifacts, and more) that they draw on automatically. You can restrict which skills a specific agent uses on the agent's **MCP and Skills** tab; the core document skills stay available to every agent. ====================================================================== # Settings overview URL: https://app.hiambrose.com/docs/settings ====================================================================== Seven tabs in Settings. API keys, PHI mode, integrations, MCPs, vault encryption, billing, privacy. | Tab | What lives there | | AI | Provider + model + per-provider API key — see API keys. | | Privacy / PHI | Fast / Private / BAA toggle, BAA acknowledgement — see PHI mode. | | Integrations | GHL, HealthSherpa, Twilio, Slack, Discord — see Integrations. | | MCP | External MCP servers — see Add an MCP server. | | Vault | Encryption settings — see Vault. | | Billing | Plan, credits, invoices — see Billing. | | Usage | Token + credit usage by agent / team / day. | ### Agency API Key The top of the AI tab shows your Agency API Key — a single bearer token that authenticates calls to any agent or team in your agency. Rotate it from the same panel. ====================================================================== # API keys (Anthropic / Bedrock) URL: https://app.hiambrose.com/docs/settings-api-keys ====================================================================== Two providers. Pick one (or both). Paste the key. Save. ### Anthropic Paste an `sk-ant-…` key. Used for all Claude models when this provider is selected. ### AWS Bedrock Paste a Bedrock bearer token (`AWS_BEARER_TOKEN_BEDROCK`). Used when Bedrock is the selected provider. Lets billing flow through your AWS account. ### System Bedrock (fallback) If you do not paste a key, your agency falls back to the System Bedrock token managed by SAA. Usage deducts from your credit ledger based on token usage. More (#models-fallback). ### Rotation Replace the value and save. The old key becomes inactive immediately. In-flight runs that already authenticated finish with the old key; new runs use the new one. ====================================================================== # PHI mode (Fast / Private / BAA) URL: https://app.hiambrose.com/docs/settings-phi ====================================================================== The HIPAA toggle. Sets the default mode for every chat unless overridden per-call. ### The three modes | Mode | Provider | PHI policy | | Fast default | External LLM | PHI Rail aliases identifiers before egress; re-hydrates real values on the response. | | Private | Local / BAA-approved | PHI stays on-device or on BAA-allowlisted destinations only. | | BAA | External LLM with signed BAA | PHI allowed under your BAA. Requires explicit acknowledgement. | ### Per-call override Every `/run` and `/openai/chat/completions` call accepts a `phi_mode` param. The response includes `phi_mode` + `phi_reason` + `phi_guardrail_applied` so you can verify which rail fired. ### BAA acknowledgement Turning on BAA mode requires you to tick the box "I have a signed BAA with my chosen provider and I accept responsibility for PHI sent to them." ====================================================================== # Brand voice URL: https://app.hiambrose.com/docs/settings-brand ====================================================================== A short paragraph that defines how Ambrose talks for your agency. Set in Brand (/brand). Every outbound message is anchored against it. Example brand voice: ``` Voice: warm, plainspoken, never salesy. Tone: confident without being pushy. Diction: contractions are fine ("we'll", "you're"). Avoid jargon. Closes: end with a concrete next step or a soft question. Never: emojis, exclamation marks, marketing-speak ("synergy", "leverage"). ``` Heads + reply-bot consult this on every draft. Override per-agent with the agent's VOICE.md. ====================================================================== # Vault encryption URL: https://app.hiambrose.com/docs/settings-vault ====================================================================== The vault is encrypted at rest using a per-agency key. You can rotate the key or export everything at any time. - Encryption: AES-256 at rest. Key per agency, stored in a separate KMS-backed enclave. - Rotation: Settings → Vault → Rotate. Old data is decrypted with the old key, re-encrypted with the new. - Export: Settings → Vault → Export all. Downloads a tarball. - Wipe: only the agency admin can wipe. Two confirmations. Asynchronous. ====================================================================== # Billing & usage URL: https://app.hiambrose.com/docs/settings-billing ====================================================================== Add a card, top up credits, turn on auto top-up, review charges, and manage your subscription — everything on Settings → Billing. Open **Settings → Billing** (app.hiambrose.com/settings#billing (https://app.hiambrose.com/settings#billing)). The page has three sub-tabs: **Credits**, **Top-up history**, and **Subscription**. ### How billing works Ambrose runs on a **prepaid credit balance**. When the War Room or your agents/teams make an AI call on the system provider (AWS Bedrock), credits are deducted based on token usage. You keep the balance topped up either manually or with auto top-up. (If you bring your own Anthropic key instead, those calls are billed by Anthropic directly and don't touch your credits — see AI & keys (#settings-ai).) ### Credits tab #### 1 · Credit balance The big number at the top is your current prepaid balance. Below it, the meta line shows recent activity. Everything else on this tab exists to keep that number positive. #### 2 · Payment method — add / replace / remove a card - If you have no card yet, click Add a card. A secure Stripe card field appears — enter the number, expiry, and CVC, then Save card. - Once saved, the card shows as brand ending in •••• with exp date. Use Replace to swap it or Remove to delete it. - Your full card number never reaches Ambrose — it stays at Stripe. Ambrose only stores a token plus the brand, last 4, and expiry to display here. #### 3 · Add credits (manual top-up) - Pick a preset — $10 / $25 / $50 / $100 — or type a Custom $ amount, then click Charge card. - The charge hits your saved card and the funds are added to your balance immediately. - You need a saved card first — if none is on file, the button is disabled and a hint points you back to Payment method. #### 4 · Auto top-up - Toggle Enable auto top-up on. Set two numbers: when balance drops below $X, charge $Y to refill. - Ambrose watches your balance and automatically charges your saved card to refill when it falls below the threshold — so AI calls never stop mid-task. - Rules: the reload amount must be at least $0.50 (Stripe minimum) and greater than the threshold (otherwise you'd refill straight into another refill). - Safety: after 3 consecutive failed charges (e.g. an expired card) auto top-up switches itself off so you aren't hammered with declines — the last error is shown so you can fix the card and turn it back on. - Requires a card on file before it can be enabled. ### Top-up history tab Every Stripe charge against your card — manual top-ups and auto top-ups — listed newest first, with date, amount, and status. **Failed attempts appear here too** with the decline reason, so you can tell exactly why a refill didn't go through. Paginated when the list is long. ### Subscription tab - Your subscription shows current status — active, trialing, past due, canceled, or none. - Plans lists the plans you can subscribe to. Click one to subscribe; you're redirected to Stripe Checkout and bounced back here when done. - Agencies placed on a package by your administrator won't be nagged to subscribe — instead you'll be prompted to add a card and use credits. ### Related - AI & keys — choose system Bedrock vs your own Anthropic key, set the default model, and set spend caps (hard daily/weekly/monthly ceilings on AI spend). ====================================================================== # Privacy URL: https://app.hiambrose.com/docs/settings-privacy ====================================================================== What Ambrose stores, what it sends out, and how to inspect every PHI scrub. - What we store: agency rows + vault files + per-agency edits + LLM call metadata. No prompt / response bodies in the call log. - What we send out: only the prompt the active head needs, scrubbed per the PHI Rail, to your selected provider. - Where to inspect scrubs: phi-gateway's phi_audit_query tool returns every scrub event with timestamp, source, identifier counts. - Deletion: Settings → Privacy → Delete account. Wipes agency rows, vault, encryption keys, and credit ledger. Irreversible. ====================================================================== # Supported models URL: https://app.hiambrose.com/docs/models ====================================================================== Anthropic Claude (direct or via AWS Bedrock) — Opus, Sonnet, Haiku. All have prompt-caching and tool use. | Family | Best for | Latency | Cost | | Claude Opus 4.7 | Deep multi-step reasoning, War Room synthesis, long-context analysis. | 2–6s | $$$ | | Claude Sonnet 4.6 | Most agent work. Great default. | 1–3s | $$ | | Claude Haiku 4.5 | Routing, simple classifications, voice agents (sub-second). | 0.4–1s | $ | ### Pick per agent Each agent / team picks its own model. Mix and match: route the cheap stuff to Haiku, hand the hard stuff to Opus. ### Prompt caching System prompts (agent identity + skills + tool catalog) are cached server-side. Repeated calls inside a 5-minute window hit the cache and pay 1/10 the input-token price. ====================================================================== # Anthropic Claude (direct) URL: https://app.hiambrose.com/docs/models-anthropic ====================================================================== Paste your sk-ant-… key in Settings → AI. Billing flows through Anthropic. Direct Anthropic access. Use this when you have your own Anthropic account and want the bill there. Supports BAA — apply for one in the Anthropic console; once approved, flip the BAA toggle in Privacy (#settings-phi). ====================================================================== # AWS Bedrock URL: https://app.hiambrose.com/docs/models-bedrock ====================================================================== Same Claude models, billed through your AWS account. Required for some compliance regimes. Bedrock is AWS' managed home for foundation models. Anthropic's Claude line is available there with the same capability surface (tool use, prompt caching, vision). To use it: AWS Bedrock console → enable Claude models in your region → mint an inference profile → paste the bearer token in Settings. ====================================================================== # System Bedrock fallback URL: https://app.hiambrose.com/docs/models-fallback ====================================================================== When you have not pasted any key, your agency falls back to SAA-managed Bedrock. Pay-per-use via credits. The System Bedrock token is SAA-owned. Usage is deducted from your credits based on token consumption. Best for trials and low-volume usage. Switch to your own key once volume justifies the dedicated billing surface. ====================================================================== # Connect any system URL: https://app.hiambrose.com/docs/connect ====================================================================== Every agent and every team auto-publishes 7+ URL shapes. Pick the one your platform needs and paste. The same backend (one agent / team) is reachable via: - Generic JSON — /run - OpenAI-compatible — /openai/chat/completions - Streamable HTTP MCP — /mcp - Platform webhooks — /webhook/closebot|vapi|retell|custom|ghl See 7 URL shapes per node (#connect-shapes) for the full list. ====================================================================== # 7 URL shapes per node URL: https://app.hiambrose.com/docs/connect-shapes ====================================================================== Drop a folder, get 7 URLs. Same backend, 7 different shapes for different consumers. | Shape | Use for | | POST /api/{kind}//run | Anything that can POST JSON. | | POST /api/{kind}//openai/chat/completions | VAPI Custom LLM, Retell Custom LLM, OpenAI SDK base_url. | | POST /api/{kind}//webhook/closebot | Closebot custom tool. | | POST /api/{kind}//webhook/vapi | VAPI tool call. | | POST /api/{kind}//webhook/retell | Retell custom function. | | POST /api/{kind}//webhook/custom | Anything else — auto-detects input field. | | POST /api/{kind}//mcp | Streamable HTTP MCP — Claude Desktop, Cursor, VAPI MCP. | `{kind}` = `agent` or `team`. GHL webhooks are team-only as of May 2026. ====================================================================== # OpenAI-compatible endpoint URL: https://app.hiambrose.com/docs/connect-openai ====================================================================== Drop in to any tool that supports the OpenAI Chat Completions API. Set base_url + model. ### OpenAI SDK (TypeScript) ``` import OpenAI from 'openai'; const client = new OpenAI({ baseURL: 'https://app.hiambrose.com/api/agent/jordan-knox/openai', apiKey: process.env.AMBROSE_TOKEN, }); const r = await client.chat.completions.create({ model: 'ambrose/agent/jordan-knox', messages: [{ role: 'user', content: 'Quote ICHRA for 25 employees in Austin.' }], }); ``` ### OpenAI SDK (Python) ``` from openai import OpenAI client = OpenAI( base_url="https://app.hiambrose.com/api/agent/jordan-knox/openai", api_key=os.environ["AMBROSE_TOKEN"], ) r = client.chat.completions.create( model="ambrose/agent/jordan-knox", messages=[{"role": "user", "content": "Quote ICHRA for 25 employees in Austin."}], ) ``` ### Streaming Set `stream=true`. Returns SSE events with `data:` deltas in the OpenAI format. ### PHI mode Pass `extra_body={"phi_mode": "fast"|"private"|"baa"}`. Response headers include `x-ambrose-phi-mode` and `x-ambrose-phi-reason`. ====================================================================== # Streamable HTTP MCP URL: https://app.hiambrose.com/docs/connect-mcp-url ====================================================================== The modern MCP transport. One URL → mount in Claude Desktop, Cursor, VAPI, or your own SDK. See team MCP deep dive (#team-mcp) for the full reference with examples. Same shape on agents — `/api/agent//mcp`. ====================================================================== # Bearer tokens URL: https://app.hiambrose.com/docs/connect-bearer ====================================================================== Three different tokens. Do not mix them up. | Token | Scope | Where you generate it | | Agency API Key | Every agent / team in your agency. | Settings → AI | | Consumer token (per agent / team) | One agent or team, one named consumer. | Agent / team detail → Consumer Tokens | | MCP Personal Access Token | Your own device acting as an MCP client. | Settings → MCP → Personal tokens | #### Rule of thumb - Sharing one agent with one platform → consumer token. Surgical revocation. - Building an internal app that talks to many agents → Agency API Key. - Mounting Ambrose in your own Claude Desktop / Cursor → MCP PAT. ====================================================================== # System architecture URL: https://app.hiambrose.com/docs/architecture ====================================================================== Ambrose is a multi-process stack with strict service responsibilities. This is the 30-second tour. ### The big six | Service | Port | Role | | Supervisor | 9000 | Admin/dev UI + process manager. Proxies /auth/* + /api/*. | | Ambrose Core (Python) | 8100 | Orchestrator. /api/chat, agents, teams, node publishing, vault, voice tool dispatch. | | Ambrose Core (Node.js) | 3300 | War Room (/api/warroom), Claude Agent SDK runner with MCP bridges (ghl, vault, brain, admin-ops), PHI Rail, billing. | | The Brain | 8150 | 25+ federal/healthcare data MCPs (CMS, NADAC, FDA, Federal Register, …) behind tier gates + rate limits. | | PHI Gateway | 8160 | Pseudonymization proxy — scrubs the 18 HIPAA identifiers; re-hydrates on response. | | Postgres | 5432 | Multi-tenant state — agencies, agents, teams, routines, tokens, billing, vault index. | ### The live architecture page Logged-in users can open /architecture (/architecture) for a real-time graph — every service, every spoke, current status, recent activity. ====================================================================== # Services & ports URL: https://app.hiambrose.com/docs/arch-services ====================================================================== Full topology. ``` browser │ ▼ nginx (443) ─┐ ├─ Supervisor (9000) ─── static UI (dashboard, agents, teams, …) │ └─ proxies /auth + /api → cores │ ├─ Ambrose Core Py (8100) │ │ │ ├─ Postgres (5432) │ ├─ Brain (8150) [federal/healthcare MCPs] │ ├─ PHI Gateway (8160) │ └─ Spoke subprocesses (per-tool) │ └─ Ambrose Core Node (3300) │ ├─ War Room (/api/warroom) ├─ PHI Rail (scrub/hydrate, BAA gating) ├─ Claude Agent SDK (heads + dispatch) └─ Billing (Stripe) ``` Voice traffic goes through the SAA Voice Relay on Fly.io — Ambrose Core opens a persistent outbound WS; the relay dispatches Retell/VAPI tool invocations back. Real PHI never leaves the customer machine on voice paths. ====================================================================== # PHI Rail URL: https://app.hiambrose.com/docs/arch-phi-rail ====================================================================== Ambrose's redact-then-rehydrate pipeline. The compliance IP. ### Inbound (request) - Prompt arrives at the Node core. - PHI Rail decides: is the destination on the BAA allowlist? Yes → pass through unchanged (BAA mode). - No → call PHI Gateway → scrub identifiers, get back a payload of typed aliases (PERSON_xxxx, EMAIL_xxxx, …) + a hydration map. - The scrubbed payload + a SCRUB_MODE_GUARDRAIL system message ("never invent identifiers") goes to the LLM. ### Outbound (response) - LLM returns response containing aliases. - PHI Rail calls phi_rehydrate with the response + the original hydration map. - Real identifiers are spliced back in. - Response flows to the caller. ### Layered detection The PHI Gateway runs a chain: known contacts (vault membership) → regex patterns → Presidio NER → insurance-specific dictionary. The first hit wins. Each stage has a confidence score that gates whether to alias. ### Audit Every scrub event is logged (timestamp, source, identifier counts — never the actual values). Queryable via `phi_audit_query`. ====================================================================== # Data flow URL: https://app.hiambrose.com/docs/arch-data-flow ====================================================================== A typical "ask the war room" request, traced end to end. - User types in the War Room (browser). - POST /api/warroom to Supervisor (9000). Supervisor proxies to Node Core (3300). - Node Core authenticates the session, sources the agency_id, applies the PHI Rail. - Node Core spawns a Claude Agent SDK session for Ambrose (Chief of Staff). System prompt = Ambrose's CANONICAL.md + tool catalog (MCP bridges: ghl, vault, brain, admin-ops, plus any native-spoke bridges + skills). - Ambrose decides which head(s) to dispatch. Each head runs in its own SDK session — same shape, different prompt + allowed_spokes. - Heads call tools. Each tool call routes through the appropriate bridge: ghl_* → ghl bridge → GHL v2 API (with PHI scrub if not BAA). - vault_* → vault bridge → local index, returns answer (not PHI). - brain MCPs → Brain (8150) → upstream federal API. - admin-ops stages → Python core internal endpoint → Postgres. - Each head returns its contribution. Ambrose synthesizes. - Response streams back to the browser via SSE. - Every LLM call is recorded to llm_calls.db (provider, model, tokens, cost, latency — never bodies). ====================================================================== # Public endpoints URL: https://app.hiambrose.com/docs/api-public ====================================================================== Service discovery + node listings. ``` GET /manifest.json GHL Agent Studio service discovery GET /api/teams list teams GET /api/agents list agents GET /api/nodes both, in one call GET /api/{plural}/{slug} load config + composed prompt GET /api/{plural}/{slug}/files list editable markdown files GET /api/{plural}/{slug}/files/{f} read a file PUT /api/{plural}/{slug}/files/{f} write a file (auto-creates folder) GET /api/spokes/registry spoke catalog (slug, name, description, hipaa_posture, tools) ``` ====================================================================== # Per-node endpoints URL: https://app.hiambrose.com/docs/api-node ====================================================================== Every agent and every team gets these. `{kind}` = `agent` or `team`. ``` POST /api/{kind}/{slug}/run universal JSON POST /api/{kind}/{slug}/openai/chat/completions OpenAI-compatible POST /api/{kind}/{slug}/webhook/{platform} platform-shaped POST /api/{kind}/{slug}/mcp Streamable HTTP MCP GET /api/{kind}/{slug}/integrations copy-paste URLs ``` Platforms for webhook: `closebot`, `vapi`, `retell`, `custom`, `ghl` (team only). ====================================================================== # Management API (Teams & Agents) URL: https://app.hiambrose.com/docs/api-teams-agents ====================================================================== Programmatically manage agents, teams, their markdown files, sequences, skills, MCPs, Claude routines, and read logs — all with your Agency API key. ### Authentication Every endpoint below is **agency-scoped**. Authenticate with your **Agency API key** as a Bearer token (Settings → AI & Keys → Agency API Key). The same endpoints also accept a logged-in session cookie. The agency is always resolved from your key — never pass an `agency_id` in the body; you can only ever touch your own agency's data. ``` Authorization: Bearer YOUR_AGENCY_KEY ``` Base URL: `https://app.hiambrose.com` ### 1. Agents | Action | Method + Path | | List | GET /api/agents | | Get one | GET /api/agents/{slug} | | Create | POST /api/agents | | Update | PATCH /api/agents/{slug} | | Delete | DELETE /api/agents/{slug} | **Create** (immediate). `slug` + `name` required; everything else optional. Duplicate slug → `409`. ``` curl -X POST https://app.hiambrose.com/api/agents \ -H "Authorization: Bearer YOUR_AGENCY_KEY" \ -H "Content-Type: application/json" \ -d '{ "slug": "sales-bot", "name": "Sales Bot", "stage": "draft", "provider": "bedrock", "model": "claude-haiku-4-5-20251001", "allowed_spokes": ["transcription", "agent-vault", "skills-admin"], "allowed_skills": ["gohighlevel"], "attached_mcps": ["my-mcp-slug"], "attached_teams": ["research"], "description": "Handles inbound sales chats" }' ``` **Update** — send only the fields you want to change: ``` curl -X PATCH https://app.hiambrose.com/api/agents/sales-bot \ -H "Authorization: Bearer YOUR_AGENCY_KEY" -H "Content-Type: application/json" \ -d '{ "stage": "live", "allowed_spokes": ["transcription", "ghl"] }' ``` **Delete** (also removes the agent's markdown files and sequences): ``` curl -X DELETE https://app.hiambrose.com/api/agents/sales-bot \ -H "Authorization: Bearer YOUR_AGENCY_KEY" ``` **Get agent / team information:** `GET /api/agents/sales-bot` returns name, slug, stage, tools, mode, files, and the composed system prompt. ### 2. Teams Identical shape to agents (teams are simpler — no `provider` / `model` / `allowed_skills` / `attached_mcps`; those are agent-only and ignored for teams). | Action | Method + Path | | List | GET /api/teams | | Get one | GET /api/teams/{slug} | | Create | POST /api/teams | | Update | PATCH /api/teams/{slug} | | Delete | DELETE /api/teams/{slug} | ``` curl -X POST https://app.hiambrose.com/api/teams \ -H "Authorization: Bearer YOUR_AGENCY_KEY" -H "Content-Type: application/json" \ -d '{ "slug": "research", "name": "Research Team", "allowed_spokes": ["transcription", "brain"], "description": "Deep research crew" }' ``` ### 3. Markdown files (IDENTITY, PERSONALITY, CANONICAL, …) Each agent/team has per-agency markdown files that drive its behavior, plus the config JSON (`agent.json` / `team.json`). Editing a file changes behavior immediately (hot-reload). | Action | Method + Path | | List files | GET /api/agents/{slug}/files | | Read a file | GET /api/agents/{slug}/files/{filename} | | Write / replace a file | PUT /api/agents/{slug}/files/{filename} | | Generate one file (AI) | POST /api/agents/{slug}/generate-file | | Generate all from a URL (AI) | POST /api/agents/{slug}/generate-all | Writable filenames: any `*.md` (IDENTITY.md, PERSONALITY.md, MEMORY.md, NOTES.md, DESCRIPTION.md, BRAND.md, VOICE.md, FAQ.md, CANONICAL.md) or the config file `agent.json` / `team.json`. Swap `/api/agents/` for `/api/teams/` for teams. ``` curl -X PUT https://app.hiambrose.com/api/agents/sales-bot/files/IDENTITY.md \ -H "Authorization: Bearer YOUR_AGENCY_KEY" -H "Content-Type: application/json" \ -d '{ "content": "# Identity\nYou are Sales Bot, a friendly closer for Acme Insurance." }' ``` ### 4. Sequences (scheduled cron jobs) Per-agent/team scheduled prompts. Swap `/api/agents/` for `/api/teams/` for team sequences. | Action | Method + Path | | List | GET /api/agents/{slug}/cron-jobs | | Add | POST /api/agents/{slug}/cron-jobs | | Update | PUT /api/agents/{slug}/cron-jobs/{job_id} | | Remove | DELETE /api/agents/{slug}/cron-jobs/{job_id} | | Enable / disable | POST /api/agents/{slug}/cron-jobs/{job_id}/toggle | | Run now | POST /api/agents/{slug}/cron-jobs/{job_id}/run | | Run history | GET /api/agents/{slug}/cron-jobs/{job_id}/runs | ``` curl -X POST https://app.hiambrose.com/api/agents/sales-bot/cron-jobs \ -H "Authorization: Bearer YOUR_AGENCY_KEY" -H "Content-Type: application/json" \ -d '{ "name": "Monday recap", "schedule": "0 9 * * MON", "timezone": "America/Chicago", "prompt": "Summarize last week and list this week followups.", "session_mode": "thread", "enabled": true }' ``` ### 5. Tools you can select (spokes registry) The list of every tool/spoke selectable in an agent/team's `allowed_spokes`: ``` curl https://app.hiambrose.com/api/spokes/registry \ -H "Authorization: Bearer YOUR_AGENCY_KEY" ``` Each entry's `id` is exactly what you put in `allowed_spokes`; `tools` lists the individual tool names. Entries like `brain:fema` are federated .gov data sources. One-click external MCP templates: `GET /api/mcp/catalog`. ### 6. Skills | Action | Method + Path | | List all available (system + custom) | GET /api/skills/available | | List your custom skills | GET /api/users/{user_id}/skills | | Get one | GET /api/users/{user_id}/skills/{slug} | | Add / update | POST /api/users/{user_id}/skills | | Generate (AI-authored) | POST /api/users/{user_id}/skills/generate | | Remove | DELETE /api/users/{user_id}/skills/{slug} | To let an **agent** use skills, add their slugs to its `allowed_skills`. To let an agent/team manage skills over MCP, give it the `skills-admin` capability in `allowed_spokes`. ``` curl -X POST https://app.hiambrose.com/api/users/USER_ID/skills \ -H "Authorization: Bearer YOUR_AGENCY_KEY" -H "Content-Type: application/json" \ -d '{ "slug": "objection-handling", "content": "---\nname: objection-handling\ndescription: Handle objections\n---\n\n# Objection Handling\n..." }' ``` ### 7. MCP servers | Action | Method + Path | | List | GET /api/users/{user_id}/mcps | | Add (auto-discovers tools) | POST /api/users/{user_id}/mcps | | Refresh tool discovery | POST /api/users/{user_id}/mcps/{slug}/refresh | | Set per-tool permissions | PATCH /api/users/{user_id}/mcps/{slug}/permissions | | Remove | DELETE /api/users/{user_id}/mcps/{slug} | ``` curl -X POST https://app.hiambrose.com/api/users/USER_ID/mcps \ -H "Authorization: Bearer YOUR_AGENCY_KEY" -H "Content-Type: application/json" \ -d '{ "slug": "notion", "label": "Notion", "transport": "http", "url": "https://mcp.example.com/notion", "headers": { "Authorization": "Bearer ..." } }' ``` Attach an MCP to an agent via `attached_mcps`, or to any agent/team over the node `/mcp` endpoint by adding `mcp:` to `allowed_spokes`. ### 8. Claude Routines | Action | Method + Path | | List | GET /api/claude-routines | | Add / upsert | POST /api/claude-routines | | Update | PUT /api/claude-routines/{slug} | | Remove | DELETE /api/claude-routines/{slug} | | Test fire | POST /api/claude-routines/{slug}/test | ``` curl -X POST https://app.hiambrose.com/api/claude-routines \ -H "Authorization: Bearer YOUR_AGENCY_KEY" -H "Content-Type: application/json" \ -d '{ "name": "Nightly report", "routine": "ROUTINE_ID_OR_URL", "token": "ROUTINE_BEARER", "enabled": true }' ``` ### 9. Logs (AI call logs) | Action | Method + Path | | List recent calls | GET /api/llm-calls | | Aggregate summary | GET /api/llm-calls/summary | | One call (full prompt+response) | GET /api/llm-calls/{call_id} | Filters (query params): `agent_id`, `team_id`, `workload_tag`, `user_id`, `session_id`, `search`, `since_hours`, `success_only`, `limit`, `offset`. ``` curl "https://app.hiambrose.com/api/llm-calls?agent_id=sales-bot&since_hours=24&limit=100" \ -H "Authorization: Bearer YOUR_AGENCY_KEY" ``` Each row records the provider (`bedrock` / `anthropic`), tokens, model, and cost. Bedrock calls are billed to your credits; calls made with your own Anthropic API key are logged but not billed. **Quick map:** Add agent/team → `POST /api/agents` · `POST /api/teams`. Edit a persona file → `PUT /api/agents/{slug}/files/{file}.md`. Sequences → `/api/agents/{slug}/cron-jobs`. All tools → `GET /api/spokes/registry`. All skills → `GET /api/skills/available`. MCPs → `/api/users/{user_id}/mcps`. Routines → `/api/claude-routines`. Logs → `/api/llm-calls`. ====================================================================== # Token management URL: https://app.hiambrose.com/docs/api-tokens ====================================================================== Per-agent / per-team consumer tokens. ``` GET /api/{plural}/{slug}/tokens list consumer names POST /api/{plural}/{slug}/tokens { consumer, token? } → returns token ONCE DELETE /api/{plural}/{slug}/tokens/{consumer} revoke ``` ====================================================================== # Vault API URL: https://app.hiambrose.com/docs/api-vault ====================================================================== Upload, reindex, query. ``` GET /api/vault/status index health POST /api/vault/upload multipart upload (BoB CSV/PDF/XLSX) POST /api/vault/scan reindex POST /api/vault/query natural-language Q&A POST /api/vault/search keyword search GET /api/vault/list browse files POST /api/vault/read read file POST /api/vault/summary summarize file ```