---
description: |
  [TOPIC] Mcp_Drift_Report
  [DETAILS] SciTeX Ecosystem MCP Drift Report — see file body for details.
tags: [scitex-general-interface-mcp-MCP-DRIFT-REPORT]
---

# SciTeX Ecosystem MCP Drift Report

Generated by `scitex-dev ecosystem audit-mcp-tools --all` (2026-04-30).
Static checks only — `--behavioral` not run. Warn-only; no fixes applied.

## Summary

| Status              | Count | Meaning                                                       |
|---------------------|------:|---------------------------------------------------------------|
| `warn`              |    21 | Audited and found violations.                                 |
| `no-mcp-server`     |    45 | Package doesn't ship an MCP server (no `_mcp_server.mcp`).    |
| `skip-not-standalone`|    1 | Umbrella `scitex` — mounts other servers, isn't a standalone. |
| `ok`                |     0 | (none yet — every audited package has at least one warning)   |
| **Total**           |  **67** |                                                              |

## Rule tally (across 21 audited)

| Rule | Hits | Meaning                                                                           |
|------|-----:|-----------------------------------------------------------------------------------|
| §6   |   22 | Python-API ↔ MCP-tool parity gaps (>50% of public functions unwrapped).           |
| §5   |   18 | Missing required `<pkg>_skills_list` and `<pkg>_skills_get` tools.                |
| §1   |   14 | Bridge in `scitex/_mcp_tools/<pkg>.py` hand-wraps or calls `mcp.mount()` directly.|
| §2   |    6 | Tool-name discipline (banned synonym, double-underscore, double-prefix, etc).      |

## Highest-leverage fixes

1. **§5 (18 hits) — add the canonical skills pair to every standalone:**
   ```python
   @mcp.tool()
   async def skills_list() -> dict:
       from scitex_dev.skills import list_skills
       return list_skills(package="scitex-<pkg>")

   @mcp.tool()
   async def skills_get(name: str | None = None) -> dict:
       from scitex_dev.skills import get_skill
       return get_skill(package="scitex-<pkg>", name=name)
   ```
   Under namespace mount these become `<pkg>_skills_list` / `<pkg>_skills_get`.

2. **§1 (14 hits) — convert hand-wrap bridges to `safe_mount`:**
   The TODO has the priority-ordered list of 22 hand-wrap bridges to migrate.
   `dev.py` is already done; `introspect.py` (12 tools) and `project.py` (6) are next.

3. **§1 — convert `io.py` from direct `mcp.mount()` to `safe_mount(mcp, io_mcp)`.** One-line change.

4. **§6 (22 hits) — review parity gaps.** Some are genuinely intentional (helper functions, classes that don't make sense as MCP tools); the auditor's >50% threshold flags packages where coverage is weak. A `--strict` mode (TODO) would surface every individual gap.

5. **§2 (6 hits) — small.** Mostly synonym renames (`_ls` → `_list`, etc.) and a few double-prefix typos.

## Reproduction

```bash
scitex-dev ecosystem audit-mcp-tools --all --json > /tmp/mcp-drift.json
scitex-dev ecosystem audit-mcp-tools --all                # human-readable
scitex-dev ecosystem audit-mcp-tools <pkg> --behavioral   # also probe `<cli> mcp ...`
```

## Auditor coverage gaps (still open)

- §6 parity threshold is coarse (`>50% missing` triggers); per-API gates need a `--strict` flag.
- Mixed mount conventions inside a single bridge file aren't detected (e.g. `safe_mount(...)` and `@mcp.tool()` both present).
- JSON-schema arg parity at `-vvv` not yet validated — only `--json` parseability.
