Upload a pile of documents once, then ask about them in Claude, ChatGPT or Gemini. Click a claim in the answer and the source document opens in your browser, scrolled to the exact paragraph, table or chart the claim came from, highlighted on the page. No re-uploading, no file limits. See it in action, or try it with your own documents.
People with large document collections hit the same wall in every chat tool: a limit on how many files they can attach, and no memory between sessions. The workaround everyone reaches for is RAG: retrieval over a vector index. That answers the volume problem and creates a worse one. Answers come back citing "this document" with no way to check them.
That is fine if you are asking about a novel. It is not fine if you are pulling a deadline out of a 900-page tender, quoting a payment clause back to a client, copying a number from an annual report into a board pack, or telling a site foreman what the building code says about a fire door. In those jobs somebody eventually asks where that came from, and "the AI said so" is not an answer. Neither is a citation you cannot open and check yourself.
One person. No team, no funding, and other commitments running alongside. Every hour spent on infrastructure was an hour not spent on the thing that makes the product worth using, so most architectural choices were really choices about what I could afford to maintain alone.
docs2mcp is a pipeline that converts documents into structured storage, preserving pages, elements, tables, figures and their positions on the page, then generates embeddings for retrieval. The result is served to AI clients over MCP rather than through a chat window of my own, so Claude, ChatGPT, Perplexity, Gemini or Cursor can all query the same collection. Multi-tenant, with isolation between tenants enforced in the database rather than in application code. Tenant isolation is the technical name for a plain promise: each customer sees their own documents and never anyone else's.
What a user gets is narrower than that description and easier to check. They upload once and ask a question in the AI client they already use. When they click a claim in the answer, the source document opens in their browser at the exact paragraph, table or chart the claim was drawn from, highlighted on the page. Checking an answer takes one click instead of a search through a PDF.
The cheap path is pulling out plain text and chunking it. I kept the full structure instead, so every element knows its page and its position on that page. Conversion takes longer. What it buys is a citation that resolves to the exact table on the exact page, which is the difference between a demo and something a professional will put their name against. Everything the product now shows a user, down to the highlight on the page, is paid for by that one decision.
The promise is that you see your own documents and nobody else sees them. The fast way to keep it is filtering by tenant on every query. That works until the day one query gets written without the filter, and then it fails silently and in the worst possible direction: a customer reads a stranger's documents and nothing on the screen looks wrong. I pushed isolation down into row-level policies in the database instead, so a query that forgets the filter returns nothing rather than returning somebody else's files. It cost a slower start and a fiddlier local setup. It means a bug in my code cannot become a breach.
Ingestion is long-running, expensive, and fails halfway. A queue with retries would have been quicker to stand up and is what I would have reached for with a team around me. I chose durable orchestration so a failed run resumes from its last completed step rather than starting over and paying for the same conversion twice. The deciding factor was not elegance. It was that there is nobody else to nurse a partial failure at night.
docs2mcp.com and pdf2mcp.com are the same codebase, marketed twice. The split is by search intent, not by feature: someone typing "PDF" has a narrower and more urgent problem than someone typing "documents", and a page that says PDF back to them answers it better. The cost is a build step and a separate content file per domain. What it buys is not having to choose between the broad term every competitor is fighting over and the specific one people actually type.
Open to try, pre-launch, in final testing. Upload a document and ask a question without creating an account; anonymous uploads are deleted after 48 hours. The ingestion pipeline and the multi-tenant MCP server are built and running against real documents.
It is not yet in front of paying users, and I am not going to pretend otherwise. This is the part of the timeline where the useful feedback comes from people breaking it, so if you break it I want to hear about it.
docs2mcp.com runs through it if you want to see it working before you touch it. If you would rather skip that, drop your own documents in and ask them something.
I misjudged three costs, and not all in the same direction.
I ran a model locally to keep the bill down while I was working out the pipeline, because that meant reprocessing the same documents over and over. It saved a few hundred euros and cost me more than that in waiting. Every run was slower, so I did fewer of them, at the point in the project where the number of attempts was the only thing that mattered.
I also built the stdio MCP server first, then built the HTTP one properly, which runs locally too. The second made the first redundant. It was a day, but it was a day spent on a step I could have skipped by deciding what I actually wanted before I started.
The third I got wrong the other way. I scoped the product to one document format, telling myself the rest could come later, while modelling the whole pipeline to be format agnostic anyway. When I finally tried other formats they worked with almost no extra effort. The caution cost me nothing to build and something to sell, because I had been describing the product as narrower than it actually was.
It is open. Bring a document, ask it something hard, and tell me where it falls over.