github Python re-analysis due

n-schilling/office_365_exporter

github

Export your own Microsoft 365 data — Teams chats, Outlook mail, calendar, contacts, OneDrive files — through Microsoft Graph, then search it offline: full-text and semantic ranking fused into one list, plus a built-in MCP server so Claude can search the archive. Delegated access, no admin consent. Nothing leaves your machine.

maintainer
n-schilling
license
Apache-2.0
first seen
2026-08-11
last seen
2026-08-11
releases · 30d
4
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 8 tools
transport stdio · streamable-http · http counts 8 tools · 0 res · 0 prompts permission surface via code analysis

tools

  • browse_messages
  • corpus_stats
  • get_document
  • get_thread
  • list_folders
  • list_people
  • read_source_file
  • search_messages
code evidence vv4.1.1 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 38

filesystem 22

  • fs n-schilling-office_365_exporter-033eaad/app.py :40 import shutil
  • fs n-schilling-office_365_exporter-033eaad/auth.py :33 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/combined_search.py :53 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/corpus.py :21 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/folders.py :33 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/i18n.py :26 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/mcp_server.py :62 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/onedrive_export.py :50 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/outlook_export.py :50 from pathlib import Path
  • fs (weak) n-schilling-office_365_exporter-033eaad/packaging/smoke_test.py :36 import shutil
  • fs n-schilling-office_365_exporter-033eaad/rag_index.py :37 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/rag_server.py :26 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/settings.py :29 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/store_layout.py :31 from pathlib import Path
  • fs n-schilling-office_365_exporter-033eaad/teams_export.py :55 from pathlib import Path
  • fs (weak) n-schilling-office_365_exporter-033eaad/tests/test_app.py :18 import shutil
  • fs (weak) n-schilling-office_365_exporter-033eaad/tests/test_auth.py :415 from pathlib import Path
  • fs (weak) n-schilling-office_365_exporter-033eaad/tests/test_i18n.py :12 from pathlib import Path
  • fs (weak) n-schilling-office_365_exporter-033eaad/tests/test_progress.py :156 from pathlib import Path
  • fs (weak) n-schilling-office_365_exporter-033eaad/tests/test_projekt.py :12 from pathlib import Path
  • fs (weak) n-schilling-office_365_exporter-033eaad/tests/test_settings.py :14 from pathlib import Path
  • fs (weak) n-schilling-office_365_exporter-033eaad/tests/test_updates.py :178 from pathlib import Path

shell / exec 5

  • shell n-schilling-office_365_exporter-033eaad/app.py :45 import subprocess
  • shell (weak) n-schilling-office_365_exporter-033eaad/packaging/smoke_test.py :39 import subprocess
  • shell (weak) n-schilling-office_365_exporter-033eaad/tests/test_app.py :20 import subprocess
  • shell (weak) n-schilling-office_365_exporter-033eaad/tests/test_projekt.py :139 import subprocess
  • shell (weak) n-schilling-office_365_exporter-033eaad/tests/test_settings.py :221 import subprocess

network 19

  • net n-schilling-office_365_exporter-033eaad/answer.py :134 import requests
  • net n-schilling-office_365_exporter-033eaad/app.py :52 from urllib.parse import urlsplit, parse_qs
  • net n-schilling-office_365_exporter-033eaad/combined_search.py :54 from urllib.parse import quote, unquote
  • net n-schilling-office_365_exporter-033eaad/mcp_server.py :64 from urllib.parse import quote, unquote
  • net n-schilling-office_365_exporter-033eaad/onedrive_export.py :51 from urllib.parse import unquote
  • net n-schilling-office_365_exporter-033eaad/outlook_export.py :64 import requests
  • net (weak) n-schilling-office_365_exporter-033eaad/packaging/smoke_test.py :37 import socket
  • net n-schilling-office_365_exporter-033eaad/rag_index.py :65 import requests
  • net n-schilling-office_365_exporter-033eaad/rag_server.py :27 from urllib.parse import urlsplit, unquote, quote
  • net n-schilling-office_365_exporter-033eaad/teams_export.py :67 import requests
  • net (weak) n-schilling-office_365_exporter-033eaad/tests/test_answer.py :3 Nie ins Netz: requests.post wird immer ersetzt. Zwei Zusagen stehen im
  • net (weak) n-schilling-office_365_exporter-033eaad/tests/test_app.py :284 monkeypatch.setattr("requests.get", lambda *a, **k: R())
  • net (weak) n-schilling-office_365_exporter-033eaad/tests/test_mcp_server.py :12 from urllib.parse import quote
  • net (weak) n-schilling-office_365_exporter-033eaad/tests/test_outlook_export.py :12 import requests
  • net (weak) n-schilling-office_365_exporter-033eaad/tests/test_rag_index.py :3 Es wird nie echtes Ollama angesprochen: requests.post bzw. rag_index.embed
  • net (weak) n-schilling-office_365_exporter-033eaad/tests/test_rag_server.py :3 Ollama wird nie angesprochen: requests.post ist überall gemockt. Für die
  • net (weak) n-schilling-office_365_exporter-033eaad/tests/test_teams_export.py :13 import requests
  • net (weak) n-schilling-office_365_exporter-033eaad/tests/test_updates.py :3 Kein Netz: requests.get wird immer ersetzt. Wichtigster Fall ist der, den es
  • net n-schilling-office_365_exporter-033eaad/updates.py :71 import requests

secrets 1

  • secrets n-schilling-office_365_exporter-033eaad/auth.py :106 val = os.environ.get("GRAPH_TOKEN")

database 7

  • db n-schilling-office_365_exporter-033eaad/app.py :41 import sqlite3
  • db n-schilling-office_365_exporter-033eaad/mcp_server.py :60 import sqlite3
  • db n-schilling-office_365_exporter-033eaad/rag_index.py :35 import sqlite3
  • db n-schilling-office_365_exporter-033eaad/rag_server.py :377 import sqlite3
  • db (weak) n-schilling-office_365_exporter-033eaad/tests/test_app.py :19 import sqlite3
  • db (weak) n-schilling-office_365_exporter-033eaad/tests/test_mcp_server.py :15 import sqlite3
  • db (weak) n-schilling-office_365_exporter-033eaad/tests/test_rag_index.py :9 import sqlite3

tool registrations 8

  • search_messages n-schilling-office_365_exporter-033eaad/mcp_server.py :535
  • browse_messages n-schilling-office_365_exporter-033eaad/mcp_server.py :591
  • get_thread n-schilling-office_365_exporter-033eaad/mcp_server.py :642
  • get_document n-schilling-office_365_exporter-033eaad/mcp_server.py :668
  • list_people n-schilling-office_365_exporter-033eaad/mcp_server.py :722
  • read_source_file n-schilling-office_365_exporter-033eaad/mcp_server.py :767
  • list_folders n-schilling-office_365_exporter-033eaad/mcp_server.py :792
  • corpus_stats n-schilling-office_365_exporter-033eaad/mcp_server.py :817

declared dependencies 5

  • mcp@==2.0.0
  • msal@==1.37.0
  • numpy@==2.5.2
  • requests@==2.34.2
  • cryptography@==48.0.1; sys_platform == "darwin" and platform_machine == "x86_64"