
PL/SQL Intelligence
io.github.MuhDurPublished by GitHub account MuhDurv0.6.3Updated Oct 24, 2026
Oracle MCP with PL/SQL analysis, lineage, SAST, and change-impact tools.
Overview
A local MCP server for offline Oracle PL/SQL code intelligence: parsing, dependency and lineage analysis, SAST, and change-impact prediction.
- What you can do
- Analyze PL/SQL source and an optional Oracle catalog snapshot offline, with typed uncertainty instead of false-clean results when the parser cannot be certain. Predict change impact from a directory, diff, or changeset and produce rendered documentation and SAST artifacts such as SARIF reports. Query and explain a serialized dependency graph, including reverse neighbors and paths between objects. Run the USR Loop to capture analysis gaps, propose candidate parser repairs, and gate, land, or quarantine them against a pinned conformance check.
- When to use it
- Useful when you maintain a large Oracle PL/SQL estate and want to know what a column or package change will break before recompiling in production, or want dependency, lineage, and static-analysis views without connecting to a live database.
- Requirements
- Runs as a local process on the desktop (stdio), distributed as an OCI image. The underlying engine is a Rust workspace; normal builds need a stable Rust toolchain and no Java, and no Oracle client or live database is required for offline analysis. No authentication, environment variables, or headers are declared.
Installation
In SourceWeft
- Open PL/SQL Intelligence in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
PL/SQL Intelligence Engine
Offline, package-aware Oracle PL/SQL code intelligence in Rust, with a self-healing coverage flywheel.
Know what breaks before you change Oracle PL/SQL.
TL;DR
The problem. In a large Oracle estate, PL/SQL packages, views, triggers and tables form a deep dependency web. Change one column type or one package spec and you can silently invalidate hundreds of downstream objects; you find out in a failed production recompile. Existing tools each cover a slice (SQL deployment, lineage products, SAST scanners, Oracle's own SQLcl MCP server), but none give offline, package-aware PL/SQL semantics with explicit uncertainty reporting, dependency reasoning, and recompile planning in one workflow.
The solution. A layered Rust workspace that parses PL/SQL with a real
ANTLR backend, builds a semantic IR with name resolution and a dependency
graph, and reports change impact. When the analyzer cannot be certain it
says so, as a typed UnknownReason, instead of reporting a false-clean
result. That honest-uncertainty exhaust feeds the USR Loop, which
turns recorded gaps into proven, privacy-clean parser and lowering
repairs so coverage compounds with use.
MCP belongs in oraclemcp
This repository now owns the offline PL/SQL engine, library crates, and
command-line tools. MCP serving moved to the standalone
oraclemcp repository, where the
database connection layer and server lifecycle already live.
The old plsql-mcp workspace crate has been removed here. Published
historical versions remain a compatibility path until the distribution
retirement beads finish; new PL/SQL intelligence work should flow through
the library crates and the plsql / plsql-depgraph / usr-loop CLIs.
Independent open-source project; not affiliated with Oracle. Oracle client libraries are not included or required for the offline engine.
Why use it?
How it compares
Status
The current line is the offline-pivot track for 0.7.0. The workspace
builds on the stable channel and no longer contains the plsql-mcp crate.
The project is still pre-1.0, so public APIs can move before the 1.0 line.
plan.md remains the authoritative specification, and
docs/plans/2026-06-29-offline-pivot-retire-plsql-mcp.md is the active
retirement plan for the MCP split.
- The Cargo workspace has 25 members: 20 product crates under
crates/plus 5 tool crates undertools/. - The normal source install path needs the stable-channel toolchain. Java is only needed when regenerating the committed ANTLR parser output, not for ordinary builds, tests, or CLI installation.
- The product-facing binaries are
plsql,plsql-depgraph, andusr-loop. Each hascapabilities,robot-docs,doctor, and--robot-json/--robot-triagesurfaces for agents. - MCP serving is now an
oraclemcpresponsibility. This repo exposes the parser, semantic model, catalog snapshot model, dependency graph, lineage, documentation, SAST, change-impact, and USR Loop library surfaces thatoraclemcpcan consume. - The USR Loop is implemented end to end: the
plsql-accretionlibrary, theusr-looptool, the sha-pinned conformance gate, the monotone tripwire, and the re-runnable acceptance proofscripts/usr_acceptance.sh. AGENTS.mddescribes how automated agents work in this repo.
Testing and Verification
The default local profile is offline and stable-channel:
cargo fmt --all -- --checkcargo clippy --workspace --all-targets -- -D warningscargo test --workspace --all-targetscargo test --workspace --doccargo bench --workspace --no-runcargo deny checkplan-lint, corpus license checks, parse-success checks, lab goldens, demo-no-db, offline honesty grep, offline boundary lint, and the USR accretion gates.
Do not read the test suite as "there are no test doubles anywhere." The repo contains deliberate test doubles where they pin a boundary: feature off live-XE sentinels, GitHub Action posting self-tests, fail-closed bindgen wrappers for invalid identifiers, hermetic Oracle connection doubles, and the deterministic USR proposer path. Those are not unfinished production placeholders.
The private-estate Definition of Done is honest about its boundary. When
PLSQL_PRIVATE_ESTATE is absent, scripts/usr_acceptance.sh exits
successfully with an estate-absent banner and does not claim the full
estate proof. The binding full proof requires an estate-bearing host.
Quick Example
The USR Loop (self-healing coverage flywheel)
Most analyzers discard parse errors and unresolved references as failure.
This one records them as typed, provenanced, minimizable, offline
artifacts, then repairs them. The full normative specification is
docs/plans/2026-05-19-usr-loop-self-healing-coverage-flywheel.md; the
repair-class policy and gate honesty manifest are in
docs/decisions/D3-usr-repair-class-policy.md.
Invariants (the spec's spine; each is enforced, not aspirational)
The conformance gate
scripts/usr_gate.sh runs nine ordered stages, all must pass, fail-closed.
Any non-pass rejects the candidate and files it as a bead; the gate is
never weakened to admit a patch.
The gate script is content-pinned: crates/plsql-accretion/gate.sha256
holds the expected sha256 and plsql-accretion's gate runner aborts on a
mismatch. Changing the gate requires a deliberate, human-reviewed commit
plus a sha bump. crates/plsql-accretion/tests/gate_selftest.rs feeds the
gate an adversarial trio (a suppression-only patch, a privacy-leaking
fixture, a round-trip-breaking patch) and asserts each is rejected at its
named stage.
coverage_index and the tripwire
scripts/accretion_tripwire.sh (a required CI check) asserts
coverage_index(HEAD) >= coverage_index(last release tag) and
extracted_semantics_ratio(HEAD) >= extracted_semantics_ratio(last release).
Fresh CI checkouts compare against the tracked deterministic seed in
crates/plsql-accretion/accretion_floor.json, so the first floor is durable
even though .usr/ledger/ is scratch. A release that lowers either metric
fails. The coverage_index-over-time table lives in CHANGELOG.md.
Definition of Done
scripts/usr_acceptance.sh is the single re-runnable acceptance contract.
It is not a "looks built" check: it drives the loop to close a real,
currently-open gap in a private estate end to end and asserts every
invariant held (provenance, privacy-proven fixture, gate exit 0 or correct
quarantine, strict signature decrease, strict extracted_semantics_ratio
increase, preserved posture, ledger appended exactly once, mutation-killed
test, green adversarial gate self-test, byte-identical double run). When no
private estate is configured the script exits 0 with a loud
"estate-absent" banner, stating that the DoD is not proven in that
environment. CI runs the full acceptance proof nightly
(.github/workflows/usr.yml).
Architecture
The workspace is layered (full detail in plan.md §5 and
docs/ARCHITECTURE.md). Downstream crates never depend on ANTLR-generated
types.
Tool binaries: plsql (change-impact, docs, SAST, doctor),
plsql-depgraph (dependency graph query/explain/doctor), usr-loop
(the USR Loop orchestrator), plan-lint, corpus-license-check,
corpus-bench, and corpus-grow.
MCP is intentionally not a binary in this workspace anymore. Agents that
need a server should use oraclemcp; agents that need offline PL/SQL
intelligence should call the library crates directly or use the CLIs.
Installation
The workspace builds with the stable channel pinned in rust-toolchain.toml.
The workspace MSRV is recorded in Cargo.toml as rust-version = "1.96".
Normal installation does not require Java. Java is only needed when a
maintainer explicitly regenerates the ANTLR parser output.
Install Released CLIs
Linux and macOS:
Windows PowerShell:
The installers fetch the latest GitHub release, verify SHA256SUMS, install
plsql and plsql-depgraph, and print uninstall instructions.
From source
Install CLIs from a checkout
Install CLIs from Git
Per-crate iteration
Per-crate builds keep cycles short during development:
No Oracle client or database connection is required for the default offline CLIs.
Command Reference
Global discovery commands exist on the main user-facing binaries:
plsql
The release-assurance CLI for change impact, rendered documentation, SAST artifacts, and local diagnostics.
plsql-depgraph
Read a serialized dependency graph and query or explain it.
usr-loop
The USR Loop orchestrator. A global --robot-json flag emits a single-line
machine-readable envelope on every subcommand.
Exit codes for gate/land: 0 accepted/landed, 3 rejected/quarantined
(spec-correct, not a bug), 4 gate sha-pin abort, 9 I-PRIVACY abort
(nothing persisted).
plan-lint
Design Commitments
- Rust Cargo workspace, one crate per component.
doctorsubcommands and--robot-jsonoutput on every CLI surface, so agents read the machine contract instead of guessing.- Explicit
UnknownReasonrecords whenever analysis cannot be certain; the completeness report is never false-clean. - Parser backend isolation: downstream crates must not depend on ANTLR-generated types.
- The whole workspace is
#![forbid(unsafe_code)]. - No telemetry by default.
Repository Workflow
- Read
AGENTS.mdandplan.mdfirst. - Treat
plan.mdas the source of truth for intended architecture and scope. If code andplan.mddiverge, fix one or the other deliberately. - Track work in Beads only;
.beads/is authoritative. - Never copy private material into this repository. The USR Loop and the
correctness harness read a private estate in place, at the path given
by the
PLSQL_PRIVATE_ESTATEenvironment variable, and never persist its bytes.
Layout
plan.md: master specificationAGENTS.md: repo operating rulesCargo.toml,crates/,tools/: Rust workspacecorpus/: public and synthetic PL/SQL fixtures used by testsdocs/: architecture snapshot, plans, decisions, integration guidesscripts/:usr_gate.sh,usr_acceptance.sh,accretion_tripwire.sh,estate_correctness.sh.beads/: Beads issue-tracker state (authoritative)CHANGELOG.md: release-notes log plus thecoverage_indextable
Troubleshooting
Limitations
- Pre-1.0: the API can move at any time before 1.0.
- This repository is not the MCP server anymore. Use
oraclemcpfor MCP serving, Oracle sessions, and guarded live database access. - Live Oracle extraction is not in this repository. Use
oraclemcpfor Oracle sessions, live catalog snapshots, and guarded database access. - The USR Loop proposer does not auto-merge. It produces proven
candidates; the proof is automatic and complete, the landing decision is
gated by that proof and the repo's normal review (per
D3). - Genuinely-ambiguous Oracle dialect forms are not resolved by guessing.
They become honest typed
UnknownReason(repair-classd): coverage of honesty, never of fabrication. - Accretion compounds on signature classes, not raw counts. A long tail of singleton estate quirks may stay open; that is reported, not masked.
- Class-
ggrammar patches are real grammar work, gated like everything else: slower, but sound. - Referential-integrity subsetting is routed to a separate future plan, not the first release.
FAQ
Does analysis require a live Oracle database? No. Analysis is offline
against source plus an optional catalog snapshot. Live Oracle access belongs
in oraclemcp; this repo keeps the offline engine and CLIs.
Is the parser real, or a heuristic scanner? Real. The engine parses
through the ANTLR-generated Rust backend in plsql-parser-antlr with a
lossless token tape; the decision and evidence are in
docs/decisions/D2-backend-final.md.
What happens to constructs the parser cannot handle? They are recorded
as typed UnknownReason with provenance. The completeness report reflects
that honestly instead of reporting a false-clean result.
Has the USR Loop closed N gaps on a real estate? That claim is not
made here as a settled marketing fact. The mechanism is implemented and
the proof is the re-runnable scripts/usr_acceptance.sh plus nightly CI.
This README documents how to run it, not an unverifiable boast.
Can I weaken the gate to land a patch faster? No. The gate is sha-pinned and fail-closed; a mismatch aborts. Changing it requires a reviewed commit and a deliberate sha bump.
Is any code unsafe? No. The whole workspace is
#![forbid(unsafe_code)].
License
Dual-licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option. The vendored ANTLR PL/SQL grammar under
crates/plsql-parser-antlr/grammars/ is Apache-2.0, from
antlr/grammars-v4; attribution is preserved in
crates/plsql-parser-antlr/LICENSE-GRAMMARS.md.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual-licensed as above, without any additional terms or conditions.
About Contributions
About Contributions: Please don't take this the wrong way, but I do not accept outside contributions for any of my projects. I simply don't have the mental bandwidth to review anything, and it's my name on the thing, so I'm responsible for any problems it causes; thus, the risk-reward is highly asymmetric from my perspective. I'd also have to worry about other "stakeholders," which seems unwise for tools I mostly make for myself for free. Feel free to submit issues, and even PRs if you want to illustrate a proposed fix, but know I won't merge them directly. Instead, I'll have Claude or Codex review submissions via gh and independently decide whether and how to address them. Bug reports in particular are welcome. Sorry if this offends, but I want to avoid wasted time and hurt feelings. I understand this isn't in sync with the prevailing open-source ethos that seeks community contributions, but it's the only way I can move at this velocity and keep my sanity.
Work with me
I help enterprises with the hard parts: databases at scale, systems modernization, and AI in production, vendor-neutral (cloud or self-hosted). Building something hard in databases, Rust / C++, or AI? Reach out.
Source: README.md at commit 1b79c2d
Tools
0Version history
1- v0.6.3LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts