# Historis
> Historis is the memory of your business: an event-based CRM that keeps
> who, what, when, written by whom - every entry dated and signed.
> Everything lands in one shared timeline, linked to the right people,
> and your assistant reads and writes it over MCP. Ask for the brief:
> what happened, what you should know, what needs handling.
## MCP Server
- Endpoint: https://api.historis.app/mcp
- Transport: Streamable HTTP
- Auth: OAuth 2.1 with PKCE (automatic)
## Capabilities
- Capture, update, delete, and search events (deadline filters included)
- Manage persons (clients, suppliers, partners) and their tags
- Tag-based organization with auto-classification rules
- Daily brief: overdue, due today, upcoming, and stale events in one call
- Organization and per-person context briefings for agents
- Batch operations (bulk create, batch status update, close loops)
## Tools
- get_organization_context: Cold start briefing for an agent: organization, members, teams, frequent tags, active rules digest, dashboard stats, recent activity.
- manage_organization: Write org-level context that get_organization_context reads back: set_description; set_team_context; set_member_context.
- get_daily_brief: Agent morning brief: one structured snapshot of what needs attention today, over the org's visible events.
- get_person_context: Full context for a person: identity, tags, open events, recent closed events, summary stats.
- create_event: Capture an event in Historis.
- search_events: Search and filter events.
- manage_event: Single-event operations via `action`: get; update; delete; add_update; link_events; link_person; link_tag; thread; batch_update_status; close_loop.
- bulk_create_events: Batch import up to 50 events from a JSON-encoded array.
- search_persons: Discover contacts by full-text search across ALL their descriptive fields and/or by the relationship graph.
- search_or_create_person: Find a person by name, optionally email; create if not found.
- bulk_create_persons: Batch-create up to 50 contacts from a JSON-encoded array -- the fast way to populate Historis when the user lists several people or pastes a contact list, instead of N search_or_create_person calls.
- manage_person: Person operations via `action`: update; delete.
- manage_relationship: Contact-to-contact links via `action`: list; create; update; delete.
- manage_tags: Tag operations via `action`: list; analyze_duplicates (detects pairs likely to be merged via plural form or diacritic/dash-insensitive equality by default; include_fuzzy=true also suggests Levenshtein distance ≤ 2 matches, which may be different words and need human review — capped at 50 pairs; pairs the user kept separate are excluded; each candidate's `similarity` is one of "plural", "normalized-equal", or "edit-distance:N" — not a numeric score); update; merge; keep_separate.
- find_applicable_rules: Search the org's markdown rules relevant to a draft event.
- manage_rules: Markdown rule operations via `action`: list; get; search; create; update; toggle; delete.
- search_knowledge: Search the organization's knowledge notes -- full-text always, plus a semantic branch fused with the full-text results when a query_embedding is supplied.
- manage_knowledge: Durable knowledge notes via `action`: get; create; update; archive; link / unlink; supersede.
## Example
Ask your assistant: "Brief me: what is overdue, what is due today, what needs
attention?" - the agent calls get_daily_brief and gets overdue, due-today,
upcoming, and stale events in a single response.
## Pages
- Home: https://historis.app/ - the memory of your business: product overview and pricing (Free, Pro, Business)
- Docs: https://historis.app/docs - getting started, connect your assistant, MCP tools reference, FAQ
- Knowledge memory: https://historis.app/docs/knowledge - durable Markdown notes (decision, reflection, observation) your AI reads and writes over MCP: linked to contacts, injected into agent context automatically, full-text plus optional bring-your-own-AI semantic search
- MCP search reference: https://historis.app/docs/mcp/search-events and https://historis.app/docs/mcp/search-persons - full contracts for the two search tools (every parameter, response schemas, copyable examples)
- MCP setup guide: https://historis.app/mcp - how to connect Claude, ChatGPT, or Cursor (docs page, not the endpoint - MCP clients connect to https://api.historis.app/mcp)
- Security: https://historis.app/security - how Historis secures your data (separation of intelligence and storage, OAuth 2.1, multi-tenant isolation, EU hosting, GDPR)
- French versions: https://historis.app/fr and https://historis.app/fr/docs
- MCP Registry entry: io.github.SvenLC/historis (https://registry.modelcontextprotocol.io/v0/servers?search=io.github.SvenLC/historis)
## Freshness
Every response from https://historis.app names the deployment that served it:
the x-build-time and x-build-id response headers, mirrored as
and in the page head so the
stamp survives an intermediary that caches the body and drops the headers.
Requests proxied to the API (/api/, /openapi.json, /oauth/, /.well-known/)
carry the website's stamp, not the API's - the API deploys separately.
Content dates are separate from the build: the lastmod values in
https://historis.app/sitemap.xml date each page, and every blog post carries
article:published_time plus a BlogPosting dateModified (article:modified_time
appears once a post has been revised). Those two are comparable per URL - a page
whose own dates are older than its sitemap lastmod is a cached copy, so refetch
it from the origin.
## Blog
Notes on how Historis works and the choices behind it. Index: https://historis.app/blog (French: https://historis.app/fr/blog).
- https://historis.app/blog/knowledge-notes - Knowledge notes: the durable home for what your business learned (decisions with their reasons, hypotheses, field facts), tagged and linked to contacts and events, never deleted but archived or superseded, searched by full text always plus optional semantic ranking from your own embedding worker.
- https://historis.app/blog/teach-your-assistant - Teach your assistant how you work: a fact about a contact goes in a note, a behavior you want repeated goes in a rule (per-organization markdown your assistant retrieves before it acts), so a new session or a different assistant reads the same instructions.
- https://historis.app/blog/track-customers-without-spreadsheet - Why customer spreadsheets go stale and the timeline method that replaces them.
- https://historis.app/blog/mcp-crm-setup - Connecting your AI to your client file takes one address and five minutes, no code.
- https://historis.app/blog/customer-record - What a shop's customer record should hold: four blocks sized by GDPR data minimisation, the 30-second note after each visit that keeps the record alive, the CNIL rules on free-text comments, and when to move past the spreadsheet.
- https://historis.app/blog/gdpr-customer-records - GDPR for a shop's customer file, grounded in real CNIL decisions: legal bases (consent only gates marketing email), the CNIL retention benchmarks (3 years for prospects, relationship plus 3 years for customers, 10 years for invoices), entries that are banned outright, and the register small shops still owe.
- https://historis.app/blog/memory-not-points - Why a kept, dated client history out-retains a points card for an independent shop: the real sources behind the famous retention statistics, the loyalty industry's own saturation data, and the six kinds of entries worth writing down.
- https://historis.app/blog/todoist-vs-historis - Todoist vs Historis: a task manager tracks what to do but has no concept of a person, so client history never accrues anywhere; Historis tracks people and the events tied to them, and its MCP server lets an AI read and write that history, not just check off tasks.
- https://historis.app/blog/one-client-one-record - One client, one record: why the AI resolves people by email first - the address is the identity key (unique per organization at the database), a name match can enrich but never override, and a bare name that resembles an existing contact comes back as a question instead of a blind create.
- https://historis.app/blog/events-not-tasks - Events, not tasks: an event-based CRM records what happened, dated and tied to a person, and keeps it - the team and its AI assistants write to one shared timeline that accumulates into the company's memory.
- https://historis.app/blog/bring-your-own-ai - Bring your own AI: Historis runs no model server-side; you connect your own assistant over MCP, up to a fully self-hosted open-source model, so client data never reaches a third-party AI for inference (sovereign inference + EU storage; no on-premise).
- https://historis.app/blog/mcp-search - How search works over the MCP: Postgres full-text search, visibility-scoped before it runs, immediately consistent, keyset-paginated and relation-aware, returned as compact payloads an agent reads in one call.
- https://historis.app/blog/tenant-isolation - How the multi-tenant agent surface stays leak-proof: a token reaches only its own org's data, enforced at the database (SECURITY DEFINER visibility RPCs, session-bound identity, write-side policies) and re-verified by CI on every release.
- https://historis.app/blog/deterministic-writes - Why letting an AI write is safe: every write is idempotent, attributable, reversible (delete is destructive but explicit), and bounded - enforced by unique indexes, triggers, policies, and a quota, not by good intentions.
- https://historis.app/blog/rules-without-server-ai - Rules with no server-side AI: rules are markdown you write; the server matches and returns them by exact, reproducible logic; your own AI interprets and applies them.
- French versions of every post live under https://historis.app/fr/blog/.