freshcrate
Skin:/
Home > MCP Servers > obsidian-local-llm-hub

obsidian-local-llm-hub

All-in-one local AI hub for Obsidian โ€” LLM chat with vault tools, MCP servers, RAG, workflow automation, encryption, and edit history. Fully private, no cloud required.

Why this rank:Strong adoptionRecent releaseHealthy release cadence

Description

All-in-one local AI hub for Obsidian โ€” LLM chat with vault tools, MCP servers, RAG, workflow automation, encryption, and edit history. Fully private, no cloud required.

README

Local LLM Hub for Obsidian

Your company's security policy blocks cloud APIs. But you refuse to give up AI-powered note automation.

Local LLM Hub brings the full power of Gemini Helper's workflow automation, RAG, MCP integration, and agent skills to a completely local environment. Ollama, LM Studio, vLLM, or AnythingLLM โ€” your data never leaves your machine.

Workflow Execution


Why Local?

Every byte stays on your machine. No API keys sent to the cloud. No vault contents uploaded anywhere. This isn't a privacy "option" โ€” it's the architecture.

What Where it stays
Chat history Markdown files in your vault
RAG index Local embeddings in workspace folder
LLM requests localhost only (Ollama / LM Studio / vLLM / AnythingLLM)
MCP servers Local child processes via stdio
Encrypted files Encrypted/decrypted locally
Edit history In-memory (cleared on restart)

If you use Gemini Helper at home but need something for work โ€” this is it. Same workflow engine, same UX, zero cloud dependency.


Workflow Automation โ€” The Core Feature

Describe what you want in plain language. The AI builds the workflow. No YAML knowledge required.

Create Workflows & Skills with AI

Create Workflow with AI

  1. Open the Workflow / skill tab
  2. Click Create workflow with AI (or Create skill with AI for an agent skill)
  3. Describe: "Convert the current page into an infographic and save it"
  4. Click Generate
  5. The AI produces a plain-language plan first โ€” review it and click OK to proceed, Re-plan to give feedback and regenerate the plan, or Cancel to abort
  6. After generation, the AI runs a review over the result. If issues are found you can OK (with a confirmation prompt), Refine (regenerate using the review feedback), or Cancel. Clean reviews proceed automatically
  7. If the LLM produces invalid YAML, the plugin automatically re-prompts it with the parse error (up to 2 retries) before surfacing a recoverable failure view with the raw output
  8. The workflow is saved once you accept the final preview

Don't have a powerful local model? Click Copy Prompt, paste into Claude/GPT/Gemini, paste the response back, and click Apply.

Create Skill with External LLM

Create workflow / skill from any file:

When opening the Workflow / skill tab with a file that has no workflow code block, separate Create workflow with AI and Create skill with AI buttons are displayed. The header of an active SKILL.md also exposes Create skill with AI alongside Modify skill with AI so you can spin up a new skill without leaving the panel.

Modify with AI

Load any workflow, click AI Modify, describe the change. The same plan โ†’ generate โ†’ review flow runs. You can Refine the review result as many times as you want; each Refine triggers a new generation pass and a fresh review so the review always matches the final YAML. Reference execution history to debug failures.

Modify Skill with AI: When the active file is a SKILL.md, the Workflow / skill tab shows a Modify skill with AI button. It updates the SKILL.md instructions body and the referenced workflow file in a single pass, preserving the skill's frontmatter (name, description, workflow entries).

Modify Workflow with AI

Visual Node Editor

23 node types across 12 categories:

Category Nodes
Variables variable, set
Control if, while
LLM command
Data http, json
Notes note, note-read, note-search, note-list, folder-list, open
Files file-explorer, file-save
Prompts prompt-file, prompt-selection, dialog
Composition workflow (sub-workflows)
RAG rag-sync
Script script (sandboxed JavaScript)
External obsidian-command
Utility sleep

Workflow Panel

Event Triggers & Hotkeys

  • Event triggers โ€” auto-run workflows on file create / modify / delete / rename / open
  • Hotkey support โ€” assign keyboard shortcuts to any named workflow
  • Execution history โ€” review past runs with step-by-step details

See WORKFLOW_NODES.md for the complete node reference.


AI Chat

Streaming chat with your local LLM. Thinking display, file attachments, @ mentions for vault notes, multiple sessions.

Chat with RAG

Vault Tools (Function Calling)

Models with function calling support (Qwen, Llama 3.1+, Mistral) can directly interact with your vault:

read_note ยท create_note ยท update_note ยท rename_note ยท create_folder ยท search_notes ยท list_notes ยท list_folders ยท get_active_note ยท propose_edit ยท execute_javascript

Three modes โ€” All, No Search, Off โ€” selectable from the input area.

Tool Settings

MCP Servers

Connect local MCP servers to extend the AI with external tools. MCP tools are merged with vault tools and routed via function calling โ€” all running as local child processes.

Chat with MCP

RAG (Local Embeddings)

Index your vault with a local embedding model (e.g. nomic-embed-text). Relevant notes and PDFs are automatically included as context. PDF text is extracted via PDF.js and chunked alongside Markdown files. Everything computed and stored locally.

RAG Search

A dedicated search interface for semantic vector search with keyword filtering, chunk editing, and AI-powered refinement.

RAG Search

  • Keyword filter โ€” Narrow semantic search results by text or file path
  • Chunk editor โ€” Edit result text, load adjacent chunks with automatic overlap removal
  • AI refine โ€” Automatically expand context and clean up text using your local LLM

See RAG_SEARCH.md for details.

Agent Skills

Inject reusable instructions into the system prompt via SKILL.md files. Activate per conversation. Skills can also expose workflows that the AI can invoke as tools during chat.

Create skills the same way as workflows โ€” click Create skill with AI in the Workflow / skill tab and describe what you want. The AI generates both the SKILL.md instructions and the workflow. To edit an existing skill, open its SKILL.md and click Modify skill with AI in the Workflow / skill tab โ€” the AI updates both the instructions body and the referenced workflow together.

Clickable skill chips: Active skill chips in the chat input area and on assistant messages are clickable and jump to the matching SKILL.md (built-in skills are shown as static labels).

Workflow error recovery: If a skill workflow fails during a chat, the failing tool call shows an Open workflow button. Clicking it opens the workflow file and switches to the Workflow / skill tab so you can immediately edit and re-run. Use Modify workflow with AI together with Reference execution history to let the AI fix the failing step.

Agent Skills

See SKILLS.md for details.

Slash Commands & Compact History

  • Custom prompt templates triggered by /
  • /compact to compress long conversations while preserving context

File Encryption

Password-protect sensitive notes. Encrypted files are invisible to AI chat tools but accessible to workflows with password prompt โ€” ideal for storing API keys or credentials.

Edit History

Automatic tracking of AI-made changes with diff view and one-click restore.


Setup

Requirements

Quick Start

  1. Install and start your LLM server
  2. Open plugin settings โ†’ select framework (Ollama / LM Studio / vLLM / AnythingLLM)
  3. Set the server URL (defaults pre-filled)
  4. Fetch and select your chat model
  5. Click Verify connection

LLM Settings

RAG Setup

  1. Enable RAG in settings
  2. Fetch and select the embedding model
  3. Configure target folders (optional โ€” defaults to entire vault)
  4. Click Sync to build the index

RAG Settings

MCP Server Setup

  1. Settings โ†’ MCP servers โ†’ Add server
  2. Configure: name, command (e.g. npx), arguments, optional env vars
  3. Toggle on โ€” connects automatically via stdio

MCP & Encryption Settings

Workspace Settings

Workspace Settings

Supported Frameworks

Framework Chat Endpoint Streaming Thinking Function Calling
Ollama /api/chat (native) Real-time message.thinking field tools parameter
LM Studio (OpenAI compatible) /v1/chat/completions SSE <think> tags tools parameter
vLLM /v1/chat/completions SSE <think> tags tools parameter
AnythingLLM /v1/openai/chat/completions SSE <think> tags tools parameter

Using Cloud LLMs (OpenAI, Gemini, etc.)

The "LM Studio (OpenAI compatible)" framework works with any OpenAI-compatible API endpoint, including cloud services:

Service Base URL API Key
OpenAI https://api.openai.com Your OpenAI API key
Google Gemini https://generativelanguage.googleapis.com/v1beta/openai Your Gemini API key

RAG with cloud LLMs: Cloud LLMs cannot use local embedding models directly. To use RAG, configure the Embedding server URL in RAG settings to point to a local Ollama instance (e.g. http://localhost:11434) and select an embedding model like nomic-embed-text.


Installation

BRAT (Recommended)

  1. Install BRAT plugin
  2. Open BRAT settings โ†’ "Add Beta plugin"
  3. Enter: https://github.com/takeshy/obsidian-local-llm-hub
  4. Enable the plugin in Community plugins settings

Manual

  1. Download main.js, manifest.json, styles.css from releases
  2. Create local-llm-hub folder in .obsidian/plugins/
  3. Copy files and enable in Obsidian settings

From Source

git clone https://github.com/takeshy/obsidian-local-llm-hub
cd obsidian-local-llm-hub
npm install
npm run build

Gemini Helper ใจใฎ้–ขไฟ‚ / Relationship to Gemini Helper

This plugin is the local-only sibling of obsidian-gemini-helper. Same workflow engine, same UX patterns, but designed for environments where cloud APIs are not an option.

Gemini Helper Local LLM Hub
LLM Backend Google Gemini API / CLI Ollama / LM Studio / vLLM / AnythingLLM / OpenAI-compatible APIs
Data destination Google servers localhost only
Workflow engine โœ… โœ… (same architecture)
RAG Google File Search Local embeddings
MCP โœ… โœ… (stdio only)
Agent Skills โœ… โœ…
Image generation โœ… (Gemini) โ€”
Web search โœ… (Google) โ€”
Cost Free / Pay-per-use Free forever (your hardware)

Choose Gemini Helper when you want cutting-edge cloud models. Choose Local LLM Hub when privacy is non-negotiable.

Release History

VersionChangesUrgencyDate
0.13.2### Combined RAG - Restrict source candidates for **Combine internal** RAG settings. - Only standalone internal RAG settings with the same effective embedding server URL and embedding model can now be selected together. - This prevents accidentally combining indexes built with incompatible embedding configurations.High5/30/2026
0.12.9## Fixed - Fixed UI and workflow failures caused by using Obsidianโ€™s createEl / createDiv / createSpan helpers on activeDocument. - Replaced those calls with activeDocument.createElement(...) to avoid invalid direct append operations on Document. ## New Contributors Thanks to @OlivierLmr for their first contribution in #10, which fixed workflow and modal UI rendering issues related to `activeDocument` element creation.High5/27/2026
0.12.8### Fixed - Removed the bundled React DOM 19 code path that triggered Obsidian's dynamic `<script>` element scanner warning. - Downgraded `react` and `react-dom` to React 18. - Kept existing React view mounting behavior via `createRoot`. - Confirmed the production bundle no longer contains `createElement("script")`.High5/19/2026
0.12.6### Fixed - Added GitHub artifact attestations for release assets. - Release workflow now generates provenance attestations for: - `main.js` - `manifest.json` - `styles.css` ### Changed - Updated release workflow permissions to allow OIDC and artifact attestation generation.High5/13/2026
0.12.4### Changed - Addressed Obsidian plugin review findings across source and UI code. - Improved popout window compatibility by using `activeWindow` / `activeDocument` where appropriate. - Replaced direct static style assignments with CSS classes for better theming and maintainability. - Replaced deprecated UTF-8 base64 handling with `TextEncoder` / `TextDecoder`. - Removed the unused `builtin-modules` development dependency.High5/12/2026
0.12.3 ### Improved - Vault tools now support text-based vault files beyond Markdown, including `.canvas`, `.json`, `.txt`, `.csv`, `.yaml`, `.yml`,`.svg`, `.html`, `.xml`, `.css`, `.js`, `.ts`, and `.tsx`. - `create_note`, `read_note`, `propose_edit`, `rename_note`, `list_notes`, and `search_notes` can now work with supported non- Markdown files such as Obsidian Canvas files. - When no extension is provided, vault tools continue to default to `.md` for compatibility with existing note workflows. High4/29/2026
0.12.2## New Features - Clickable tool tags in chat โ€” Tool names shown under "Tools used" (read_note, create_note, update_note, propose_edit, rename_note, get_active_note) are now clickable and open the referenced note directly. Tools that don't target a specific note (search_notes, list_notes, MCP tools, etc.) show their argument details in a Notice on clickHigh4/16/2026
0.12.1๐Ÿ› Bug Fixes @-mention resolution now handles all vault file paths Fixed a class of bugs where mentioning a note via ๏ผ path in Chat or the AI Workflow modal silently failed or produced wrong results. ### What was broken - Paths with spaces โ€” @My Notes/Daily.md resolved only My and left the rest as literal text. - Unicode paths โ€” @ใƒกใƒข/ๆ—ฅๆœฌ่ชž.md often failed to match depending on surrounding characters. - Regex-special characters โ€” paths containing (, ), +, ., [, etc. were silently truncaHigh4/15/2026
0.12.0## ๐Ÿ”ง 1 File = 1 Workflow โ€” breaking change Each `.md` file now holds **exactly one** workflow code block. The name inside the workflow YAML is no longer an addressable identifier โ€” a workflow is identified by its file path, period. ### What breaks - **Multi-block files become read-only.** Opening a file with โ‰ฅ2 workflow blocks shows an error banner with a new **Split into individual files** button that migrates blocks 2..N into sibling files (block 1 stays in place). - **Sub-workflow High4/15/2026
0.10.2 ## โœจ Confirm Modal Overhaul ### Rich diff view - **Unified / Split view toggle** - **Word-level highlighting** โ€” changed parts are highlighted per word - **Per-line comments** โ€” click any line to attach a comment; comments are sent to the LLM as structured feedback (`Line 12 (+): <content>\nComment: ...`) when you click "Request changes" ### Skill-modify visibility - **SKILL.md instructions diff now shown** alongside the YAML diff when modifying a skill. Previously only thHigh4/13/2026
0.10.0## โœจ New Features ### AI Workflow / Skill Generation Overhaul - **Three-phase pipeline** (Plan โ†’ Generate โ†’ Review) for better quality - Plan: plain-language plan shown first (OK / Re-plan / Cancel) - Review: auto-review after generation; pick OK (with confirmation) / Refine / Cancel - Refine feeds review feedback back to the LLM for another pass - **Split Create buttons**: dedicated "Create workflow with AI" and "Create skill with AI" entry points - **Modify skill with AI**: whenMedium4/12/2026
0.9.5- Chat view restores previous thread โ€” Reopening the Chat view within the same Obsidian session now automatically restores the last active conversation. No more losing your place when switching between tabs. High4/11/2026
0.9.4## Bug fix - Fix PDF page offset calculation โ€” Empty pages in PDFs no longer cause incorrect page labels. Previously, pages with no extractable text would cause all subsequent pages to share the same offset, leading to inaccurate pages X-Y of N labels in search results.Medium4/10/2026
0.9.3## PDF support for RAG indexing and search PDF files in your vault are now automatically indexed alongside Markdown files. Text is extracted using Obsidian's built-in PDF.js, chunked, and embedded just like regular notes. - PDF indexing โ€” PDF text extraction and embedding during RAG sync - Page tracking โ€” Each chunk stores its page range (e.g. "pages 2-5 of 24"), displayed as a badge in search results - PDF preview โ€” Switch between extracted text view and PDF page preview per result - RMedium4/10/2026
0.9.2## Bug fix: plugin update now works correctly ### Fixes - Fixed missing `version` field in `manifest.json` that prevented Obsidian from detecting and applying updates (#8) - Cleaned up invalid entries in `versions.json` ### Prevention - `version-bump.mjs` now falls back to reading `package.json` when `npm_package_version` is not set - Added `manifest.json` version validation step to CI (build & release workflows) ### Upgrade note - **From 0.8.0 or earlier:** update to 0.9.2 should work norMedium4/9/2026
0.9.1## RAG Search: Multi-field keyword filter with AI suggestion ### Multi-field AND/OR keyword filter - Keyword filter now supports multiple fields - Within a field: space-separated terms use OR logic (any term matches) - Between fields: AND logic (all fields must match) - Click + AND to add a filter field, โœ• to remove ### AI keyword suggestion - Each filter field has a โœฆ (sparkle) button - Uses the configured AI refine model to expand keywords with synonyms and relaHigh4/8/2026
0.9.0## RAG Search enhancements ### Keyword Filter - Search results can now be narrowed down by keyword (space-separated AND logic) - Matches against both chunk text and file path - "Select all" and result count reflect the filtered view ### Chunk Editor - Click the pencil icon on an expanded result to open the chunk editor modal - Load previous/next chunks from the same file with automatic overlap removal - Edited results show an "Edited" badge and accent border in the results list Medium4/8/2026
0.8.0## New Features - Built-in Obsidian Skills - Three built-in skills that teach the LLM about Obsidian-specific file formats - obsidian-markdown - Wikilinks, embeds, callouts, properties, and other Obsidian Flavored Markdown syntax - json-canvas - Creating and editing .canvas files with nodes, edges, and groups - obsidian-bases - Creating and editing .base files with views, filters, formulas, and summaries - Built-in skills are shown with a "built-in" badge in the skill dropdownMedium4/3/2026
0.7.1Fix: sentence case lint error in placeholder text Medium3/31/2026
0.7.0## RAG Search Tab โ€” Index Settings Panel Added an index settings panel (gear icon) to the RAG Search tab. - Adjust Chunk Size and Chunk Overlap via sliders directly from the search tab - Edit Target Folders and Excluded Patterns without leaving the search UI - Sync button with cancel support โ€” rebuild the index without navigating to plugin settings - Last synced timestamp display - Indexed files list accordion with per-file chunk counts - Changing chunk size or overlap nowMedium3/31/2026
0.6.0## New: RAG Search tab A dedicated RAG Search tab has been added between Chat and Workflow, enabling standalone semantic search across your indexed vault notes. ### Features - RAG setting selector โ€” Choose which named RAG setting to search against - Adjustable parameters โ€” Override Top K and minimum score threshold per search - Result list with preview โ€” Each result shows file path, relevance score (%), and expandable text preview - Batch selection โ€” Select all / individual results wMedium3/30/2026
0.5.0## Multiple Named RAG Settings You can now create and manage multiple RAG settings. Configure different embedding models, chunk sizes, target folders, and more for each setting, and switch between them on the fly. ### Key Changes: - Multiple RAG settings โ€” Create, rename, and delete named RAG settings from the settings page - RAG selector in chat โ€” A dropdown next to the model selector lets you choose which RAG setting to use per conversation - External index toggle โ€” Replaced tMedium3/23/2026
0.3.2## Improvements - Renamed framework label to "LM Studio (OpenAI compatible)" to clarify it works with any OpenAI-compatible API endpoint - Embedding model fetch now filters by name pattern, excluding non-embedding models ## Documentation - Added cloud LLM setup guide (OpenAI, Google Gemini) with RAG configuration instructions Low3/18/2026
0.3.0## Breaking Change - Renamed workflow code block language from ```workflow to ```llm-workflow - Existing ```workflow blocks can still be read and executed - New and saved workflows will use ```llm-workflow ## Bug Fixes - Fixed inability to enable this plugin alongside Gemini Helper - Both plugins registered a code block processor for the workflow language, causing the second one to fail on load Low3/18/2026
0.2.12 ## Bug fixes - Fix chat terminating immediately when using tools (Vault/MCP) with AnythingLLM - AnythingLLM's OpenAI-compatible endpoint does not support the tools parameter โ€” sending it caused the server to return an internal chat ID instead of LLM output - Tools are now automatically disabled for AnythingLLM with a notice shown to the user - Fix pending tool calls lost on stream end - When a stream ended without a [DONE] marker, accumulated tool calls were silentlLow3/15/2026
0.2.11## New Features - vLLM support: Added vLLM as a selectable LLM framework with default URL http://localhost:8000 - Separate embedding server URL: RAG settings now allow specifying a dedicated embedding server URL, independent from the LLM server - Event-triggered workflows: Workflows can be automatically triggered by vault events (create, modify, delete, rename, file-open) with built-in event variables (_eventType, _eventFilePath, _eventFile, _eventFileContent, _eventOldPath) ## ImprovemeLow3/15/2026
0.2.9## Bug Fixes - Fix Mermaid diagram rendering on mobile: Fixed an issue where workflow Mermaid diagrams failed to render on mobile. Mermaid's \<br\> tags inside foreignObject caused strict XML parsing to fail in mobile WebView. Switched to HTML parsing to tolerate HTML void elements.Low3/13/2026
0.2.8## Bug fixes - Fix streaming stalls โ€” Replaced the stream signaling mechanism with a robust version-counter pattern (StreamSignal) that prevents lost notifications between Node.js event callbacks and the async generator. Added a 2-minute idle timeout so stalled connections are detected and reported as errors instead of hanging indefinitely. ## Changes - Workspace folder is now fixed โ€” The workspace folder name (LocalLlmHub) is no longer configurable and is treated as a constant, consiLow3/11/2026
0.2.7## Changes - Workspace folder is now fixed โ€” The workspace folder name (LocalLlmHub) is no longer configurable and is treated as a constant, consistent with the skills and workflows folders. The setting has been removed from the settings UI. Existing saved settings will be automatically migrated. - Fix sentence case for UI text โ€” Addressed Obsidian plugin review feedback for sentence case compliance in settings labels. ## Migration notes - If you had customized the workspace foldLow3/11/2026
0.2.6## Bug Fixes - Mermaid diagram: Fix parse error when workflow nodes target "end" (Mermaid reserved word) โ€” now routes to FINISH node with display label kept as "โ–  END" - Clipboard copy: Replace deprecated document.execCommand("copy") with ClipboardItem API fallback - SVG rendering: Use DOMParser instead of direct innerHTML assignment for Mermaid diagram rendering, with parse error handling - Code quality: Remove eslint-disable for @typescript-eslint/no-explicit-any by using typed Low3/11/2026
0.2.5## Bug Fixes - Mermaid diagram: Fix parse error when workflow nodes target "end" (Mermaid reserved word) โ€” now routes to FINISH node with display label kept as "โ–  END" - Clipboard copy: Replace deprecated document.execCommand("copy") with ClipboardItem API fallback - SVG rendering: Use DOMParser instead of direct innerHTML assignment for Mermaid diagram rendering, with parse error handling - Code quality: Remove eslint-disable for @typescript-eslint/no-explicit-any by using typed Low3/11/2026
0.2.4## New Feature - rag-sync: single file sync โ€” The rag-sync workflow node now supports syncing a single file when path is specified, making it significantly faster for event-triggered workflows. Use oldPath to handle file renames. Omitting path falls back to a full sync. Unchanged files are automatically skipped via checksum comparison. ``` - id: sync type: rag-sync path: "{{__eventFilePath__}}" saveTo: syncResult ``` ## Documentation - Add AnythingLLM as a supporLow3/11/2026
0.2.3## Changes - Fixed skills/workflows folder paths โ€” skills and workflows folders are now fixed constants instead of configurable settings. The skills folder setting has been removed from the settings UI. - File explorer icons โ€” ๐Ÿงฉ and โšก emoji icons are now shown before the skills and workflows folders in Obsidian's file explorer.Low3/11/2026
0.2.2## Changes - Add AnythingLLM support (OpenAI-compatible API with /v1/openai path prefix) - Fix SSE streaming bug where empty `usage: {}` caused premature stream termination - Fix embedding model settings UI (remove redundant text input, add placeholder) - LLM Modal: re-render on framework change, AnythingLLM-specific API key description **Full Changelog**: https://github.com/takeshy/obsidian-local-llm-hub/compare/0.2.1...0.2.2Low3/11/2026
0.2.1## Fixes - Fix release tag format for Obsidian community plugin submission (remove v prefix) Low3/10/2026
v0.2.0initial releaseLow3/10/2026

Dependencies & License Audit

Loading dependencies...

Similar Packages

fast-rlmImplement Recursive Language Models using Deno and Pyodide to enable scalable, code-driven prompt processing with modular sub-agent calls.main@2026-06-02
opencode_webui_cli๐Ÿ’ป Build and manage projects efficiently with the OpenCode Web UI CLI, featuring a chat interface, file previews, and model selection.main@2026-06-01
vobaseThe app framework built for AI coding agents. Own every line. Your AI already knows how to build on it.@vobase/template@3.18.0
chronosChronos is visual AI agent builder - tailored for self-hosted deployments and observabilityv1.8.2
anything-llmThe all-in-one AI productivity accelerator. On device and privacy first with no annoying setup or configuration.v1.13.0

More in MCP Servers

claude-plugins-officialOfficial, Anthropic-managed directory of high quality Claude Code Plugins.
langchain4jLangChain4j is an open-source Java library that simplifies the integration of LLMs into Java applications through a unified API, providing access to popular LLMs and vector databases. It makes impleme
hyperframesWrite HTML. Render video. Built for agents.
ms-365-mcp-serverA Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API