python-mcp-as400 MCP server
Commit Oct 24, 2026Connects AI assistants to IBM i (AS/400) systems to query Db2, read source code, compile programs, and analyze spooled files securely.
Also known as LorenteFacundo/python-mcp-as400
- Stars
- 2
- Tools
- 5
- Downloads, 30 days
- —
- Latest version
- —
- Last commit
- Oct 24, 2026
- License
- MIT
What is python-mcp-as400 MCP?
python-mcp-as400 connects AI assistants to IBM i (AS/400) systems to query Db2, read source code, compile programs, and analyze spooled files securely. It exposes 5 tools, such as execute_sql, execute_cl_command, read_source_member.
Summary generated from the project's README
About python-mcp-as400 MCP server
Connecting AI assistants to IBM i systems for safe analysis and development is what this MCP server enables. It allows developers to use clients like Claude or Cursor to interact with Db2 for i, read RPG, COBOL, or CL source code, and manage compilation tasks. By bridging the gap between large language models and legacy business logic, it helps teams perform impact analysis across thousands of tables much faster than manual inspection.
The server operates locally via stdio and requires Python 3.10+, the IBM i Access ODBC Driver, and valid database credentials provided through environment variables. It is designed with a strict security model that prioritizes analysis over destruction. It uses a validation layer to ensure that SQL queries remain read-only and that CL commands are restricted to a specific allow list, preventing any accidental data modification or object deletion.
Developers can use specific tools like execute_sql for querying system tables, read_source_member to inspect code, and compile_program to build RPG or C programs. It also includes read_spoolfile to examine job logs and compile listings, making it a comprehensive tool for maintaining and understanding complex IBM i environments.
What you can do with it
- 1Inspect legacy source codeYou can ask an AI to explain the logic within specific RPG or COBOL members.
- 2Debug compilation errorsThe assistant can compile a program and then read the resulting spool files to diagnose failures.
- 3Query system metadataDevelopers can find specific columns or table structures using read-only SQL commands.
Written from the project's README. Every use case is checked against a quote from it.
python-mcp-as400 MCP tools 5
Detected from the READMEexecute_sqlexecute_cl_commandread_source_membercompile_programread_spoolfile
| execute_sql | — | |
| execute_cl_command | — | |
| read_source_member | — | |
| compile_program | — | |
| read_spoolfile | — |
Configuration
DB_HOSTDB_PASSDB_USER
| Name | Description | |
|---|---|---|
| DB_HOST | — | |
| DB_PASS | — | |
| DB_USER | — |
Automated checks
Ran Nov 14, 2026Full report →Not verified yet. A server needs a score of 80, no serious finding, and enough data for us to check. How checks work
- Source repository linked and reachablelorentefacundo/python-mcp-as400 is public and reachablegithub.com/lorentefacundo/python-mcp-as400 ↗Pass
- Package names this repository as its sourceNot checked
- Build provenance (Sigstore attestation)Not checked
- Open source license (OSI)MITspdx.org/licenses/MIT.html ↗Pass
- Commit or release in the last yearLast commit or release 2026-10-24github.com/lorentefacundo/python-mcp-as400 ↗Pass
- OpenSSF ScorecardNot checked
- Package name not close to a popular packageNot checked
- No critical advisory in the package or its dependenciesNot checked
- No hidden instructions to the model5 tool descriptions and the README read; no override phrases, credential paths or hidden charactersPass
- Destructive tools are labelledNot checked
- Remote endpoint answers the MCP handshakeNot checked
README
View on GitHubAS/400 MCP Server
English · Español
An MCP server that lets AI assistants (Claude, Cursor, any MCP client) work with IBM i (AS/400) systems: query Db2 for i, read RPG/COBOL/CL source, compile programs and read spooled files. Every input goes through strict validation, so the assistant can analyze everything without being able to break anything.
Why I built it
A lot of critical business logic still runs on IBM i, and the people who know it are few and busy. Understanding the impact of a change means reading thousands of tables and programs by hand. I wanted an AI assistant to do that reading for me, but connecting an LLM to a production system is only acceptable if it cannot change data or objects. This server is that bridge.
Results
I presented it at BDT Global, where it was approved as a billable initiative and piloted with a client:
| Manual | With the MCP server | |
|---|---|---|
| Task estimated by a senior developer | 5 days | 3 hours (13x) |
| Impact analysis across 6,000+ tables | 6 hours | 20 minutes (18x), and it found 2 tables missed by hand |
Tools
| Tool | What it does | Example |
|---|---|---|
execute_sql |
Read-only SQL (SELECT, WITH, VALUES) |
SELECT * FROM QSYS2.SYSTABLES FETCH FIRST 5 ROWS ONLY |
execute_cl_command |
Allow-listed CL commands | DSPFD FILE(MYLIB/MYFILE) OUTPUT(*OUTFILE) OUTFILE(QTEMP/FDA) |
read_source_member |
Reads a source member | biblioteca='MYLIB', archivo_fuente='QRPGLESRC', miembro='MYPGM' |
compile_program |
Compiles RPG, CL, COBOL or C | library='DEVLIB', source_file='QRPGLESRC', member='MYPGM' |
read_spoolfile |
Lists or reads spooled files (compile listings, job logs) | program_name='MYPGM' |
Security model
The philosophy: analysis and compilation yes, destruction never. Validation lives in validation.py, has no dependencies, and is covered by 72 tests that run in CI on every push.
Read-only SQL
- Only
SELECT,WITHandVALUES; no;, so no statement stacking. - Blocks data-change table references hidden inside a
SELECT(SELECT * FROM FINAL TABLE (DELETE ...)). - Blocks Db2 for i functions with side effects:
QCMDEXC(runs any CL command),HTTP_*/HTTP*CLOB(data exfiltration),IFS_WRITE*,END_JOBand others. - Ignores string literals and quoted identifiers when checking keywords, so
WHERE MSG = 'DELETE'or aLAST_UPDATEcolumn still work. - Adds
FETCH FIRST 1000 ROWS ONLYwhen there is no limit.
CL commands: strict allow list
- Allowed:
DSP*,WRK*,CHKOBJ, compilation (CRTBNDRPG,CRTSQLRPGI,CRTBNDCBL, ...), library list and overrides. - Everything else is rejected:
DLTOBJ,DLTLIB,CLRPFM,RUNSQLSTM,SBMJOB,CALL,GRTOBJAUT, ... - Qualified commands (
QSYS/DLTLIB) are rejected. OUTFILE(...)must point toQTEMP, soDSP*commands cannot create or replace files in real libraries.
Everything else
- Library, file, member, user and spooled-file names are validated against the IBM i naming rules before they reach any SQL.
- Error messages never include credentials or connection strings.
Defense in depth. These checks reduce risk, they don't replace IBM i security. Connect with a user profile that only has the authorities it needs (ideally
*USEon the data and a development library for compiles).
Found by the tests
Writing the test suite (v1.1) exposed real gaps in v1.0, now fixed:
read_spoolfileconcatenateduserandspoolfile_nameinto SQL. Combined withQSYS2.QCMDEXC, that allowed running any CL command.execute_sqlacceptedVALUES QSYS2.QCMDEXC(...),FINAL TABLE (DELETE ...)andHTTP_POST(...).DSP*commands could write theirOUTFILEto any library.
Getting started
Requirements: Python 3.10+, the IBM i Access ODBC Driver, and a user on an IBM i system.
git clone https://github.com/LorenteFacundo/python-mcp-as400.git
cd python-mcp-as400
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -e .
cp .env.example .env # then fill in DB_HOST, DB_USER, DB_PASS
The server talks MCP over stdio. Add it to your client, for example Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"as400": {
"command": "python",
"args": ["/path/to/python-mcp-as400/server.py"],
"env": {
"DB_HOST": "your-ibmi-host.com",
"DB_USER": "YOUR_USER",
"DB_PASS": "YOUR_PASSWORD"
}
}
}
}
Or with Claude Code: claude mcp add as400 -- python /path/to/python-mcp-as400/server.py
Example prompts
- "Which tables in MYLIB have a column called CUSTNO?" →
execute_sqloverQSYS2.SYSCOLUMNS - "Which programs use the file CUSTOMERS?" →
DSPPGMREF ... OUTFILE(QTEMP/REFS)+execute_sql - "Explain what CALCPRICE does" →
read_source_member - "Compile CALCPRICE and tell me what failed" →
compile_program+read_spoolfile
Development
pip install -e ".[dev]"
pytest
| File | Purpose |
|---|---|
server.py |
MCP tools and the ODBC connection |
validation.py |
Security checks (no dependencies) |
tests/ |
Tests for every check, including real attack strings |
License
python-mcp-as400 MCP questions
What tools does python-mcp-as400 MCP provide?
It exposes 5 tools, including execute_sql, execute_cl_command, read_source_member, compile_program, read_spoolfile.
Can the AI assistant modify data in my IBM i system?
No, the server is designed for analysis and compilation only. It uses read-only SQL and a strict allow-list for CL commands to prevent data destruction.