I’ve just published an MCP server that turns Merill & Joshua’s weekly Entra News newsletter into a searchable knowledge base you can query directly from tools like Claude Desktop, Cursor, and any MCP‑capable host. I built it because I found myself often searching for something I’d read in the weekly newsletter. But which issue, what was the title?
What is it?
Entra News is a high‑signal, curated weekly digest of Microsoft Entra news, features, and community tools, published since mid‑2023. The MCP server wraps the full public archive and exposes it via a set of tools you can call from your AI assistant.
Under the hood, it downloads a compact SQLite database (around 15–20 MB) that’s kept up to date via a GitHub Actions workflow, so you don’t need to run or host anything yourself.
The server currently exposes four tools:
- search_entra_news – Hybrid semantic + keyword search across all issues, returning sourced excerpts.
- get_issue – Pull the full content of a specific issue by number or date.
- list_issues – Browse the archive, optionally filtered by year and month.
- find_tool_mentions – Discover community tools and GitHub projects that have been featured.
A typical flow is:
- ask a natural language question,
- get back citations,
- then pivot into a specific issue or tool for deeper context.
Why I built it
A lot of Entra‑specific “what changed, when, and where was that announced?” knowledge ends up locked inside people’s inboxes or buried in past Entra News issues. I wanted a lightweight, zero‑infrastructure way to bring that archive into my AI workflows so I can:
- Ask targeted questions like “What did Entra News cover about Conditional Access in 2024?” or “Has Verified ID been covered recently?” and get precise, sourced answers
- Quickly list all issues for a given time period when I’m reconstructing a change timeline (for example, “List all new features from 2024”)
- Discover community tools and GitHub projects that have been highlighted over time using find_tool_mentions
Building this as an MCP server makes it easy to plug into multiple hosts (Claude Desktop, Cursor, Copilot Studio, etc.) without per‑user APIs, hosting, or scheduled jobs.
How it works
At a high level, the architecture looks like this:
- A Node.js ingestion script pulls content from the public Entra News Substack API (entra.news/api/v1/posts)
- Content is embedded using OpenAI’s text-embedding-3-small model and stored in a SQLite database with sqlite-vec plus FTS5 for hybrid semantic/keyword search
- The database is published as a GitHub Release asset and updated weekly by a GitHub Actions workflow that runs every Sunday
- When you run the MCP server via npx, it downloads the latest database on first run, caches it locally, and checks for updates once a week
Local Cache behaviour
On first launch, the MCP server downloads the database and caches it locally:
- Windows: %USERPROFILE%.entra-news-mcp\
- macOS / Linux:
~/.entra-news-mcp/
The server checks for a new database release once a week. To force an immediate refresh (for example, after a new issue has been ingested), you can delete the cache directory and restart your MCP host.
Getting Started
Claude Desktop
Add the MCP server to your Claude Desktop configuration file (claude_desktop_config.json)
{
"mcpServers": {
"entra-news-mcp": {
"command": "npx",
"args": [
"entra-news-mcp"
]
}
}
}
Restart Claude Desktop and the database will download on first use.
Cursor, Copilot Studio, and other MCP hosts
{
"mcpServers": {
"entra-news-mcp": {
"command": "npx",
"args": [
"-y",
"entra-news-mcp"
]
}
}
}
Optional: enable semantic search
Keyword search (BM25 via FTS5) works out of the box, but you can enable higher‑quality semantic search by setting your OpenAI API key in the MCP server configuration.
{
"mcpServers": {
"entra-news-mcp": {
"command": "npx",
"args": [
"entra-news-mcp"
],
"env": {
"OPENAI_API_KEY": "sk-..."
}
}
}
}
Once that’s set, the server uses hybrid semantic + keyword search to improve result quality.
You can find the code and full README here:
Huge thanks to Merill and Joshua for a fantastic resource.


