Privacy: what the NativeBIM IFC server sends, and what it keeps
This covers nativebim-mcp, the NativeBIM MCP server for IFC models. It describes what the server software sends and stores. How featureboard.ai stores what it receives is covered by the featureboard.ai terms. Where this statement and the software disagree, the software's behavior is what happens, and this statement is corrected.
In short
- Your models, drawings and files stay on your machine. NativeBIM never uploads them.
- NativeBIM sends four kinds of message, all to featureboard.ai:
- daily usage counts;
- automatic failure reports;
- bug reports that you, or the assistant acting for you, write;
- an update check.
- Usage counts, failure reports and the update check do not contain model content, file names, paths, prompts, IFC GlobalIds or element names. A bug report contains the text that you or the assistant type. That text goes through a pattern-based redactor before it is sent. A pattern can miss a value, so a bug report can contain something you did not mean to share (see Bug reports you write).
- License keys are checked on your machine. No network call is made to check a key.
- Every message can be turned off, with two exceptions:
- on a free license, failure reports are a condition of the license;
NATIVEBIM_SANDBOX=1stops all four from leaving the machine.
The four messages
| Message | When | Sent to | Turn it off |
|---|---|---|---|
| Usage counts | once per UTC day, after the day ends | https://featureboard.ai/api/telemetry | NATIVEBIM_TELEMETRY=off, DO_NOT_TRACK=1, or the telemetry setting |
| Failure reports | when NativeBIM itself fails (an internal error, not a refused request) | https://featureboard.ai/api/bugs | the same switches, or setFailureReports(false). Free licenses cannot turn these off. |
| Bug reports | only when bim_report_bug is called | https://featureboard.ai/api/bugs | do not call it, or set NATIVEBIM_BUGS_URL=local |
| Update check | on a session's opening tool call, then at most once every 6 hours while the server is in use | https://featureboard.ai/nativebim/releases/latest.json | NATIVEBIM_AUTO_UPDATE=off |
These three addresses can be changed with NATIVEBIM_TELEMETRY_ENDPOINT, NATIVEBIM_BUGS_URL and NATIVEBIM_UPDATE_URL. Setting the telemetry or bug address to a value that is not a URL, such as local, keeps everything on the machine. Plain http:// is accepted only for addresses on the same machine.
1. Usage counts
There is one message per install, per server process, per UTC day. These are all its fields; the code drops any other field (telemetry/schema.js):
| Field | What it is |
|---|---|
schemaVersion, schema, product, surface, kind | fixed labels: 1, nativebim.usage/1, nativebim, mcp, usage |
id | a random identifier for this message, so a retried upload can be recognized |
install | the pseudonymous install id (see Identifiers) |
day | the UTC date the counts cover |
app.version, app.edition, app.kernel | the NativeBIM version, how it was installed (mcpb, plugin, npm, dev, unknown), and the bundled NativeCAD kernel version if there is one |
os.platform, os.arch, os.node | for example win32, x64, v22.11.0 |
sessions | how many times the server started that day |
tools[] | for each bim_* tool: how many calls, and how many of those failed |
codes[] | for each NB_* error code: how many times it occurred |
licence.kid, licence.tier | only for keys whose terms make usage reporting a condition (the non-commercial free key). These are the key id and the tier. |
Tool names come from NativeBIM's own list. A name outside that list is counted as _other, and an unknown code as _OTHER. Each field must be a fixed value, one of a closed list of words, a whole number, a date, or match a tight pattern, so the message has no field that could hold free text. A test checks this (tests/mcp/telemetry/schema.test.js).
A day's counts are sent after that day ends, when the server is next running. They stay on disk until then, and are written there every 10 minutes and at shutdown. If an upload fails, the message stays on disk and is retried later, with the wait growing from 1 minute up to 6 hours. If the server refuses a message outright, it is deleted. The queue holds at most 120 messages or 1 MB; past that, the oldest are deleted.
2. Failure reports
These are sent when NativeBIM itself breaks: a tool throws an error it did not expect, or returns an *_INTERNAL code. A refused request is not a failure. That covers a bad argument, a missing license or a selector that matches nothing. Fields:
fingerprint: a hash that groups reports of the same failure;class,severity;- the tool name, the
NB_*code and, where the tool gives one, a short reason code made of lowercase letters, digits,_and-; - the error type, for example
TypeError; titleandmessage: made only from the tool name, the error type and the code;stack: up to 12 lines of the program's call stack. Each line keeps only a function name and the name of a NativeBIM.jsfile. Folder names, and the names of any non-code files, are removed;argShape: the names of the arguments and their types, for example{"target":"string","ops":"array[3]"}. Never the values;- versions, edition, OS and Node version;
- a random install id for failure reports (a UUID);
count: how many times this failure happened;reportedAt;- on a free license only, the key id and
tier: "free".
The error message itself is never sent, because messages can quote values and file names. Before sending, each report is checked field by field. Any field without a rule is dropped. The final bytes are checked once more for anything that looks like a path, file name, URL, e-mail, GlobalId, GUID or IFC record, or that matches a name from the open models. If anything matches, the report is not sent.
Limits:
- one report per failure per 24 hours; later occurrences are added to the next report's
count; - at most 30 failure reports an hour;
- unsent reports wait on disk (1 MB at most) and are retried.
Who sends them (the same rule as NativeCAD):
| License | Failure reports |
|---|---|
| Free (self-serve or non-commercial), including a free NativeCAD key used for evaluation | always sent. The off switches do not stop them; they still stop usage counts. |
| Paid, owner, or an evaluation on a paid key | sent unless you turn them off |
| No key | sent unless you turn them off |
3. Bug reports you write (bim_report_bug)
These are sent only when bim_report_bug is called. Fields:
- what was typed: title, description, steps, expected, actual, severity, and which
bim_*tool is involved; context: NativeBIM version, edition, the name and version of the app NativeBIM runs in (as it announced itself when it connected), OS, Node version, kernel version;context.modelCounts: counts only (models, entities, elements, storeys, spaces, types);guard: how many values the redactor replaced, by kind (counts only);contact: your e-mail address, only ifincludeEmail: trueis passed. It is read fromNATIVEBIM_REPORTER_EMAIL;reportedAt;- on a free license only, the key id and
tier: "free".
Before anything is sent, these are replaced in the typed text with [redacted:<kind>]:
- any name NativeBIM knows from the open models: file, project, story, space and element names, and the folder names in the paths of the open files;
- the account name, home-folder name, host name (whole, and the part before its dot) and working-folder name of this machine, and each word of four letters or more in an account or home-folder name made of several words (
Jane SmithgivesJaneandSmith). Names that are ordinary words, such asUsers,Documentsoradmin, are left in place; - file paths and file names, including folder and file names that contain spaces;
- URLs and e-mail addresses;
- IFC GlobalIds, GUIDs and Revit UniqueIds;
- raw IFC records such as
#45=IFCWALL(...), including a record that wraps over several lines; - license keys.
Names are replaced before the pattern rules run, longer names before shorter ones, so a known path or file name goes as a whole. These are pattern-based rules. They can miss a value, for example a name that is not in the open models and does not look like a path, file name, identifier or key, or the leading words of a file name with spaces that is typed in a sentence rather than as part of a path. The rest of the text is sent as typed. Do not paste model content or prompts into a bug report.
A report may carry a small repro, such as a few lines of IFC, only with your consent. When your AI app supports MCP elicitation, NativeBIM asks you directly (showing what would be attached) and your answer decides; otherwise the assistant must pass reproConsent: true with it. That is the one way model content can reach us, and it is your choice. Paths, file names, URLs, e-mail addresses, license keys and this machine's names are still replaced in it; IFC records, GlobalIds and model names are kept, because they are the repro.
Limits:
- the same report twice within 10 minutes is filed once;
- at most 6 reports an hour; more are queued and sent later;
- a report that cannot be sent is queued and retried.
A copy of every report, after redaction, is kept in ~/.nativebim/bugs/bugreports.jsonl. The receipt shows that location with your home folder written as ~ (%USERPROFILE% on Windows), so the assistant does not see your account name; the file itself sits at the full path on your disk. The receipt gives the report id. Quote it to support@featureboard.ai.
4. Update check
This is a request for the public file latest.json, at most once every 6 hours while the server is in use. The request has no body and no identifiers. Other requests happen only when something changed:
- the new release, when an update installs;
- the signed revocation list, when its contents change.
Whether this install is in a staged rollout is decided on the machine, from a random id in ~/.nativebim/update/state.json. That id is never sent. A release installs only if:
- its manifest is signed with NativeBIM's release key;
- the download matches the published checksum;
- no tool call is running.
NativeBIM keeps the previous version and goes back to it if the new one fails to start three times.
License checks
Keys (CSLV1-...) are checked on the machine. No network call is made to check one.
NativeBIM looks for a key in three places:
NATIVEBIM_LICENSE_KEY;~/.nativecad/license.json, NativeCAD's file, which NativeBIM reads but never changes;~/.nativebim/license.json, written bybim_license activateand readable only by you (mode 0600).
The key itself is never sent anywhere and never written to a log. The key id is the last 16 characters of the key. It is shown in bim_license status and is sent only where this page says so. featureboard.ai issued the key, so it can match a key id to the license it issued.
The list of revoked key ids is signed. NativeBIM reads it from disk. If the list is missing or out of date, no key is blocked because of that.
What is never sent
- Model content: IFC entities, geometry, coordinates, property values, drawings, schedules. The only exception is a
reproyou attach with consent. - File names and file paths.
- Prompts, and anything else you or the assistant typed into a tool call. Bug reports are the exception: what you type into
bim_report_bugis sent, after the pattern-based redactions described above, which can miss a value. - IFC GlobalIds, GUIDs, element, space, story and project names.
- Tool arguments (only their names and types, in failure reports), tool results, and error messages.
- Your license key, your name or e-mail. The one exception is the e-mail, sent only when you pass
includeEmail: truewith a bug report.
Identifiers
| Id | What it is | Where it is sent |
|---|---|---|
| Usage install id | 20 characters, derived on the machine from a salted one-way hash of the Linux machine id (/etc/machine-id or /var/lib/dbus/machine-id) or, elsewhere, of host name plus user name. The hash is one-way, but the salt is public, so someone who already has a guess at your host name and user name can check it against the id. The id is pseudonymous, not anonymous. It does not match NativeCAD's id for the same machine. To pin or reset it, write any 20 lowercase letters or digits to ~/.nativebim/telemetry/install-id. | usage counts |
| Failure-report install id | a random UUID, kept in ~/.nativebim/bugs/install-id | failure reports |
| Update install id | random, kept in ~/.nativebim/update/state.json | never sent |
| Key id | the last 16 characters of the license key | usage counts and failure reports, only for the free keys described above |
What stays on your machine
Everything is under ~/.nativebim/, or under the folder named by NATIVEBIM_STATE_DIR (or its alias NATIVEBIM_HOME) if either is set; NATIVEBIM_STATE_DIR wins when both are. You can delete any of it.
| Path | Contents |
|---|---|
license.json | the key you activated |
revoked.json | the signed list of revoked key ids |
telemetry/ | install-id; counts-<pid>.json (today's counts); spool.jsonl (messages waiting to be sent); state.json (retry timing); settings.json (your choice to turn things off) |
bugs/ | bugreports.jsonl (your reports after redaction, up to 2 MB plus one older file); spool.jsonl (reports waiting to be sent); state.json (limits and grouping); install-id |
update/ | state.json, cache.json (the last latest.json), release-keys.json |
install-backups/ | the previous version, kept so an update can be undone |
audit/ | audit.jsonl, the edit audit log (see below) |
The audit log is a local record of every committed edit, undo, redo and IFC save, so a professional can show what was changed and when. Each line holds the time, the tool name, a hash of the edit instructions (not the instructions), a label for who made the change (NATIVEBIM_AUDIT_ACTOR, or local; your account name is not read), the server process id, the hash of the model file before and after, counts of records added, changed and deleted, the validation result, tool versions, and the message you gave the edit with paths, file names, e-mail addresses and IFC ids removed. It holds no file contents, element names, file names or paths. Lines are chained by hash so an edited or removed line can be detected. Nothing in it is ever sent: the update check, usage counts and bug reports do not read it. The design-log export writes it to a file you choose. Keep it as long as you need to; NativeBIM never deletes it, and turning telemetry off does not touch it.
Turning usage counts off with the telemetry setting also deletes the waiting messages, the counts and the install id.
Turning things off
| Setting | Effect |
|---|---|
NATIVEBIM_TELEMETRY=off (also 0, false, no, none) | no usage counts. No failure reports, except on a free license. |
DO_NOT_TRACK=1 | the same |
CI set to any true value | the same. Automated test runs are never counted. |
NATIVEBIM_TELEMETRY_ENDPOINT=local | counts are kept on the machine and never uploaded |
NATIVEBIM_BUGS_URL=local | bug and failure reports are only saved on the machine |
NATIVEBIM_AUTO_UPDATE=off | no update check |
NATIVEBIM_SANDBOX=1 | nothing leaves the machine. Reports wait on disk until a later run without the sandbox. |
When NativeBIM is started by its own test suite (node --test), nothing is reported unless NATIVEBIM_TELEMETRY=on is set, and then only to an address on the same machine.
A server started with usage counts turned off writes no telemetry files at all.
Notices
NativeBIM is licensed software. It does not provide design, engineering or other professional services. Outputs are drafts for review by the licensed professional of record.
Sheets are marked NOT FOR CONSTRUCTION by default. Areas are computed by NativeBIM, not a certified BOMA measurement.
Revit is a trademark of Autodesk, Inc. NativeBIM is not affiliated with, endorsed by or sponsored by the companies and organizations named here. Product names and marks belong to their owners.
Telemetry (usage counts and failure reports) never includes models, drawings, file names, paths or prompts. Bug-report text goes through a pattern-based redactor that can miss a value, and a short repro goes with it only if you choose to attach one. NativeBIM sends daily usage counts, automatic failure reports, bug reports and an update check every 6 hours to featureboard.ai; the privacy statement lists every field. Security and privacy · privacy statement.
NativeBIM is provided as is, without warranty of any kind. To the extent the law allows, FeatureBoard Labs Incorporated is not liable for indirect, incidental or consequential damages, lost profits or lost data, and its total liability is limited to the license fees paid in the 12 months before the claim. Read the license.