Repair broken GraphML and Parquet export handling in the MCP
`export_graph` tool.
Previously, both formats failed in the MCP handler: GraphML referenced a
non-existent `GraphMLExporter` class and passed unformatted graph objects,
while Parquet passed raw `ContextGraph` instances to `export()`, causing
runtime type errors and producing empty responses.
Key changes:
- Route GraphML export through `GraphExporter(format="graphml")` via
`export_knowledge_graph()` with automatic `TemporaryDirectory` cleanup.
- Harden GraphML XML generation in `GraphExporter`: declare missing
`label` and `confidence` keys with `for="all"` scope and use
`xml.sax.saxutils` (`quoteattr`, `escape`) to properly escape XML
attributes and node text.
- Route Parquet export through `ParquetExporter.export_knowledge_graph()`,
returning generated `.parquet` files base64-encoded over the JSON MCP
transport.
- Gracefully handle missing `pyarrow` dependencies with structured error
responses.
- Preserve existing JSON, CSV, and RDF export behavior.
- Add comprehensive regression tests in
`tests/test_mcp_package_export_graphml_parquet.py`.