software refactor your last-century ERP for pocket change

MCP-Access: control Microsoft Access from Claude Code in natural language

🌐 Leer esta página en español →

Microsoft Access is one of those tools almost nobody will defend out loud, and yet half of Spain runs on it quietly: warehouse managers, small-business bookkeeping, dental clinic appointment systems, workshop inventory cards. It works, it's fast, it lives in a single .accdb file you copy onto a USB stick and that's it. The problem is that to do anything moderately advanced you need to know VBA, SQL, form properties, events, controls… hours and hours of fighting it. MCP-Access is an MCP server that connects Claude Code (or Cursor, or Windsurf) directly to Access and lets the AI model create entire databases, forms, tables, queries, reports and VBA code just by talking to it in natural language. The project lives at github.com/unmateria/MCP-Access.

Claude Code session building a database for a bike shop: asked in natural language to set up the ERP, Claude calls the access_create_database and access_create_table tools one by one to build the tbl_Config, tbl_Marcas, tbl_Tallas, tbl_Colores tables and more
A real session building a bike shop's ERP from a plain description. Claude calls the MCP's tools one after another (access_create_database, access_create_table…) and populates the .accdb on the fly.

A heads-up before we go on. This isn't an academic project or a demo. It's a personal MCP I use every day to refactor and improve my own 1999 ERP — over 200,000 lines of code in an Access database that's still in production, every single day. I haven't built it in the abstract: it has grown on the fly, fighting real problems on a living database. When I hit a case it can't solve, I open an issue, and within hours — the next day at the latest — there's a new tool or a fix for it. That means two things: the 62 tools exist because they were genuinely needed, and the project moves fast. If you find it today and something's missing, come back tomorrow.

01 — The problem: Access is powerful, but its learning curve is brutal

Anyone who has tried to build their own management program in Access — a stock control for the shop, a client diary for the accounting firm, a maintenance log for the workshop — has hit the same wall. The saving data part is relatively easy: design a table, feed it information, fine so far. The presenting it part is where things start to go sideways: you have to learn to build forms, configure controls, bind them to the table. And the doing things with it part — computing a total, validating a field, exporting a delivery note to PDF, marking an invoice as paid — demands writing VBA code, a 90s language with its own mythology and very little modern documentation.

The result is that most people who try to build their own Access database end up in one of three places: paying a programmer to do it for them, abandoning the project, or living with a contraption that almost works but that nobody dares touch. And that's a shame, because Access is brutally capable for running the day-to-day of a 1-to-10-person business — more than enough to run an entire company without paying monthly SaaS fees or depending on someone else's servers.

What changes with an AI assistant connected over MCP is that the barrier to entry stops being technical and becomes conceptual. You no longer need to know what a QueryDef is, how to write a DoCmd.OpenForm, or the difference between a recordsource and a rowsource. You just need to know what you want: «a screen to enter customers with their tax ID, address and phone number», «a list of pending invoices with a button to mark them as paid», «a monthly sales report by category». Claude translates that into whatever technical operation is needed and MCP-Access executes it on the .accdb file directly.

02 — What an MCP is, and why it changes the rules

MCP stands for Model Context Protocol, a standard published by Anthropic (the company behind Claude) so AI assistants can "talk" to external programs. The idea is very simple: instead of you asking the AI «please write me a VBA code to do X» and then copying and pasting that code into Access — with all the errors that entails — the AI has a direct communication channel to an MCP server, a program that runs on your computer and knows how to do specific things. The assistant calls those tools and the server acts on the real system.

An MCP is, in practice, a bridge between natural language and a specific tool. There are MCPs for GitHub, for PostgreSQL databases, for Figma, for Excel, for remote servers over SSH. Each one exposes a set of tools — well-defined functions — that the AI can invoke whenever it sees fit. The AI doesn't see your database: it sees a menu of tools like «access_list_objects», «access_create_table» or «access_run_vba». When you ask for something, the AI decides which tools to combine and in what order.

MCP-Access is one specific implementation: the one that connects to Microsoft Access. What makes it special is how deep it goes. Most MCPs are thin — they expose three or four basic operations. This one exposes 62 distinct tools, covering practically everything you can do with Access from the visual editor and from the VBA editor. That means it doesn't run out of steam after the first couple of questions: there's enough room to build complete applications, not just demos.

03 — What MCP-Access lets you do

The 62 tools are grouped into blocks covering every functional area of Access:

The important detail is that these tools are specialized, not a generic «run this code and pray». Each one knows what it does, validates its parameters, returns understandable errors, and applies safety measures — for example, destructive operations like deleting an object require an explicit confirm=true parameter, and the VBA editor runs a structural check after every change so it never leaves a module broken.

04 — Step-by-step installation

The server is written in Python and only works on Windows, because it depends on COM automation — the API Microsoft exposes so other programs can control Office. You need:

Once Python is installed, open PowerShell and run:

pip install mcp pywin32

That pair of packages is the whole dependency. mcp is the protocol's SDK, pywin32 is what lets Python speak COM with Access.

Then clone the repository into a folder on your disk — I keep mine at C:\herramientas\MCP-Access, but the path doesn't matter, the only thing that matters is remembering it:

git clone https://github.com/unmateria/MCP-Access.git C:\herramientas\MCP-Access

If you don't have git, download the ZIP from the repo's GitHub page and unzip it wherever you like.

The last preparation step is telling Access to let its VBA code be poked at from the outside. For security reasons, Access ships with that door closed by default. You have to open it manually:

  1. Open Access (any database works, or a blank one).
  2. Menu File → Options → Trust Center → Trust Center Settings → Macro Settings.
  3. Tick the «Trust access to the VBA project object model» box.
  4. Accept and close Access.

This is a one-time setting, saved in the user profile. The repo also includes an enable_vba_trust.ps1 script that does it from the command line, if you'd rather not hunt for the option by hand.

05 — Connecting the MCP to Claude Code

Once everything is installed, register the server in Claude Code with a single command. Open PowerShell in your project folder (or in any folder if you want it global) and type:

claude mcp add access -- python C:\herramientas\MCP-Access\access_mcp_server.py

Adjust the path to wherever you cloned the repo. That registers the MCP globally, available in any Claude Code session. If you'd rather it only be active in one specific project — because you only work with Access in certain folders and don't want the server loaded all the time — use the project-scope variant, which creates an .mcp.json file in the current directory:

claude mcp add --scope project access -- python C:\herramientas\MCP-Access\access_mcp_server.py

To check it's properly connected, open Claude Code in that folder and type something like «list the Access MCP's tools». If everything's fine, you should see the menu of 62 tools starting with access_. If they don't show up, the most common causes are a wrong path to the script, a missing pip package, or Python not being on the PATH.

06 — Building a database from scratch

Here's the fun part. With the MCP running, you open Claude Code in any folder and talk to it like you'd talk to a coworker — in plain terms, no jargon at all. For example, to start a database to manage a club's members:

Make me a database to keep track of my club's members.
I want to record first name, last name, email, phone number,
the date they signed up, whether they've paid their membership fee,
and a place to write notes.
Save it on my desktop.

Claude takes care of the rest: it decides the right type for each field on its own (text, date, yes/no, and so on), adds an automatic ID for each member, creates the .accdb file, and tells you where it left it. Double-click to open it and there's the table, ready for data.

The natural next step is asking for a screen to enter members without having to look at the raw table:

Make me a nice-looking window to enter new members, with a button
to save and another to close.

And that's it. Claude builds the form, adds the fields, the buttons, writes the VBA code needed to make the buttons work, and lets you know when it's ready. Without you having touched a line of VBA.

07 — Building a mini-ERP by talking to Claude

The above is the easy version. What really shows off its potential is building a complete application. Imagine you run a microbusiness — a workshop, a small online shop, an academy — and you want your own little Access system to manage customers, products, orders and invoices. In traditional programming, that's several weeks. With MCP-Access it's a conversation over a couple of afternoons. A session might start like this:

I want to build a little program for my bike shop.
I need to track my customers, the bikes and spare parts
I sell, and the orders they place with me.
Each order belongs to one customer and can have several bikes or
spare parts in it, with their quantity. And orders go through
"draft", "shipped" and "paid".
Set up the database however makes the most sense and save it on my desktop.

In a few seconds you have the skeleton: four tables (customers, products, orders and order lines) properly related to each other, with their keys and their cascading deletes where needed. You didn't have to decide any of that — Claude infers it from your plain-language description. From there you keep asking for it piece by piece:

Each of those sentences triggers a sequence of MCP tool calls — some create controls, others write VBA, others create queries, others reports. And since Claude has the screenshot tool among its arsenal (access_screenshot), if something doesn't come out the way you expected, you just tell it «no, move the button to the right and make it bigger» and it looks at how things stand, works out the coordinates and fixes it.

It pays to iterate in small steps: ask for one thing, open Access, check it works, and only then move on. Not out of distrust, but because you keep refining what you want as you see results — and because if something goes wrong it's much easier to pinpoint where.

08 — Editing an existing Access database

The other classic scenario is inheriting a legacy database — that Access some friend's cousin threw together in 2014 that's still holding up half the business — and wanting to modify it without breaking anything. This is where MCP-Access really shines, because it has tools built exactly for that:

The typical flow is: you ask Claude to summarize the database, explain what you want to change («add a "comercial_id" field to the pedidos table and put a column on the orders form to pick it from a combo box off the empleados table»), and it navigates the objects, reads the existing code, finds the spots that need touching, and applies the changes. If something fails, the compilation tools (access_compile_vba) catch the errors with their exact line and Claude fixes them.

A key tool for old databases is access_decompile_compact. When an .accdb has been edited for years, it accumulates compiled junk — intermediate code (p-code) that no longer matches the current source. The file keeps growing and starts throwing weird errors when compiling. This tool runs a maintenance operation that traditionally only advanced Access administrators knew about: it fires off a decompile + compact that flushes the junk and leaves the database clean. Reductions of 60–70% in file size are common.

09 — Porting an old Access app to .NET or the web

There's a less obvious but equally powerful use case: using MCP-Access not to stay in Access, but to get out of it. Anyone who has tried migrating an old Access application to .NET, to Java, to a modern web app or to an Electron desktop app knows the real problem isn't writing the new code — it's understanding the old one. There are tens of thousands of lines of VBA written over twenty years by people who are long gone, forms with events scattered everywhere, saved SQL queries with weird JOINs, business logic spread across macros, queries and modules. Rewriting it blind is suicide.

MCP-Access turns Access into a data source another AI can read. The access_export_structure, access_get_code, access_find_usages and access_find_definition tools let the model navigate the whole database, read the VBA module by module, map which query uses which table, which form calls which function, and build an exhaustive inventory of the business logic. And since Claude understands VBA perfectly, it can translate it into something else.

A typical migration flow looks something like this:

  1. Ask Claude for a complete inventory: tables, relationships, forms, reports, saved queries, VBA modules, what function calls what. Have it dump it into Markdown.
  2. Ask it to extract the business logic function by function: what it does, what rules it applies, what tables it touches. That documentation is gold — probably the first time in years that information has been written down anywhere.
  3. Ask it to generate the equivalent in the target stack. «This VBA function that calculates the volume discount, give me the C# equivalent for a REST API». «This orders form, build me the React with Tailwind equivalent». «These Access tables, give me the CREATE TABLE statements for PostgreSQL preserving the types».
  4. While the migration progresses, keep the Access database alive in production and use it as a behavior oracle: whenever you're unsure the new logic is correct, run the query or the function on the old Access through the MCP and compare results.

The beautiful part is that this radically changes the economics of the refactor. What used to be «hire a consultancy for six months so they understand your system before touching anything» becomes «a couple of weeks reading through it conversationally with Claude before deciding what to rewrite and in what order». And since you have the original database as a reference always available, you can migrate module by module instead of doing a Big Bang. The question stops being «can we afford to rewrite it?» and becomes «which parts are worth rewriting, and which do we leave in Access for another ten years?».

10 — Best practices and known gotchas

Things worth keeping in mind:

11 — Who this is for

This is aimed especially at three kinds of people:

What it's not: a magic solution that replaces thinking. You still have to design the data model well, you still have to verify that what it produces works, you still have to understand — at least broadly — what a primary key is or why a cascading-delete relationship can be dangerous. But the technical friction between having an idea and having a working application drops from weeks to hours. And for anyone who has spent years thinking «if only I knew how to program, I'd build…», that's the difference between doing it and not doing it.

The project is active, with frequent commits and a detailed changelog. Just what was missing for Microsoft Access — that tool so loved and so maligned — to enter the age of conversational programming. github.com/unmateria/MCP-Access.

Special thanks to TvanStiphout-Home and CaptainStormfield, who volunteered as beta testers from the very start, reported multiple bugs and helped fix them. Without them the project would be a lot rougher around the edges.