Skip to content

Unstructured Data in Construction: Emails, Notes and PDFs

Three routes from an inbox and a folder of PDFs to a table you can filter: a mail connector, an MCP server and a script, with the security rules for each.

Most information in a project never makes it into the BIM model or a spreadsheet. It sits in emails, meeting notes, manufacturers’ PDFs and drawings that someone once sent as an attachment. The model is organised, but the decisions that shaped it are scattered across the inbox.

Until recently, the only sensible option was to copy everything out by hand. Today, a small practice has three real options: a connector to an email account, an assistant with an MCP server pointed at a folder, or an automation in n8n or your own script. No Revit and no need to build your own product.

In this post, I will show you:

  • what unstructured data is,
  • three approaches: an inbox connector, MCP on a folder, and n8n or a script,
  • what each approach can and cannot do, and what it costs,
  • a complete workflow using one example, extracting parameters from correspondence,
  • what to do with the result: tags, a knowledge base and templates,
  • how to work on copies and avoid sending more than necessary to the model,
  • the risks that remain even when the tool works.

If you collect information from meetings rather than emails, first take a look at the post about summarising meetings with AI. The mechanism is the same. First, organise the source, then ask the model to structure it.

What unstructured data means in construction

Structured data is made up of parameters that have a place of their own. The airflow in a selection sheet, the thickness in an envelope table, the date in a programme. Each value has a column, a unit and a person who entered it.

Unstructured data is everything else. The content of agreements, the reason for a change of concept, the condition under which a contractor agreed to a solution, a comment raised halfway through a sentence in the fourth email of a thread.

This remainder is usually most of the information in a project and the smallest part of the data that can be searched. A language model handles it better than a conventional script because it does not need a predefined pattern. It can read a paragraph and extract five fields, even if the paragraph is worded differently each time.

Without an output schema, however, you will get a neat summary that nobody can turn into a schedule. In this work, the schema matters more than the model itself.

Three approaches and one shared logic

All three options do the same thing. The model receives text, rules and a schema, then returns a result that can be pasted into a spreadsheet. The first approach reaches into the inbox through a connector, the second reaches a folder through MCP, and the third runs without you in n8n or in a script.

One thing needs correcting, because the opposite claim is circulating online. MCP is not a feature belonging to one provider. It is an open protocol supported by Claude Desktop, Claude Code, the ChatGPT app, Codex CLI and other clients. The difference between them is in the interface, permissions and price, not in the protocol itself. If you want to see what this looks like in practice with engineering tools, I have a separate post about MCP for AutoCAD, Revit, Word and Excel.

Approach one: a connector to your email inbox

A connector is a ready-made link between your assistant account and your inbox. You do not export files or configure a server. You sign in with OAuth, approve the access scope and the model sees what your account can see. Permissions are inherited. If you do not have access to a thread, the model will not get it either.

I show how AI works with email in this video:

Claude: Gmail and Microsoft 365

In Claude’s account settings, there is a Connectors section. The Gmail connector can search your mail and answer questions with citations that lead to specific messages. It is read-only: Claude does not create, send or change emails. It is available on the Pro, Max, Team and Enterprise plans.

The Microsoft 365 connector covers Outlook, SharePoint, OneDrive and Teams. According to Anthropic’s documentation, it works with every Claude version, provided you sign in with a work Microsoft account and the tenant administrator approves consent in Entra. Write actions are disabled by default.

ChatGPT: Outlook, Gmail and calendars

The Outlook Email and Outlook Calendar apps connect to your Microsoft inbox and calendar, while the Google apps provide access to Gmail and Calendar. The scope of actions depends on the account permissions, Microsoft Entra administrator consent and workspace settings.

You can search messages with filters such as sender, subject and date, summarise threads and extract a task list. With Gmail or Outlook connected, ChatGPT can also prepare and send an email, which requires a deliberate decision. On Business and Enterprise plans, an administrator can disable write actions, and on Enterprise they can exclude messages with sensitivity labels.

Copilot in Outlook

This is the option for practices that already work in Microsoft 365. Copilot reads a thread in Outlook and summarises it at the press of a button, without connecting anything external. It requires a Microsoft Copilot for work licence: 30 dollars per person per month with annual billing, or 31.50 with monthly billing. For businesses with up to 300 users, there is a Copilot Business add-on for Microsoft 365 Business plans.

What this approach can and cannot do

It can answer questions about a thread without an export, find agreements scattered across the inbox and point to the source of each statement. In five minutes, you can check whether the model understands your correspondence.

It will not process a folder of PDFs or drawings that did not arrive by email. It will not run a batch with a repeatable schema, and it will not start without you. A question about the whole inbox can easily be too broad, because the connector does not understand the idea of just this one thread.

The cost of this approach is the plan price. There is no separate connector fee. Claude Pro costs 20 dollars per month, or about 17 with annual billing. ChatGPT Plus costs 20 dollars. Copilot in Outlook costs 30 dollars per person.

Steps for a first test

First, set up a demonstration inbox with fictional emails about one project. Then connect the connector and check that it can see only that account. Finally, ask a question using an output schema and verify two random citations.

SCREENSHOT 1 to insert: W44-01-claude-connectors.png. Frame: connector settings in Claude with Gmail and Microsoft 365 connected and, next to it, the app list in ChatGPT. Caption: “A connector takes one sign-in: Claude and ChatGPT can see the inbox without exporting files”.

SCREENSHOT 2 to insert: W44-02-claude-cytat-z-maila.png. Frame: Claude’s response with a parameter table and a visible source citation beside two rows. Caption: “Every row has a source citation, so you can check which email a parameter came from”.

Approach two: an MCP server on a folder of copies

A connector reaches your inbox, but not a folder of PDFs or files on a USB drive. For those, you need an MCP server, a small programme that exposes a set of functions to the model. The simplest option is the official @modelcontextprotocol/server-filesystem file server. You give it a list of directories, and it can read and write only within those directories.

I show how ChatGPT reads documents and builds a knowledge base in this video:

This is also the most important safeguard for this approach. The server cannot see the disk; it can see only the directory you point it to.

Configuration in Claude Desktop and Claude Code

In Claude Desktop, you install servers from the extensions directory in settings or through the claude_desktop_config.json file, which is in %APPDATA%\Claude on Windows. In Claude Code, one command is enough. The user scope means the server works in every folder, project writes an entry to the repository, and local limits it to the current project. You need to restart the session after adding it.

"mcpServers": {
  "pliki-projektu": {
    "command": "npx",
    "args": [
      "-y",
      "@modelcontextprotocol/server-filesystem",
      "D:\\ROBOCZE\\W44-przyklad"
    ]
  }
}

Separately, on claude.ai, you can add your own connector to a remote MCP server. It works on all plans, and the free plan allows one such connector. The server must then be publicly reachable over HTTPS.

The same configuration in the ChatGPT app and Codex

The mechanism is the same, only the client is different. The ChatGPT desktop app, Codex CLI and the editor extension use the shared ~/.codex/config.toml file, so you configure the server once and can see it in each of these places. You can add the server in the app settings or with the codex mcp add command. Check the list with codex mcp list, and use codex mcp login for a server that requires OAuth login. In the web version of ChatGPT, you can add custom MCP servers in Business and Enterprise workspaces.

[mcp_servers.pliki-projektu]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "D:\\ROBOCZE\\W44-przyklad"]

What this approach can and cannot do

It can read files in an authorised directory, extract text from PDFs, generate CSV and XLSX files, process multiple files in one run and, in Codex, also write and improve scripts. It can combine the inbox, a folder and a spreadsheet in one task.

It does not work without you and will not start at six in the morning when a new email arrives. There is no shared log for the whole practice. With a larger number of files, you end up clicking approvals until you are sick of it, and that is the most common reason people stop using it. Codex cannot reach your inbox without an MCP server, so you have to export the correspondence first.

The server is free and open source. You pay for the model: Claude Pro at 20 dollars, Max from 100, or ChatGPT plans, namely Go at 8, Plus at 20, and Pro from 100 dollars. A model accessed through an API is billed separately, by token.

SCREENSHOT 3 to insert: W44-03-codex-mcp-list.png. Frame: a terminal showing the output of the codex mcp list command and two servers with their connection status. Caption: “The same MCP configuration works in the ChatGPT app and Codex, without repeating the setup”.

Approach three: n8n or your own script

The first two approaches are interactive. Nothing happens unless you are at the computer. The third is meant to run by itself, for example, to read new messages and add rows to a spreadsheet.

In n8n, you build this from ready-made components: an email trigger over IMAP, an AI agent node and a spreadsheet write step. n8n can also expose its workflow as a tool for other clients through MCP. The Community version is free and runs locally, for example in Docker on a computer in the office. In the cloud, the Starter plan costs 20 dollars per month with annual billing, and Pro costs 50 dollars.

A script is the option for people who prefer a text file to dragging nodes around. A few dozen lines of Python: connect through IMAP, extract the content, call a model through an API and save to CSV. You use libraries for PDFs. pdfplumber and Docling are licensed under MIT, while PyMuPDF is under AGPL, so check this if you publish the tool externally.

What this approach can and cannot do

It can run without you, at a scheduled time or when a new email arrives. It leaves logs, so you know what was processed and when. It handles a volume at which manual approval no longer makes sense.

It does not forgive mistakes. A script that misidentifies a unit will keep doing the same thing every day for six months. It requires maintenance: a change to the email format, a new type of PDF, an expired application password. You are responsible for errors, not the model provider.

n8n Community and your own script cost zero zlotys for the tool itself, plus electricity and a computer you already have. There is also the model cost: either API tokens or nothing if you use a local model on your own equipment.

SCREENSHOT 4 to insert: W44-04-n8n-workflow.png. Frame: an n8n canvas with four nodes in one line, from the email trigger to a notification. Caption: “An n8n process: new email, parameter extraction, add a row to the spreadsheet”.

Decision table: which approach suits which practice

Prices checked on 20 October 2026, excluding tax. They may change, so confirm them with the source before making a decision.

ToolInbox without exportFiles on diskRuns without youMonthly cost
Claude with connectorsGmail, Outlook and Microsoft 365through MCPno20 dollars (Pro), Max from 100
ChatGPT with appsGmail, Outlookthrough MCP in the appno20 dollars (Plus), Pro from 100
Copilot in OutlookOutlook, work accountnono30 dollars per person
Codex CLIthrough MCPyesno8, 20 or from 100 dollars
n8nIMAP or Graphyesyes0 (Community) or 20 and 50 dollars
Your own scriptIMAP or GraphyesyesAPI tokens at the published rate

If you do not want to read the table, one question is enough. Where is the problem?

  • The agreements are in emails, and you need the result today. A connector. The shortest route to a first test.
  • The material is PDFs, drawings and folders. MCP. Choose a client you already pay for.
  • The process needs to run by itself, without you. n8n or a script, but only after several successful manual batches.
  • The practice uses Microsoft 365 and does not want new accounts. Copilot in Outlook, if you already have the licence.

Security: work on copies and use the minimum data

The most important rule is dull. Never work on the originals and never start with client data. Do your first test on your own correspondence or on a demonstration inbox with fictional emails. Only once you know how the model makes mistakes should you move the process to company material, and even then, work on a copy.

The second rule is least privilege. Give the file server one directory, not the whole disk. Set up a separate test account with an application password and no permission to send, so the worst-case scenario ends with reading. In connectors, the model can see everything the account can see, so either connect a test account or narrow each question to a thread, sender and date.

  • Keep the structure: an input directory with copies, a working directory for results, and originals that are read-only.
  • Name files so the date and thread are visible without opening them, for example 2026-10-14-uwagi-wentylacja.txt.
  • Remove anything the model does not need: signatures, phone numbers, private addresses and personal data in the footer.
  • Replace names with roles: Client, Designer, Contractor, Building A. That is enough for the model, and it makes the document less sensitive.
  • Keep API keys in environment variables, never in the task text or a file the model reads.
  • Check your account settings to see whether conversations are used to train models and whether you can disable retention.

The third rule is traceability. Every result row needs a source column, with the file name and a short quotation. Without it, after a month nobody will be able to reconstruct which email was the basis for a parameter.

There is also the formal side, and that differs between providers. OpenAI does not train models on data from Business, Enterprise and Edu apps by default, while in Free, Go, Plus and Pro it may use the data if model improvement is enabled. On consumer plans, Anthropic may retain de-identified conversations for up to five years when model improvement is enabled, while business products have separate rules. If the material contains personal data, you need a legal basis for processing and a data processing agreement.

SCREENSHOT 5 to insert: W44-05-folder-kopie.png. Frame: File Explorer with a parent folder and three subfolders, 01-wejscie, 02-robocze, 03-oryginaly, and the read-only attribute visible. Caption: “Copies in a separate directory, originals read-only, results in a third folder”.

A step-by-step example: parameters from correspondence

Take a case from everyday work. For three weeks, we exchange emails about selecting an air handling unit. The agreements are scattered. The airflow is somewhere, the available static pressure somewhere else, an acoustic condition elsewhere, and one decision changed after comments from the architect. At the end, we need to turn it into a parameter table.

  • Find the material. Ask the connector for the thread by sender, subject and date range. Ask for a list of messages, not a summary, so you can see how much source material there is.
  • Define the output schema. Columns: building, room, parameter, value, unit, source, date, author, confidence, to check. Ten columns, no more.
  • Prepare the rules. Missing data means an empty field, not a typical value. Always put units in the column next to the number, without conversion. Every row needs a source quotation.
  • Run it on three messages. Three are enough to see how the model handles your language and email format.
  • Compare it with a manual reading. Extract the parameters from those three messages yourself and compare them row by row. You cannot skip this step.
  • Improve the rules, not the result. If the model confused a unit, add a rule about units. Fixing individual rows does not help with the next batch.
  • Move it to a folder of copies. Once the schema holds up, export the thread to files and do the same through MCP so the result is repeatable. Rows without a quotation go for manual review.

The prompt for extracting data looks unremarkable, because all its power lies in the schema and prohibitions:

Read the file and extract the ventilation parameters.
Return a CSV table with these columns:
building, room, parameter, value, unit,
source_quote, date, author, confidence, to_check

Rules:
1. Do not guess. Missing data means an empty field.
2. Copy units as they appear in the source, do not convert them.
3. In source_quote, paste the part of the sentence from which you took the value.
4. confidence: high, medium, low.
5. If an agreement changes in the thread, keep both rows
   and enter "agreement changed" in to_check.
6. Do not add columns or comments outside the table.

After the first run, it usually turns out that the problem is not the model, but the source. The same parameter appears in three versions, one message answers a question from two weeks earlier, and the most important decision was made in a phone call. The model will not fix that. It will only show you where a document is missing.

If the schema stabilises and the same type of correspondence returns every week, move from a connector or MCP to n8n or a script. A person checks the low-confidence rows, while the rest happens automatically.

SCREENSHOT 6 to insert: W44-06-wynik-csv.png. Frame: a spreadsheet with a results table, 6 to 8 rows, one row with low confidence and the entry “agreement changed”. Caption: “A result with source and confidence columns: uncertain rows go for manual review”.

What to do with the result: tags, a knowledge base and templates

A parameter table is not the end of the work. If it stays in the downloads folder, nobody will use it after two months. The result is useful only when you can find it and repeat the process.

Tags: columns that bring order

I do not mean labels in a system, but three columns in the table itself. Building or room, so you know what the row is about. Parameter type, for example airflow, acoustics or controls. Status, meaning whether the value is confirmed or waiting for a decision.

These let you filter the result without reading it all. All unconfirmed items for one room are one click away, rather than half an hour of searching through correspondence. It is worth using the same three columns in every table you make for a project, because then you can compare results from different weeks.

A knowledge base that is not just another folder

The second step is a place where the result can stay for longer. The simplest option is one file per project, with the date in the name and a short note about what was established in that run. This is not about building an archive. It is about being able to answer, six months later, where a particular value came from.

It is also worth keeping what the model did not find. A list of missing documents is often more valuable than the finished table, because it shows which agreements do not exist in writing at all. If you keep a knowledge base in Obsidian, I described the same mechanism in the post about building a knowledge base for Claude Code and Codex.

Templates: save the prompt once

The third step is the simplest and gives you the most. Save the prompt that worked as a template, together with its column schema and rules. For the next project, do not write it from scratch, just change the type of parameters.

After a few weeks, you will have a set of templates: ventilation parameters, meeting agreements, drawing comments, delivery schedules. Each uses the same schema and different fields. I wrote more about ready-made prompts for engineers in a separate post about prompts that genuinely speed up work.

That is the whole difference between a one-off experiment and a process. You do not need an implementation or a new department. You need three columns, one file and a saved prompt.

Limitations and risks that remain

The biggest risk is not technical. A language model makes mistakes that look plausible. It might copy 1200 m3/h as 1200 m3/s, miss a decimal point or add a unit that was not in the source. In the table, it looks like any other row, which is why the quotation and confidence columns are not decoration.

  • Number and unit hallucinations. A person must review every row that goes into project documentation.
  • Sending an email from chat. With Gmail or Outlook connected, ChatGPT can send a message. If you do not want that, disable write actions or work with a test account.
  • Prompt injection in email content. Someone else’s text may contain a sentence addressed to the model. Treat email content as data, not an instruction, and do not give the agent permission to send.
  • Token costs at scale. A thousand emails can create a bill that you need to calculate before running the process, not afterwards.
  • Scans without a text layer. Some PDFs are images. Without OCR, the model will receive nothing and either invent an answer or leave it blank.
  • No versioning. A result overwritten three times stops being evidence. Keep dated output files or use a repository.
  • Dependence on the provider and region. Prices, limits and app availability change several times a year, and some features do not work in every country.
  • Responsibility remains with a person. An engineer signs off on the project, not an agent.

Conclusions: where to start on Monday

The approach depends on where the problem is, not on which tool has better marketing. If agreements are in emails and you want a result the same day, start with a connector. Claude with Gmail or Microsoft 365, ChatGPT with Outlook, or Copilot in Outlook if your company has Microsoft licences. Test it with a demonstration inbox.

If the material is PDFs, drawings and folders, you need MCP. Choose a client you already have. Claude Desktop or Claude Code if you pay for Claude. The ChatGPT app or Codex if you pay for ChatGPT. The protocol is the same, so the configuration transfers between them.

Introduce automation, meaning n8n or a script, only once the output schema has stayed unchanged for several batches and low-confidence rows are a minority.

The greatest benefit is not the time saved copying things out. It is seeing how many agreements exist only in emails. That is usually the most uncomfortable discovery and the best reason to start.

If you want to see how an agent works with a spreadsheet rather than text, I have a separate post about connecting Codex to Excel.

Check also:

This article was created with the help of artificial intelligence.

Paweł Kińczyk
Paweł Kińczyk
Articles: 180

Newsletter

Chcesz być na bieżąco? Zapisz się do newslettera!

Leave a Reply

Your email address will not be published. Required fields are marked *