Connect once. Every session shares the same memory.
Integrated AI is a remote MCP server. Any MCP-speaking client works the same way: point it at the server, sign in once through your identity provider, and every tool call after that is scoped to your org.
Connect a client
Add it to your MCP client's server config. In Claude Code, that's
~/.claude.json (or a project-level config) under
mcpServers:
{
"mcpServers": {
"integrated-ai": {
"type": "http",
"url": "https://mind-api.dfens.ai/mcp"
}
}
}
The first connection pops a browser for sign-in through your organization's identity provider and auto-creates your user record. Every tool call still returns "forbidden" until an org owner or admin adds you as a member — see orgs & roles.
Don't have an organization yet? OIDC sign-in above is for joining one that
already exists. The quickest way to create your own is the
customer portal — sign
in, name your org, and you're through in minutes, with Team available as a
hosted Odoo checkout from the same dashboard. Automating the bootstrap
instead (CI, a provisioning script)? Two plain HTTP calls (not MCP tool
calls — there's no credential yet) get you a live api_key to put
in the config above:
// 1. Create your organization (free Individual plan by default) curl https://mind-api.dfens.ai/v1/organizations \ -d '{"name":"Acme Inc","contact_email":"you@acme.com"}' // → {"org_id": "…", "status": "pending_verification"} // 2. Check your email for a code, then verify curl https://mind-api.dfens.ai/v1/organizations/<org_id>/verify \ -d '{"code":"123456"}' // → {"status": "active", "plan_id": "individual", "api_key": "sk_live_…"}
Put that api_key into the config above as a bearer token, and
you're live. Ready for a team? start_checkout(org_id, plan_id) is
a real MCP tool call once you're signed in — it returns a hosted Odoo checkout
link, and card details never touch us directly.
Authentication
Sign-in federates through one or more standards-compliant OIDC providers — Google, Okta, Microsoft Entra, or a self-hosted identity provider — configured per deployment. With exactly one provider configured, sign-in goes straight to it; with more than one, an email-first page routes you by domain, or shows a picker. Where no provider is mapped to your domain, you can also sign in with an email address and password (verified by emailed code, with self-service password reset). Invited members get an invite email and can set their own password.
Behind that federated login, Integrated AI runs its own minimal OAuth 2.1 authorization server, so MCP clients get standard dynamic client registration and an authorization-code + PKCE flow. It mints its own RS256-signed JWTs as the access/refresh tokens your client actually uses — your identity provider's tokens never leave the login exchange.
Bringing your own identity provider (custom_oauth) — an
Okta, Entra, Google Workspace or other OIDC provider that your org's
owners and admins configure themselves in the portal, with email-domain
routing — is an Enterprise entitlement. So are read-only context sharing,
configurable retention & archival (retention_archive) and
connectors for Google Drive, SharePoint and
OneDrive (background_scanners). Individual and Team don't
include these; sign-in itself works the same on every tier. See
pricing for the full breakdown.
Tools
Every tool below is a plain MCP tool call. Every one except
list_contexts requires a context id — there's no
default, and passing the wrong one silently returns empty results rather
than an error, so always resolve it from list_contexts() first.
| Tool | Purpose |
|---|---|
list_contexts() | Every context the caller can access, as {id, name, description, instructions, keywords, visibility, is_personal}. |
create_context(org_id, name, description, instructions?, keywords?) | Create a new context, org-visible by default. |
capture_thought(context, content, topics?, people?) | Save a new thought. |
search_thoughts(context, query, limit?) | Semantic search within a context. |
browse_recent(context, limit?, topic?) | List recent thoughts, optionally filtered by topic. |
view_stats(context) | Total count, top topics, and most recent thought. |
update_thought(context, id, content?, topics?, people?) | Revise an existing thought. |
delete_thought(context, id) | Remove a thought. |
create_skill / get_skill / list_skills / update_skill / delete_skill | Versioned, shared working-practice documents scoped to a context. See Skills. |
list_skill_files / get_skill_file | Files bundled alongside a skill, beyond its plain-text instructions. |
invite_member(org_id, email, role?) | Add a teammate by email — they get access on their next sign-in, no separate accept step. Owner/admin only. |
admin_create_api_key(org_id, name, user_email?) | Issue an org API key for an unattended harness. The raw key is returned once, on creation. Owner/admin only. |
admin_list_api_keys(org_id) / admin_revoke_api_key(org_id, key_id) | List or revoke org API keys (metadata only — the raw key is never shown again). Owner/admin only. |
buy_seats(org_id, additional_seats) | Start a hosted checkout for extra seats on a paid plan. Owner/admin only. |
subscription_status(org_id) | Current plan, usage (thought count, storage), and billing state. |
start_checkout(org_id, plan_id) | Start a hosted checkout to move the org onto a paid plan. Owner/admin only. |
Org-admin tools (admin_list_org_members, admin_add_org_member,
admin_create_api_key, admin_create_context,
admin_grant_context, and similar) sit behind an owner/admin
role check — any authenticated user can see them listed, but calling one without the
role returns a permission error.
Context model
Every thought lives inside a context: an opaque id belonging to
exactly one organization, with one of two visibilities.
- org (the default) — every member of the org has access, no separate grant needed.
- restricted — only members holding an explicit grant can access it. Every user also gets one automatic personal context on joining an org: always restricted, always private to them, and unlike any other restricted context, it can never be shared.
A context also carries a human-readable name and
description — not necessarily unique — that a caller uses to pick
the right id from a list_contexts() result. Optional
instructions (when and how to read or write the context) and
keywords (explicit trigger words) help an agent choose.
On Enterprise, admin_grant_context(context, user_email, access_level?)
takes access_level write (the default) or
read, for view-only access that can search and browse but not
capture, edit or delete.
Orgs & roles
Roles are owner, admin, and member. Every role
gets access to every org-visibility context, plus any restricted one they
hold a grant on. owner/admin additionally manage
membership, create and edit contexts, and grant or revoke access to
restricted ones. A plain member gets the same self-serve
context-creation ability by being flagged a poweruser. An org always
keeps at least one owner.
Create and manage an organization from the customer portal — org creation, plan upgrades, API keys, and member/context management, no API calls required. The HTTP bootstrap above still works, for automation. See pricing for what each tier includes.
Skills
One canonical, org-owned skill every AI tool your team runs can pull —
Claude, or any other MCP-speaking harness — instead of every tool keeping
its own drifting copy. Versioned skill storage
(create_skill/get_skill/list_skills/
update_skill/delete_skill), scoped to a context,
with optional bundled files beyond plain-text instructions
(list_skill_files/get_skill_file).
Works identically from a signed-in human session or an org API key, so
an unattended harness can pull a skill on its own — no human needs to be
signed in. Owners and admins can mint and revoke named API keys for more
harnesses themselves, from the customer portal or with
admin_create_api_key.
Making a skill runnable, not just stored
The tools above are storage — pulling a skill into a session is still
up to your harness. Most MCP clients, Claude Code included, only
discover skills from SKILL.md files scanned off local disk
once at session start; none of them know about a remote skill store on
their own. Bridge that once and every skill your team keeps in DFENS
Mind becomes runnable without a matching local file — no per-skill
setup, and no redeploy when someone edits one.
Manually — save a small permanent loader as a local
skill. In Claude Code that's a file at
~/.claude/skills/dfens-mind-skills/SKILL.md; other harnesses
that support local skills use an equivalent path.
--- name: dfens-mind-skills description: Resolves and runs skills stored in the DFENS Mind MCP knowledge base. Use whenever a requested skill isn't available locally. --- 1. Call list_contexts, then list_skills on every context returned — merge the results into one registry keyed by skill name. 2. Match the request against each result's description field, the same way a local SKILL.md's frontmatter description is matched. 3. Once matched, treat its instructions field as that skill's full body and follow it exactly. If has_files is true, fetch each one first with list_skill_files / get_skill_file.
Via global instructions — for a harness with no local-skill
mechanism, or to make the check automatic rather than needing the loader
invoked by name, add the same rule to your harness's persistent global
config instead (Claude Code's ~/.claude/CLAUDE.md, or
whatever plays that role for your client):
If a requested skill isn't found locally, check DFENS Mind before assuming it doesn't exist: call list_contexts, then list_skills on each context, and match the request against every result's description field. Follow the matched skill's instructions field as its full body, in place of these instructions.
Either way, this is a one-time setup per harness install, not per organization or session.
Data source connectors
Enterprise orgs can connect data sources, including Google Drive,
SharePoint and OneDrive, and sync their content into memory instead of
capturing it by hand. A synced file is split into chunks, embedded in your
org's region, and stored as ordinary thoughts, so search_thoughts
and browse_recent find it with no new tools. Edits, moves and
deletions at the source are picked up on the next sync, and content the
connector can no longer read is removed from search.
- Google Drive — shared drives or individual folders. A Workspace admin authorises our service account for read-only Drive access (domain-wide delegation). No per-user tokens are stored.
- Microsoft 365 — SharePoint sites (every document
library on the site) and OneDrive. A tenant admin grants consent, ideally
scoped to named sites (
Sites.Selected). No per-user tokens are stored.
Owners and admins add sources from the Connectors page of the customer portal, can pause a source or trigger a sync, and see run history. Each source maps to exactly one context in your org.
What gets searched
Plain text, Markdown, CSV, JSON, HTML, Google Docs, Slides and Sheets (first tab only), and Word, PowerPoint and Excel files. PDFs and unsupported types are recorded as skipped rather than failing the sync; PDF text extraction is not available yet.
Results from a synced file include a source object
(provider, url, document_id,
chunk_index, version, synced_at).
update_thought and delete_thought refuse these
thoughts, since the connector owns the content.
Anyone who can access the mapped context can find the synced content,
regardless of who could open the original file. Map sensitive sources to a
restricted context and grant it deliberately. Per-document
permission mirroring is not available yet.
AI distillation and credits
Optionally, per organization, a connector can distil each document into focused notes with topics and people instead of storing raw chunks. This is off by default. It uses AI model calls, which are metered per organization and debited from a prepaid credit balance (1 credit = £1). When the balance reaches zero, distillation pauses and resumes once credits are added; plain chunk syncing is never affected. Credits are currently added by our team on request. Each org also has a monthly cap on synced chunks and a cap on the number of sources.
Data residency
Set per organization at creation, and fixed after that:
europe-west1us-central1asia-northeast1
Each is a genuinely separate deployment, not a latency fan-out — the same three regions our sibling product at dfens.ai uses.