One layer between everything your company knows and every AI that needs it
Connect your database with a read-only query, or any MCP server with its endpoint and two tool names. Contextely condenses each record into a small memory object, links it to the ones it relates to, and remembers where to go for the full text. Then every agent, assistant and script reads from that one place, over MCP, REST or the command line.
500 retrievals a month free, forever. Or run the whole thing on your own hardware with no limits.
Customers trust Contextely
GradeHackJob13JobPlumbLearnawayLedgerageLedgeraryLedgerler
LedgeurLikeWardLugbirdMealaryMeteraryModelCharterPatent77PatientaryPermitBirdPortRobinRenewBirdRotaBayScouternScreen100SourceorySpend7TableHelmThreadCampTrial0UnderhausVouchityWageCoach
WatermarkRemoverProWhy this exists
Connecting AI to company knowledge is an N times M problem
Contextely turns it into N plus M. Connect each source once, connect each tool once, and the layer in the middle is the only thing that has to know about both.
Every tool needs its own wiring to every system
Five sources and five AI surfaces is twenty-five integrations, each with its own auth, its own sync job and its own idea of what a document is. Adding either a source or a tool multiplies the work rather than adding to it.
Each of them re-reads the whole company, every time
The default answer is to stuff a hundred documents into a prompt. That buys latency, a bill that scales with your document count, and a model that confidently averages three contradictory versions of the same fact.
Nobody can say what the assistant was allowed to see
The common design shows the model everything and asks it to redact. A model that has read a salary cannot be relied on not to allude to it, and there is no artefact proving it did not.
How it works
Three steps, and the third one never changes again
Connect what you already have
Point Contextely at a read-only SQL query against your Postgres, Supabase or Neon, or at any MCP server over Streamable HTTP: give it the URL and the names of a list tool and a fetch tool. Those two connectors are the whole surface, and both are configuration rather than an integration somebody has to build for your logo.
What connects todayIt condenses, links and addresses
Each record becomes one small memory object: what is currently true, the entities and topics it is about, edges to the memories it relates to, and the address of the record it came from so the full text is one call away.
What a memory object holdsEverything reads from one place
MCP for agents that speak it, REST for everything else, a CLI for a terminal or a cron job. All three run the same retrieval, so what your assistant sees and what your script sees cannot diverge.
The quickstartThe middle of the diagram
A memory object is a fact, its neighbours, and the address of the original
This is what makes it cheap. Your agent gets three small objects instead of forty documents, and when three is not enough it follows the links or asks for the full record, on purpose, once.
Acme Industrial: renewal terms
Renews 2027-01-31 at $48,000/yr on the Growth plan. Owner Priya Raman. Negotiating a 14 month term for a 6% uplift. Two open commitments: SSO by 2026-10-01, audit-log export by 2026-11-15.
related memory
- 0.78
Q3 churn commitments to Acme
shares acme industrial, renewal
- 0.41
Support SLA by plan tier
shares growth plan
where the full record lives
- source
- crm_postgres
- ref
- accounts/acme-industrial
- cite
- crm.internal/accounts/acme
- ttl
- 900s
- requires
- sales
Illustrative object. Real shape, invented company.
The fact, condensed
One compact statement of what is currently true, written from the record by a model at ingest. This is what goes into your agent's prompt. Not the document, not forty chunks of it.
Links to related memory
Shared entities and topics make an edge. An agent that finds one useful memory walks to its neighbours instead of guessing at a second search query, which is the difference between one round trip and four.
The address of the original
The source, the record's stable reference in it, and a citation URL. When the summary is not enough, the agent asks Contextely to expand it and gets the whole current record back over the same connector. Nothing has to be stored to make that possible.
Every way in
The same retrieval, whichever end you hold it by
MCP, REST and the CLI are one code path with three doors. An agent, a backend service and a person in a terminal all get the same answer with the same entitlement and the same freshness labels on it.
{
"mcpServers": {
"contextely": {
"url": "https://www.contextely.com/api/mcp",
"headers": { "Authorization": "Bearer ctx_sk_..." }
}
}
}curl -s https://www.contextely.com/api/v1/search \
-H "Authorization: Bearer ctx_sk_..." \
-H "Content-Type: application/json" \
-d '{"query":"acme renewal","limit":5}'curl -fsSL https://www.contextely.com/cli.mjs -o contextely && chmod +x contextely ./contextely config set-key ctx_sk_... ./contextely search "acme renewal" ./contextely related <memory-id> # walk to what it relates to ./contextely expand <memory-id> # read the whole record from the source
An API key resolves to a member, not to the workspace. An agent holding Priya's key sees exactly what Priya sees, so “the bot had broader access than the person who deployed it” cannot happen by construction.
An OpenAPI 3.1 document at /api/v1/openapi.json and an llms.txt, both generated from the same tool catalogue the MCP server advertises. They cannot describe an endpoint that does not exist.
The boundary
Who is asking is part of the ranking, not a filter on the answer
Every query carries an asker. Their entitlement scopes are applied as a factor inside the relevance score, so an object they may not see scores exactly zero and leaves the pipeline before a single character of it is read into an answer.
Because scoring runs first, an asker without the right scope never even causes Contextely to re-read that record from your database. That closes a timing side channel a redaction-based design leaves wide open.
const entitlementFactor = entitled ? 1 : 0; const score = relevance * (1 - W + W * freshness) * entitlementFactor; // 0 never ranks
Interactive demo: the Contextely retrieval console. Switch the asker below to see a memory object sealed into a withheld state when they are not entitled to it. Illustrative data.
Ask the workspace
Acme Industrial: renewal terms
refreshed0.912Renews 2027-01-31 at $48,000/yr on the Growth plan. Owner Priya Raman. Currently negotiating a 14 month term in exchange for a 6% uplift.
crm_postgresttl 900srequires salesEngineering compensation bands 2026
fresh0.774Band E4 midpoint 78,000 GBP, E5 midpoint 96,500 GBP. Reviewed 2026-07-02 by the compensation committee. Off-band offers need two approvals.
people_postgresttl 86400srequires peopleQ3 churn commitments to Acme
fresh0.643Two open commitments: SSO by 2026-10-01 and an audit-log export by 2026-11-15. Both tracked against the renewal above.
crm_postgresttl 900srequires sales
Illustrative data. Switch the asker to watch entitlement applied inside the ranking.
Memory objects
5 of 100Acme Industrial: renewal terms
fetched 4s ago
Q3 churn commitments to Acme
fetched 3m ago
Support SLA by plan tier
fetched 2h ago
Northwind pricing sheet v4
fetched 1h 12m ago
Engineering comp bands 2026
fetched 6h ago
One object is past its TTL. The next query that selects it re-reads the record from its source before it answers, rather than serving what is stored.
Never silently stale
Every memory knows how long it is allowed to be believed
A memory object carries the moment it was last read from its source and the TTL that source sets. When a query selects one that is past its window, Contextely re-fetches the underlying record over its connector, re-condenses it, and serves the current truth.
When the refresh cannot be done, because the source is down, the record was deleted, or the month's allowance is spent, the result comes back labelled stale_refresh_failed with the reason attached. There is no branch in this system where an out-of-date fact is served wearing a confident timestamp.
When the source has not changed, the raw payload hashes identically and the TTL clock resets without paying for a re-condensation, which is most of the bill on a real store.
Pricing
Priced on what costs us money, not on your headcount
Free is a real tier, not a demo. Self-hosting has no limits at all.
Free
$0/mo
Enough to wire it into a real system of record and prove it works.
- 1 connected system of record
- 100 condensed memory objects
- 500 retrievals / month across app, API and MCP
- 250 staleness refreshes / month
- Entitlement enforced at retrieval time, by role
- Full MCP server and REST API access
- Self-host it yourself with no limits at all
Contextely Pro
$49/mo
Production volume, near-real-time freshness, and per-scope entitlement.
- 20 connected systems of record
- 10,000 condensed memory objects
- 25,000 retrievals / month
- 25,000 staleness refreshes / month
- TTLs down to 60 seconds for near-real-time working memory
- Per-scope entitlement grants, not just roles
- Retrieval audit log: every query, every entitlement refusal
- 200 members
Full pricing detail, including what happens when you hit a limit, is on the pricing page.
Connect one source. Ask it a question. Five minutes.
No sales call, no pilot, no seat minimum. If it does not earn its place, the whole thing is a Docker image you can run yourself instead.