SharePoint Search MCP
SharePoint Search MCP
A self-hosted semantic search service for PPTX, DOCX, and PDF files stored in SharePoint. A local indexer reads a synchronized OneDrive folder, extracts and chunks text, creates 384-dimensional MiniLM embeddings, and writes them to SQLite or regular PostgreSQL. A separate read-only FastMCP server exposes search and retrieval tools over Streamable HTTP.
The PostgreSQL backend does not require pgvector. Embeddings are stored as float32 BYTEA values and loaded into an in-memory normalized NumPy matrix for cosine search. This keeps deployment possible on managed PostgreSQL offerings without extension support, but memory use grows with the number of chunks.
Features
Incremental indexing: unchanged files are skipped and changed files are replaced.
Per-file transactions and rollback so one corrupt document does not stop a run.
Exact chunk order and page or slide numbers.
Clickable SharePoint file links and optional folder links.
Best-effort embedded Office metadata for PPTX and DOCX.
SAP IAS or another OIDC discovery endpoint through FastMCP OAuthProxy.
Privacy-conscious aggregate usage monitoring in PostgreSQL.
Local SQLite fallback for development and small installations.
Related MCP server: Enterprise Knowledge MCP Server
Requirements
Python 3.11
A locally synchronized SharePoint or OneDrive folder
PostgreSQL 16 for the recommended shared deployment, or SQLite for local use
Cloud Foundry only when using the supplied deployment and tunnel helpers
An OIDC application for authenticated deployments
Quick start
Create a virtual environment and install both components:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements-dev.txt
Copy-Item indexer\.env.example indexer\.envEdit indexer/.env so LOCAL_ROOT, LOCAL_PREFIX, SHAREPOINT_PREFIX, and SITE_URL describe the same synchronized library. Plan runs are read-only:
python -m indexer.indexer
python -m indexer.indexer --applyFor a simple local SQLite setup, set these values in indexer/.env:
INDEX_BACKEND=sqlite
INDEX_DB_PATH=mcp_server/index.dbThen start the local MCP server without OIDC:
$env:MCP_AUTH_DISABLED = "1"
$env:INDEX_BACKEND = "sqlite"
$env:INDEX_DB_PATH = "mcp_server/index.db"
python -m mcp_server.mainThe Streamable HTTP endpoint is http://localhost:8000/mcp.
PostgreSQL
Start an optional local PostgreSQL 16 instance:
docker compose up -d
$env:DATABASE_URL = "postgresql://sharepoint_mcp:local-development-only@localhost:5432/sharepoint_mcp"
$env:INDEX_DATABASE_URL = $env:DATABASE_URLSet INDEX_BACKEND=postgres and POSTGRES_SCHEMA=sharepoint_mcp for the indexer. The server uses DATABASE_SCHEMA for the same value. Schema and tables are created by the application user, which therefore needs the corresponding permissions.
The server preloads all vectors. A 384-dimensional vector occupies 1,536 bytes before NumPy and process overhead. Size memory from the real chunk count and do not assume the example 1,800 MB limit fits every corpus.
Model files
By default sentence-transformers downloads all-MiniLM-L6-v2 on first use. For a restricted or reproducible deployment, download it before packaging:
python tools/download_model.pyThe generated mcp_server/models directory is intentionally ignored by Git but is not excluded from cf push. Set EMBEDDING_MODEL to mcp_server/models/all-MiniLM-L6-v2 in that case.
Cloud Foundry deployment
Create a PostgreSQL service instance and ensure its application user may create the configured schema and tables.
Copy vars.example.yml to vars.yml and replace every placeholder. vars.yml is ignored by Git because it contains the OIDC secret and monitoring salt.
Register the MCP_BASE_URL callback URLs required by FastMCP in your OIDC provider.
Download the model if the staging/runtime network cannot reach Hugging Face.
Deploy and verify:
cf push --vars-file vars.yml
cf logs sharepoint-search-mcp --recentThe service binding is discovered through VCAP_SERVICES. Outside Cloud Foundry, use DATABASE_URL. The supplied route-less helper in tools/db_tunnel_app and the PowerShell runner can reach a private CF database from a trusted workstation:
cf push -f tools/db_tunnel_app/manifest.yml --vars-file tools/db_tunnel_app/vars.yml
.\tools\run_local_onedrive_indexer.ps1
.\tools\run_local_onedrive_indexer.ps1 -ApplyOptionally set CF_API, CF_ORG, and CF_SPACE before running the scripts. When provided, the scripts refuse to run against a different target. Never pass -Apply until the plan and generated SharePoint paths have been reviewed.
Runtime configuration
Variable | Purpose |
INDEX_BACKEND | auto, postgres, or sqlite |
DATABASE_URL | PostgreSQL URL outside a service binding |
DATABASE_SCHEMA | Server-side schema; default sharepoint_mcp |
INDEX_DB_PATH | SQLite path when using the local fallback |
EMBEDDING_MODEL | Hugging Face model name or local model directory |
SHAREPOINT_LIBRARY_VIEW_URL | Optional AllItems.aspx URL used for folder links |
MCP_BASE_URL | Public HTTPS server base URL without a trailing slash |
OIDC_CONFIG_URL | HTTPS OIDC discovery URL |
OIDC_CLIENT_ID | OIDC client identifier |
OIDC_CLIENT_SECRET | OIDC secret; never commit it |
OIDC_AUDIENCE | Optional token audience override |
MCP_USAGE_HASH_SALT | Long random secret used to pseudonymize subjects |
MCP_USAGE_RETENTION_DAYS | Optional aggregate usage retention period |
MCP_USAGE_MONITORING_DISABLED | Set to 1 to disable database monitoring |
MCP_AUTH_DISABLED | Local development only; disables authentication |
MCP_AUTH_DISABLED is rejected on Cloud Foundry unless MCP_ALLOW_INSECURE_CF=1 is also set. Do not use that override for an internet-accessible deployment.
Authentication limitation
With FastMCP 2.12.5, the PostgreSQL key/value adapter persists dynamic client registrations. Authorization transactions, authorization codes, and some refresh-token bookkeeping still live in process memory. Existing clients must therefore be tested across restarts; complete restart-transparent OAuth state is not guaranteed by this version.
Usage monitoring and privacy
Monitoring stores daily aggregate tool and HTTP counts plus hashed OIDC subject IDs. It does not store prompts, query text, file paths, e-mail addresses, IP addresses, or tokens. Reports are deliberately not MCP tools. CF operators can retrieve them through:
.\tools\get_usage_metrics.ps1 -Days 7Use a secret, installation-specific MCP_USAGE_HASH_SALT and define an appropriate retention period for your organization.
Testing
The default suite is offline and never connects to PostgreSQL or downloads a model:
python -m ruff check .
python -m compileall -q indexer mcp_server tools tests
python -m pytestThe included suite uses test doubles and temporary SQLite databases; it does not connect to PostgreSQL. Run database integration checks only against an explicitly disposable database, never production. Model quality is outside the unit-test boundary; run a manual smoke test after downloading the configured model.
Backup and recovery
Back up PostgreSQL according to your provider's policy. The search index is derived data and can be rebuilt from the synchronized source folder. Keep source mapping and embedding configuration with operational documentation, but never store secrets there.
License
Licensed under the Apache License, Version 2.0. See LICENSE.
SharePoint, Microsoft, SAP, SAP BTP, Joule, and other product names are trademarks of their respective owners. Their mention describes compatible systems and does not imply endorsement.
This server cannot be deployed
Maintenance
Related MCP Connectors
The Needle MCP server enables semantic search on documents stored in files like PDFs, DOCX, and XLSX by connecting AI applications to external data sources. It provides capabilities to create and manage document collections, perform natural language searches on stored content, and retrieve relevant information without requiring exact keyword matches.
Make your knowledge agent-ready. One MCP endpoint, 5 connectors, 3 search modes.
Personal knowledge base MCP server with semantic search, auto-categorization, metadata extraction
Agent-driven search: build, import, tune, search, and score result quality — all over MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceTransforms PDF collections into a searchable knowledge base using TF-IDF indexing and proximity matching. It enables users to search documents, retrieve specific page content, and manage document libraries through natural language via MCP clients.5-
- AlicenseNot gradedqualityDmaintenanceEnables querying enterprise documents (DOCX, PDF, PPTX) using natural language, with hybrid search and MCP integration for Claude Desktop and other agents.MIT
- FlicenseNot gradedqualityDmaintenanceEnables semantic search and AI-powered Q&A over ingested GitHub documentation repositories via MCP tools.-
- AlicenseNot gradedqualityCmaintenanceEnables document ingestion, semantic search, and retrieval-augmented generation via MCP tools and REST API, using vector embeddings and intelligent chunking.MIT